Merge branch 'develop' into feature/embed-stone
# Conflicts: # Assets/Scripts/CECHostPlayer.cs
This commit is contained in:
@@ -15,7 +15,7 @@ MonoBehaviour:
|
||||
m_DefaultGroup: 712e3991f28e549e7a56ee582a977810
|
||||
m_currentHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
Hash: f31c7227b70701eab297439e808bd57d
|
||||
m_OptimizeCatalogSize: 0
|
||||
m_BuildRemoteCatalog: 0
|
||||
m_CatalogRequestsTimeout: 0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using BrewMonster.abase;
|
||||
using CSNetwork.GPDataType;
|
||||
public static class generate_item_temp
|
||||
{
|
||||
public static int generate_weapon<RAND_CLASS>(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls,
|
||||
@@ -608,7 +609,347 @@ public static class generate_item_temp
|
||||
itemdataman.set_to_classid(DATA_TYPE.DT_TASKNORMALMATTER_ESSENCE, data, -1);
|
||||
return 0;
|
||||
}
|
||||
public static int generate_medicine<RAND_CLASS>(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;
|
||||
int i=0;
|
||||
object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype);
|
||||
if(obj == null || datatype != DATA_TYPE.DT_MEDICINE_ESSENCE)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
MEDICINE_ESSENCE ess = (MEDICINE_ESSENCE)obj;
|
||||
|
||||
size = (uint)(Marshal.SizeOf(typeof(item_data)));
|
||||
switch(ess.id_major_type)
|
||||
{
|
||||
case 1794: // ��Ѫ����
|
||||
case 1802: // ��ħ����
|
||||
case 1810: // ��Ѫ��ħ����
|
||||
size += (uint)(Marshal.SizeOf(typeof(uint)) + Marshal.SizeOf(typeof(uint)) + Marshal.SizeOf(typeof(uint)) + Marshal.SizeOf(typeof(int)));
|
||||
break;
|
||||
case 1815: // �ⶾҩ
|
||||
case 2038: // ˲��ⶾҩ
|
||||
size += sizeof(int) + sizeof(int);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
data = new byte[size];
|
||||
int offset = 0;
|
||||
WriteUInt(data, ref offset, id); //��Ʒ��ģ��ID
|
||||
WriteUInt(data, ref offset, 1); //��Ʒ������
|
||||
WriteInt(data, ref offset, ess.pile_num_max); //��Ʒ�Ķѵ�����
|
||||
WriteInt(data, ref offset, 0); //��Ʒ�Ŀ�װ����־
|
||||
WriteUInt(data, ref offset, ess.proc_type); //��Ʒ�Ĵ�����ʽ
|
||||
WriteInt(data, ref offset, (int)DATA_TYPE.DT_MEDICINE_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);
|
||||
|
||||
switch(ess.id_major_type)
|
||||
{
|
||||
case 1794: // ��Ѫ����
|
||||
if(ess.cool_time < 1000) ess.cool_time *= 100;
|
||||
WriteInt(data, ref offset, ess.hp_add_total);
|
||||
WriteInt(data, ref offset, ess.hp_add_time);
|
||||
WriteInt(data, ref offset, ess.cool_time);
|
||||
WriteInt(data, ref offset, ess.require_level);
|
||||
break;
|
||||
case 1802: // ��ħ����
|
||||
if(ess.cool_time < 1000) ess.cool_time *= 100;
|
||||
WriteInt(data, ref offset, ess.mp_add_total);
|
||||
WriteInt(data, ref offset, ess.mp_add_time);
|
||||
WriteInt(data, ref offset, ess.cool_time);
|
||||
WriteInt(data, ref offset, ess.require_level);
|
||||
break;
|
||||
case 1810: // ��Ѫ��ħ����
|
||||
if(ess.cool_time < 1000) ess.cool_time *= 100;
|
||||
WriteInt(data, ref offset, ess.mp_add_total);
|
||||
WriteInt(data, ref offset, ess.hp_add_total);
|
||||
WriteInt(data, ref offset, ess.cool_time);
|
||||
WriteInt(data, ref offset, ess.require_level);
|
||||
break;
|
||||
case 1815: // �ⶾҩ
|
||||
case 2038: // ˲��ⶾҩ
|
||||
if(ess.cool_time < 1000) ess.cool_time *= 100;
|
||||
WriteInt(data, ref offset, ess.cool_time);
|
||||
WriteInt(data, ref offset, ess.require_level);
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
itemdataman.set_to_classid(DATA_TYPE.DT_MEDICINE_ESSENCE, data, (int)ess.id_major_type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
public static int generate_material<RAND_CLASS>(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls)
|
||||
{
|
||||
DATA_TYPE datatype = DATA_TYPE.DT_INVALID;
|
||||
object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype);
|
||||
data = new byte[0];
|
||||
size = 0;
|
||||
if(obj == null || datatype != DATA_TYPE.DT_MATERIAL_ESSENCE)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
MATERIAL_ESSENCE ess = (MATERIAL_ESSENCE)obj;
|
||||
size = (uint)(Marshal.SizeOf(typeof(item_data)));
|
||||
data = new byte[size];
|
||||
int offset = 0;
|
||||
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);
|
||||
}
|
||||
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);
|
||||
|
||||
itemdataman.set_to_classid(DATA_TYPE.DT_MATERIAL_ESSENCE, data, -1);
|
||||
return 0;
|
||||
}
|
||||
public static int generate_skilltome<RAND_CLASS>(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_SKILLTOME_ESSENCE)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
SKILLTOME_ESSENCE ess = (SKILLTOME_ESSENCE)obj;
|
||||
size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(SKILLTOME_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_SKILLTOME_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);
|
||||
|
||||
|
||||
itemdataman.set_to_classid(DATA_TYPE.DT_SKILLTOME_ESSENCE, data, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
public struct PetSkill {
|
||||
public int skill;
|
||||
public int level;
|
||||
}
|
||||
public static int generate_pet_egg<RAND_CLASS>(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_PET_EGG_ESSENCE)
|
||||
return -1;
|
||||
PET_EGG_ESSENCE ess = (PET_EGG_ESSENCE)obj;
|
||||
|
||||
object petessobj = itemdataman._edm.get_data_ptr((uint)ess.id_pet, idspace, ref datatype);
|
||||
if(petessobj == null || datatype != DATA_TYPE.DT_PET_ESSENCE)
|
||||
return -1;
|
||||
PET_ESSENCE petess = (PET_ESSENCE)petessobj;
|
||||
|
||||
size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(PET_EGG_ESSENCE)));
|
||||
|
||||
//������ܵı䳤����
|
||||
|
||||
PetSkill[] skills = new PetSkill[32];
|
||||
int skill_count = 0;
|
||||
int i;
|
||||
for(i = 0; i < 32; i ++)
|
||||
{
|
||||
if(ess.skills[i].id_skill <= 0
|
||||
|| ess.skills[i].level <= 0 ) continue;
|
||||
skills[skill_count].skill = ess.skills[i].id_skill;
|
||||
skills[skill_count].level = ess.skills[i].level;
|
||||
skill_count ++;
|
||||
}
|
||||
|
||||
size += (uint)(Marshal.SizeOf(typeof(int))*2 * skill_count);
|
||||
|
||||
// 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, 0); //��Ʒ�Ŀ�װ����־
|
||||
WriteInt(data, ref offset, (int)ess.proc_type); //��Ʒ�Ĵ�����ʽ
|
||||
WriteInt(data, ref offset, (int)DATA_TYPE.DT_PET_EGG_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, petess.level_require);
|
||||
WriteInt(data, ref offset, (int)(petess.character_combo_id&0xFFFF));
|
||||
WriteInt(data, ref offset, ess.honor_point);
|
||||
WriteInt(data, ref offset, (int)ess.id_pet);
|
||||
WriteInt(data, ref offset, 0);
|
||||
WriteInt(data, ref offset, (int)ess.id);
|
||||
|
||||
int pet_class;
|
||||
switch(petess.id_type)
|
||||
{
|
||||
case 8781: // ���
|
||||
pet_class = 0;
|
||||
break;
|
||||
case 8782: // ս������
|
||||
pet_class = 1;
|
||||
break;
|
||||
case 8783: // ���ͳ���
|
||||
pet_class = 2;
|
||||
break;
|
||||
case 28752: // �ٻ���
|
||||
pet_class = 3;
|
||||
break;
|
||||
case 28913: // ֲ��
|
||||
pet_class = 4;
|
||||
break;
|
||||
default:
|
||||
pet_class = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
WriteInt(data, ref offset, pet_class);
|
||||
WriteShort(data, ref offset, (short)ess.level);
|
||||
WriteShort(data, ref offset, 0);
|
||||
WriteInt(data, ref offset, ess.exp);
|
||||
WriteInt(data, ref offset, ess.skill_point);
|
||||
WriteShort(data, ref offset, 0);
|
||||
WriteShort(data, ref offset, (short)skill_count);
|
||||
Array.Clear(data, offset, 16);
|
||||
offset += 16;
|
||||
|
||||
for(i = 0; i < skill_count; i ++)
|
||||
{
|
||||
WriteInt(data, ref offset, skills[i].skill);
|
||||
WriteInt(data, ref offset, skills[i].level);
|
||||
}
|
||||
if(pet_class == 5)
|
||||
{
|
||||
Array.Clear(data, offset, Marshal.SizeOf(typeof(_evo_prop)));
|
||||
}
|
||||
//ASSERT( (buf - (char*)*data) == (int)size);
|
||||
|
||||
itemdataman.set_to_classid(DATA_TYPE.DT_PET_EGG_ESSENCE, data, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int generate_pet_food<RAND_CLASS>(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_PET_FOOD_ESSENCE)
|
||||
return -1;
|
||||
PET_FOOD_ESSENCE ess = (PET_FOOD_ESSENCE)obj;
|
||||
size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(PET_FOOD_ESSENCE)));
|
||||
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, 0); //��Ʒ�Ŀ�װ����־
|
||||
WriteInt(data, ref offset, (int)ess.proc_type); //��Ʒ�Ĵ�����ʽ
|
||||
WriteInt(data, ref offset, (int)DATA_TYPE.DT_PET_EGG_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);
|
||||
WriteInt(data, ref offset, ess.food_type); //��Ʒ�Ŀ�װ����־
|
||||
WriteInt(data, ref offset, ess.hornor); //��Ʒ��Ӧ�����ID guid
|
||||
|
||||
//ASSERT( (buf - (char*)*data) == (int)size);
|
||||
|
||||
itemdataman.set_to_classid(DATA_TYPE.DT_PET_FOOD_ESSENCE, data, -1);
|
||||
return 0;
|
||||
}
|
||||
#region Write Functions
|
||||
private static void WriteUInt(byte[] buf, ref int offset, uint value)
|
||||
{
|
||||
@@ -718,517 +1059,3 @@ public static class generate_item_temp
|
||||
}
|
||||
}
|
||||
|
||||
#region unimplemented
|
||||
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_projectile(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// PROJECTILE_ESSENCE * ess = (PROJECTILE_ESSENCE *)get_data_ptr(id, idspace, datatype);
|
||||
// if(ess == NULL || datatype != DT_PROJECTILE_ESSENCE) return -1;
|
||||
|
||||
// size = sizeof(item_data) + sizeof(_item_content) + sizeof(_projectile_essence);
|
||||
// // ��
|
||||
// // �̶�addons 4��
|
||||
// char addon_buf[ELEMENTDATAMAN_MAX_NUM_ADDONS*sizeof(_addon)];
|
||||
// unsigned int addon_num = 4; //���Ա���Ŀ����Ŀ�̶� 4
|
||||
|
||||
// size_t addon_size = generate_equipment_addon_buffer_2(DT_PROJECTILE_ESSENCE, (int*)&(ess->id_addon0),sizeof(int), 4, addon_buf,addon_num);
|
||||
// size += addon_size;
|
||||
|
||||
// //����tag size
|
||||
// size += sizeof(short);
|
||||
|
||||
// // allocate the buffer with exact length
|
||||
// *data = (char *)abase::fastalloc(size);
|
||||
// char * buf = *data;
|
||||
|
||||
// *(unsigned int*)buf = id; buf += sizeof(unsigned int); //��Ʒ��ģ��ID
|
||||
// *(size_t*)buf = 1; buf += sizeof(size_t); //��Ʒ������
|
||||
// *(size_t*)buf = ess->pile_num_max; buf += sizeof(size_t); //��Ʒ�Ķѵ�����
|
||||
// *(int*)buf = ELEMENTDATAMAN_EQUIP_MASK_PROJECTILE|(addon_num?0x40000000:0); buf += sizeof(int); //��Ʒ�Ŀ�װ����־
|
||||
// *(int*)buf = ess->proc_type; buf += sizeof(int); //��Ʒ�Ĵ�����ʽ
|
||||
// *(int*)buf = DT_PROJECTILE_ESSENCE; buf += sizeof(int); //��Ʒ��Ӧ�����ID
|
||||
// if(ess->has_guid == 1){
|
||||
// int g1,g2;
|
||||
// get_item_guid(id,g1,g2);
|
||||
// *(int*)buf = g1; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = g2; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// else{
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// *(int*)buf = ess->price; buf += sizeof(int); //��Ʒ�ļ۸�
|
||||
// *(int*)buf = 0; buf += sizeof(int); //����ʱ��
|
||||
// size_t* content_length = (size_t*)buf; buf += sizeof(size_t); //��סbuf��ָ�룬�Ժ�����
|
||||
// char ** item_content = (char **)buf; buf += sizeof(char *); //��סbuf��ָ�룬�Ժ�����
|
||||
// *content_length = (char*)(*data)+size-buf;
|
||||
// *item_content = buf;
|
||||
|
||||
// // prerequisition
|
||||
// char * require_ptr = buf;
|
||||
// //����int����6��
|
||||
// *(short*)buf = 0; buf += sizeof(short); //prerequisition level
|
||||
// *(short*)buf = (short)0xFFFF; buf += sizeof(short);
|
||||
// *(short*)buf = 0; buf += sizeof(short); //prerequisition strength
|
||||
// *(short*)buf = 0; buf += sizeof(short);
|
||||
// *(short*)buf = 0; buf += sizeof(short); //prerequisition agility
|
||||
// *(short*)buf = 0; buf += sizeof(short);
|
||||
|
||||
// *(int*)buf = 1; buf += sizeof(int); //prerequisition durability
|
||||
// *(int*)buf = 1; buf += sizeof(int); //prerequisition max_durability
|
||||
// *(short*)buf = sizeof(_projectile_essence); buf += sizeof(short); //װ�������С���ֽڣ�
|
||||
// *(char*)buf = element_data::IMT_NULL;buf += sizeof(char);
|
||||
// *(char*)buf = 0; buf += sizeof(char);
|
||||
|
||||
// // projectile_essence ����
|
||||
// char * essence_ptr = buf;
|
||||
// *(int*)buf = ess->type; buf += sizeof(int); //��ҩ����
|
||||
// *(int*)buf = ess->damage_enhance; buf += sizeof(int); //��������������
|
||||
// *(int*)buf = ess->damage_scale_enhance; buf += sizeof(int); //���ձ������ӹ�����
|
||||
// *(int*)buf = ess->require_weapon_level_min; buf += sizeof(int); //��Ҫ�����ȼ�
|
||||
// *(int*)buf = ess->require_weapon_level_max; buf += sizeof(int); //��Ҫ�����ȼ�
|
||||
|
||||
// // ��
|
||||
// *(short*)buf = 0; buf += sizeof(short);
|
||||
// *(short*)buf = 0; buf += sizeof(short);
|
||||
|
||||
|
||||
// // addon
|
||||
// *(int*)buf = addon_num; buf += sizeof(int);
|
||||
|
||||
// char * addon_sld = addon_buf;
|
||||
// for(size_t i=0; i<addon_num; i++)
|
||||
// {
|
||||
// int id = *(int*)addon_sld;
|
||||
// addon_update_ess_data(*(addon_data*)addon_sld, essence_ptr, sizeof(_projectile_essence), (prerequisition*)require_ptr);
|
||||
// addon_sld += ((id & 0x6000)>>13)*sizeof(int)+sizeof(int);
|
||||
// }
|
||||
// update_require_data((prerequisition*)require_ptr);
|
||||
// memcpy(buf, addon_buf, addon_size);
|
||||
// set_to_classid(DT_PROJECTILE_ESSENCE, (item_data*)(*data), -1);
|
||||
|
||||
// return 0;
|
||||
// }
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_quiver(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// QUIVER_ESSENCE * ess = (QUIVER_ESSENCE *)get_data_ptr(id, ID_SPACE_ESSENCE, datatype);
|
||||
// if(ess == NULL || datatype != DT_QUIVER_ESSENCE) return -1;
|
||||
// datatype = DT_PROJECTILE_ESSENCE;
|
||||
// //���ﲻ����dup��ʽ
|
||||
// // if(generate_projectile(ess->id_projectile, ID_SPACE_ESSENCE, (char **)data, size, cls) == 0)
|
||||
// int ret = duplicate_static_item(id, data,size);
|
||||
// if(ret == 0)
|
||||
// {
|
||||
// ASSERT(ess->num_max < (int)((item_data*)(*data))->pile_limit);
|
||||
// ((item_data*)(*data))->count = element_data::RandNormal(ess->num_min,ess->num_max,cls,element_data::LOWER_TREND);
|
||||
// return 0;
|
||||
// }
|
||||
// else
|
||||
// return -1;
|
||||
// /* {
|
||||
// ASSERT(ess->num_max < (int)((item_data*)(*data))->pile_limit);
|
||||
// ((item_data*)(*data))->count = element_data::RandNormal<RAND_CLASS,element_data::LOWER>(ess->num_min,ess->num_max,cls);
|
||||
// return 0;
|
||||
// }
|
||||
// else
|
||||
// return -1;
|
||||
// */
|
||||
// }
|
||||
|
||||
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_quiver_for_sell(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// QUIVER_ESSENCE * ess = (QUIVER_ESSENCE *)get_data_ptr(id, ID_SPACE_ESSENCE, datatype);
|
||||
// if(ess == NULL || datatype != DT_QUIVER_ESSENCE) return -1;
|
||||
// datatype = DT_PROJECTILE_ESSENCE;
|
||||
// //��������dup��������
|
||||
// if(generate_projectile(ess->id_projectile, ID_SPACE_ESSENCE, (char **)data, size, cls) == 0)
|
||||
// {
|
||||
// ASSERT(ess->num_max < (int)((item_data*)(*data))->pile_limit);
|
||||
// ((item_data*)(*data))->count = element_data::RandNormal(ess->num_min,ess->num_max,cls,element_data::LOWER_TREND);
|
||||
// return 0;
|
||||
// }
|
||||
// else
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_decoration(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls,element_data::GEN_ADDON_MODE normal_addon,const void * tag,size_t tag_size, int * sa_list = NULL)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// size_t i=0;
|
||||
// DECORATION_ESSENCE * ess = (DECORATION_ESSENCE *)get_data_ptr(id, idspace, datatype);
|
||||
// if(ess == NULL || datatype != DT_DECORATION_ESSENCE) return -1;
|
||||
|
||||
// size = sizeof(item_data) + sizeof(_item_content) + sizeof(_decoration_essence);
|
||||
// // ��
|
||||
// unsigned int hole_num = 0; //������Ŀ
|
||||
|
||||
// // ���addons
|
||||
// char addon_buf[ELEMENTDATAMAN_MAX_NUM_ADDONS*sizeof(_addon)];
|
||||
// unsigned int addon_num = element_data::RandSelect(&(ess->probability_addon_num0),sizeof(float), 5,cls,element_data::LOWER_TREND); //���Ա���Ŀ����Ŀ
|
||||
|
||||
// size_t addon_size = 0;
|
||||
// if(ess->fixed_props)
|
||||
// {
|
||||
// addon_size = generate_equipment_addon_buffer_2(DT_DECORATION_ESSENCE, (int*)&(ess->addons[0]), sizeof(int)+sizeof(float),32, addon_buf,addon_num);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// if(normal_addon == element_data::ADDON_LIST_DROP)
|
||||
// addon_size = generate_equipment_addon_buffer(DT_DECORATION_ESSENCE, (char*)&(ess->addons[0]), 32, addon_buf,addon_num);
|
||||
// else if(normal_addon == element_data::ADDON_LIST_PRODUCE)
|
||||
// addon_size = generate_equipment_addon_buffer(DT_DECORATION_ESSENCE, (char*)&(ess->rands[0]), 32, addon_buf,addon_num);
|
||||
// else if (normal_addon == element_data::ADDON_LIST_SPEC)
|
||||
// {
|
||||
// addon_size = generate_spec_addon_buffer(DT_DECORATION_ESSENCE,addon_buf,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 = (char *)abase::fastalloc(size);
|
||||
// char * buf = (*data);
|
||||
|
||||
|
||||
// *(unsigned int*)buf = id; buf += sizeof(unsigned int); //��Ʒ��ģ��ID
|
||||
// *(size_t*)buf = 1; buf += sizeof(size_t); //��Ʒ������
|
||||
// *(size_t*)buf = ess->pile_num_max; buf += sizeof(size_t); //��Ʒ�Ķѵ�����
|
||||
// DECORATION_SUB_TYPE* sub_type = (DECORATION_SUB_TYPE*)get_data_ptr(ess->id_sub_type, ID_SPACE_ESSENCE, datatype);
|
||||
// if(sub_type == NULL || datatype != DT_DECORATION_SUB_TYPE) // error
|
||||
// return -1;
|
||||
// *(int*)buf = sub_type->equip_mask|(addon_num?ELEMENTDATAMAN_EQUIP_MASK_HAS_ADDON:0); buf += sizeof(int); //��Ʒ�Ŀ�װ����־
|
||||
// *(int*)buf = ess->proc_type; buf += sizeof(int); //��Ʒ�Ĵ�����ʽ
|
||||
// *(int*)buf = DT_DECORATION_ESSENCE; buf += sizeof(int); //��Ʒ��Ӧ�����ID
|
||||
// if(ess->has_guid == 1){
|
||||
// int g1,g2;
|
||||
// get_item_guid(id,g1,g2);
|
||||
// *(int*)buf = g1; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = g2; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// else{
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// *(int*)buf = ess->price; buf += sizeof(int); //��Ʒ�ļ۸�
|
||||
// *(int*)buf = 0; buf += sizeof(int); //����ʱ��
|
||||
// size_t* content_length = (size_t*)buf; buf += sizeof(size_t); //��סbuf��ָ�룬�Ժ�����
|
||||
// char ** item_content = (char **)buf; buf += sizeof(char *); //��סbuf��ָ�룬�Ժ�����
|
||||
// *content_length = (char*)(*data)+size-buf;
|
||||
// *item_content = buf;
|
||||
|
||||
// // prerequisition
|
||||
// char * require_ptr = buf;
|
||||
// *(short*)buf = ess->require_level; buf += sizeof(short); //prerequisition level
|
||||
// *(short*)buf = ess->character_combo_id&0xFFFF; buf += sizeof(short); //prerequisition race
|
||||
// *(short*)buf = ess->require_strength; buf += sizeof(short); //prerequisition strength
|
||||
// *(short*)buf = ess->require_tili; buf += sizeof(short); //prerequisition val
|
||||
// *(short*)buf = ess->require_agility; buf += sizeof(short); //prerequisition agility
|
||||
// *(short*)buf = ess->require_energy; buf += sizeof(short); //prerequisition energy
|
||||
|
||||
// int temp2 = element_data::RandNormal(ess->durability_min, ess->durability_max, cls,element_data::LOWER_TREND);
|
||||
// int temp;
|
||||
// if(normal_addon != element_data::ADDON_LIST_DROP || ess->proc_type & 0x1000)
|
||||
// {
|
||||
// temp = temp2;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// temp = element_data::RandNormal(ess->durability_drop_min, ess->durability_drop_max, cls,element_data::UPPER_TREND);
|
||||
// if(temp > temp2) temp = temp2;
|
||||
// }
|
||||
// *(int*)buf = temp; buf += sizeof(int); //prerequisition durability
|
||||
// *(int*)buf = temp2; buf += sizeof(int); //prerequisition max_durability
|
||||
|
||||
// //���������߱�ǩע���ǩ���ڱ����С�ͱ�������֮��
|
||||
// *(short*)buf = sizeof(_decoration_essence); buf += sizeof(short); //װ�������С���ֽڣ�
|
||||
// memcpy(buf,tag,tag_size);
|
||||
// buf += tag_size;
|
||||
|
||||
|
||||
// // ����
|
||||
// char * essence_ptr = buf;
|
||||
// *(int*)buf = element_data::RandNormal(ess->damage_low, ess->damage_high, cls,element_data::LOWER_TREND); buf += sizeof(int); //int damage;
|
||||
// *(int*)buf = element_data::RandNormal(ess->magic_damage_low, ess->magic_damage_high, cls,element_data::LOWER_TREND); buf += sizeof(int); //int magic_damage;
|
||||
// *(int*)buf = element_data::RandNormal(ess->defence_low, ess->defence_high, cls,element_data::LOWER_TREND); buf += sizeof(int); //int defense;
|
||||
// *(int*)buf = element_data::RandNormal(ess->armor_enhance_low, ess->armor_enhance_high, cls,element_data::LOWER_TREND); buf += sizeof(int); //int armor;
|
||||
|
||||
// //����
|
||||
// int res[5] = {0,0,0,0,0};
|
||||
// generate_magic_defense(res,(int*)(ess->magic_defences),cls,ess->fixed_props!=0);
|
||||
|
||||
// *(int*)buf = res[0]; buf += sizeof(int);
|
||||
// *(int*)buf = res[1]; buf += sizeof(int);
|
||||
// *(int*)buf = res[2]; buf += sizeof(int);
|
||||
// *(int*)buf = res[3]; buf += sizeof(int);
|
||||
// *(int*)buf = res[4]; buf += sizeof(int);
|
||||
|
||||
// // ��
|
||||
// *(short*)buf = hole_num; buf += sizeof(short); //������Ŀ
|
||||
// *(short*)buf = 0; buf += sizeof(short); //����������������
|
||||
|
||||
// // addon
|
||||
// *(int*)buf = addon_num; buf += sizeof(int);
|
||||
// char * addon_sld = addon_buf;
|
||||
// for(i=0; i<addon_num; i++)
|
||||
// {
|
||||
// int id = *(int*)addon_sld;
|
||||
// addon_update_ess_data(*(addon_data*)addon_sld, essence_ptr, sizeof(_decoration_essence), (prerequisition*)require_ptr);
|
||||
// addon_sld += ((id & 0x6000)>>13)*sizeof(int)+sizeof(int);
|
||||
// }
|
||||
// update_require_data((prerequisition*)require_ptr);
|
||||
// memcpy(buf, addon_buf, addon_size);
|
||||
// set_to_classid(DT_DECORATION_ESSENCE, (item_data*)(*data), -1);
|
||||
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_stone(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// STONE_ESSENCE * ess = (STONE_ESSENCE *)get_data_ptr(id, idspace, datatype);
|
||||
// if(ess == NULL || datatype != DT_STONE_ESSENCE) return -1;
|
||||
|
||||
|
||||
// char addon_buf[ELEMENTDATAMAN_MAX_NUM_ADDONS*sizeof(_addon)];
|
||||
// int *pBuf = (int*)addon_buf;
|
||||
// *pBuf = 1; //only one weapon addon now
|
||||
// size_t addon_size = generate_addon_buffer(datatype,ess->id_addon_damage, (char*)(pBuf + 1));
|
||||
// if(addon_size)
|
||||
// {
|
||||
// pBuf = (int*)(((char*)(pBuf+1)) + addon_size);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// ASSERT(false);
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// *pBuf = 1; //only one armor addon now
|
||||
// addon_size = generate_addon_buffer(datatype,ess->id_addon_defence, (char*)(pBuf + 1));
|
||||
// if(addon_size)
|
||||
// {
|
||||
// pBuf = (int*)(((char*)(pBuf+1)) + addon_size);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// ASSERT(false);
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// size_t ess_size = ((char*)pBuf) - addon_buf;
|
||||
// size = sizeof(item_data) + ess_size;
|
||||
|
||||
// // allocate the buffer with exact length
|
||||
// *data = (char *)abase::fastalloc(size);
|
||||
// char *buf = *data;
|
||||
// *(unsigned int*)buf = id; buf += sizeof(unsigned int); //��Ʒ��ģ��ID
|
||||
// *(size_t*)buf = 1; buf += sizeof(size_t); //��Ʒ������
|
||||
// *(size_t*)buf = ess->pile_num_max;buf += sizeof(size_t); //��Ʒ�Ķѵ�����
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ�Ŀ�װ����־
|
||||
// *(int*)buf = ess->proc_type; buf += sizeof(int); //��Ʒ�Ĵ�����ʽ
|
||||
// *(int*)buf = DT_STONE_ESSENCE; buf += sizeof(int); //��Ʒ��Ӧ�����ID
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = ess->price; buf += sizeof(int); //��Ʒ�ļ۸�
|
||||
// *(int*)buf = 0; buf += sizeof(int); //����ʱ��
|
||||
// size_t* content_length = (size_t*)buf; buf += sizeof(size_t); //��סbuf��ָ�룬�Ժ�����
|
||||
// char ** item_content = (char **)buf; buf += sizeof(char *); //��סbuf��ָ�룬�Ժ�����
|
||||
// *content_length = size - (buf - (char*)(*data));
|
||||
// *item_content = buf;
|
||||
// memcpy(buf, addon_buf, ess_size);
|
||||
// set_to_classid(DT_STONE_ESSENCE, (item_data*)(*data), -1);
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_medicine(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// MEDICINE_ESSENCE * ess = (MEDICINE_ESSENCE *)get_data_ptr(id, idspace, datatype);
|
||||
// if(ess == NULL || datatype != DT_MEDICINE_ESSENCE) return -1;
|
||||
|
||||
// size = sizeof(item_data);
|
||||
|
||||
// switch(ess->id_major_type)
|
||||
// {
|
||||
// case 1794: // ��Ѫ����
|
||||
// case 1802: // ��ħ����
|
||||
// case 1810: // ��Ѫ��ħ����
|
||||
// size += sizeof(size_t) + sizeof(int) + sizeof(int) + sizeof(int);
|
||||
// break;
|
||||
// case 1815: // �ⶾҩ
|
||||
// case 2038: // ˲��ⶾҩ
|
||||
// size += sizeof(int) + sizeof(int);
|
||||
// break;
|
||||
// default:
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
// // allocate the buffer with exact length
|
||||
// *data = (char *)abase::fastalloc(size);
|
||||
// char * buf = (*data);
|
||||
|
||||
// *(unsigned int*)buf = id; buf += sizeof(unsigned int); //��Ʒ��ģ��ID
|
||||
// *(size_t*)buf = 1; buf += sizeof(size_t); //��Ʒ������
|
||||
// *(size_t*)buf = ess->pile_num_max; buf += sizeof(size_t); //��Ʒ�Ķѵ�����
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ�Ŀ�װ����־
|
||||
// *(int*)buf = ess->proc_type; buf += sizeof(int); //��Ʒ�Ĵ�����ʽ
|
||||
// *(int*)buf = DT_MEDICINE_ESSENCE; buf += sizeof(int); //��Ʒ��Ӧ�����ID
|
||||
// if(ess->has_guid == 1){
|
||||
// int g1,g2;
|
||||
// get_item_guid(id,g1,g2);
|
||||
// *(int*)buf = g1; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = g2; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// else{
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// *(int*)buf = ess->price; buf += sizeof(int); //��Ʒ�ļ۸�
|
||||
// *(int*)buf = 0; buf += sizeof(int); //����ʱ��
|
||||
// size_t* content_length = (size_t*)buf; buf += sizeof(size_t); //��סbuf��ָ�룬�Ժ�����
|
||||
// char ** item_content = (char **)buf; buf += sizeof(char *); //��סbuf��ָ�룬�Ժ�����
|
||||
// *content_length = (char*)(*data)+size-buf;
|
||||
// *item_content = buf;
|
||||
|
||||
// switch(ess->id_major_type)
|
||||
// {
|
||||
// case 1794: // ��Ѫ����
|
||||
// if(ess->cool_time < 1000) ess->cool_time *= 100;
|
||||
// *(int*)buf = ess->hp_add_total; buf += sizeof(int);
|
||||
// *(int*)buf = ess->hp_add_time; buf += sizeof(int);
|
||||
// *(int*)buf = ess->cool_time; buf += sizeof(int);
|
||||
// *(int*)buf = ess->require_level; buf += sizeof(int);
|
||||
// ASSERT(ess->hp_add_time && ess->hp_add_total);
|
||||
// ASSERT(ess->hp_add_total/ess->hp_add_time);
|
||||
// break;
|
||||
// case 1802: // ��ħ����
|
||||
// if(ess->cool_time < 1000) ess->cool_time *= 100;
|
||||
// *(int*)buf = ess->mp_add_total; buf += sizeof(int);
|
||||
// *(int*)buf = ess->mp_add_time; buf += sizeof(int);
|
||||
// *(int*)buf = ess->cool_time; buf += sizeof(int);
|
||||
// *(int*)buf = ess->require_level; buf += sizeof(int);
|
||||
// ASSERT(ess->mp_add_time && ess->mp_add_total);
|
||||
// ASSERT(ess->mp_add_total/ess->mp_add_time);
|
||||
// break;
|
||||
// case 1810: // ��Ѫ��ħ����
|
||||
// if(ess->cool_time < 1000) ess->cool_time *= 100;
|
||||
// *(int*)buf = ess->mp_add_total; buf += sizeof(int);
|
||||
// *(int*)buf = ess->hp_add_total; buf += sizeof(int);
|
||||
// *(int*)buf = ess->cool_time; buf += sizeof(int);
|
||||
// *(int*)buf = ess->require_level; buf += sizeof(int);
|
||||
// ASSERT(ess->hp_add_time || ess->mp_add_total);
|
||||
// break;
|
||||
// case 1815: // �ⶾҩ
|
||||
// case 2038: // ˲��ⶾҩ
|
||||
// if(ess->cool_time < 1000) ess->cool_time *= 100;
|
||||
// *(int*)buf = ess->cool_time; buf += sizeof(int);
|
||||
// *(int*)buf = ess->require_level; buf += sizeof(int);
|
||||
// break;
|
||||
// default:
|
||||
// return -1;
|
||||
// }
|
||||
// set_to_classid(DT_MEDICINE_ESSENCE, (item_data*)(*data), ess->id_major_type);
|
||||
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// template <typename ESSENCE >
|
||||
// int generate_material(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, ESSENCE * p, DATA_TYPE DTYPE)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// ESSENCE * ess = (ESSENCE *)get_data_ptr(id, idspace, datatype);
|
||||
// if(ess == NULL || datatype != DTYPE) return -1;
|
||||
|
||||
// size = sizeof(item_data) ;
|
||||
|
||||
// // allocate the buffer with exact length
|
||||
// *data = (char *)abase::fastalloc(size);
|
||||
// char * buf = (*data);
|
||||
|
||||
// *(unsigned int*)buf = id; buf += sizeof(unsigned int); //��Ʒ��ģ��ID
|
||||
// *(size_t*)buf = 1; buf += sizeof(size_t); //��Ʒ������
|
||||
// *(size_t*)buf = ess->pile_num_max; buf += sizeof(size_t); //��Ʒ�Ķѵ�����
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ�Ŀ�װ����־
|
||||
// *(int*)buf = ess->proc_type; buf += sizeof(int); //��Ʒ�Ĵ�����ʽ
|
||||
// *(int*)buf = DTYPE; buf += sizeof(int); //��Ʒ��Ӧ�����ID
|
||||
// if(ess->has_guid == 1){
|
||||
// int g1,g2;
|
||||
// get_item_guid(id,g1,g2);
|
||||
// *(int*)buf = g1; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = g2; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// else{
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// *(int*)buf = ess->price; buf += sizeof(int); //��Ʒ�ļ۸�
|
||||
// *(int*)buf = 0; buf += sizeof(int); //����ʱ��
|
||||
// size_t* content_length = (size_t*)buf; buf += sizeof(size_t); //��סbuf��ָ�룬�Ժ�����
|
||||
// char ** item_content = (char **)buf; buf += sizeof(char *); //��סbuf��ָ�룬�Ժ�����
|
||||
// *content_length = (char*)(*data)+size-buf;
|
||||
// *item_content = buf;
|
||||
|
||||
// set_to_classid(DTYPE, (item_data*)(*data), -1);
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// template <typename RAND_CLASS>
|
||||
// int generate_skilltome(unsigned int id, ID_SPACE idspace, char ** data, size_t& size, RAND_CLASS cls)
|
||||
// {
|
||||
// DATA_TYPE datatype;
|
||||
// SKILLTOME_ESSENCE * ess = (SKILLTOME_ESSENCE *)get_data_ptr(id, idspace, datatype);
|
||||
// if(ess == NULL || datatype != DT_SKILLTOME_ESSENCE) return -1;
|
||||
|
||||
// size = sizeof(item_data);
|
||||
|
||||
// // allocate the buffer with exact length
|
||||
// *data = (char *)abase::fastalloc(size);
|
||||
// char * buf = (*data);
|
||||
|
||||
// *(unsigned int*)buf = id; buf += sizeof(unsigned int); //��Ʒ��ģ��ID
|
||||
// *(size_t*)buf = 1; buf += sizeof(size_t); //��Ʒ������
|
||||
// *(size_t*)buf = ess->pile_num_max; buf += sizeof(size_t); //��Ʒ�Ķѵ�����
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ�Ŀ�װ����־
|
||||
// *(int*)buf = ess->proc_type; buf += sizeof(int); //��Ʒ�Ĵ�����ʽ
|
||||
// *(int*)buf = DT_SKILLTOME_ESSENCE; buf += sizeof(int); //��Ʒ��Ӧ�����ID
|
||||
// if(ess->has_guid == 1){
|
||||
// int g1,g2;
|
||||
// get_item_guid(id,g1,g2);
|
||||
// *(int*)buf = g1; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = g2; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// else{
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// *(int*)buf = 0; buf += sizeof(int); //��Ʒ��Ӧ�����ID guid
|
||||
// }
|
||||
// *(int*)buf = ess->price; buf += sizeof(int); //��Ʒ�ļ۸�
|
||||
// *(int*)buf = 0; buf += sizeof(int); //����ʱ��
|
||||
// size_t* content_length = (size_t*)buf; buf += sizeof(size_t); //��סbuf��ָ�룬�Ժ�����
|
||||
// char ** item_content = (char **)buf; buf += sizeof(char *); //��סbuf��ָ�룬�Ժ�����
|
||||
// *content_length = (char*)(*data)+size-buf;
|
||||
// *item_content = buf;
|
||||
|
||||
// set_to_classid(DT_SKILLTOME_ESSENCE, (item_data*)(*data), -1);
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
#endregion
|
||||
@@ -462,6 +462,21 @@ namespace BrewMonster
|
||||
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);
|
||||
break;
|
||||
case DATA_TYPE.DT_MEDICINE_ESSENCE:
|
||||
ret = generate_item_temp.generate_medicine(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND);
|
||||
break;
|
||||
case DATA_TYPE.DT_MATERIAL_ESSENCE:
|
||||
ret = generate_item_temp.generate_material(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND);
|
||||
break;
|
||||
case DATA_TYPE.DT_SKILLTOME_ESSENCE:
|
||||
ret = generate_item_temp.generate_skilltome(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND);
|
||||
break;
|
||||
case DATA_TYPE.DT_PET_EGG_ESSENCE:
|
||||
ret = generate_item_temp.generate_pet_egg(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND);
|
||||
break;
|
||||
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;
|
||||
default:
|
||||
ret = -1;
|
||||
break;
|
||||
|
||||
@@ -55,12 +55,15 @@ namespace BrewMonster
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Weapon sub-type name
|
||||
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_hitgfx; // Hit effect file path
|
||||
public string FileHitGfx => ByteToStringUtils.ByteArrayToCP936String(file_hitgfx);
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_hitsfx; // Hit sound effect file path
|
||||
|
||||
public byte[] file_hitsfx; // Hit sound effect file pathpublic string FileHitSfx => ByteToStringUtils.ByteArrayToCP936String(file_hitsfx);
|
||||
public string FileHitSfx => ByteToStringUtils.ByteArrayToCP936String(file_hitsfx);
|
||||
public float probability_fastest; // Attack frequency probability: Fastest -0.1
|
||||
public float probability_fast; // Attack frequency probability: Fast -0.05
|
||||
public float probability_normal; // Attack frequency probability: Normal 0
|
||||
@@ -257,7 +260,8 @@ namespace BrewMonster
|
||||
public uint id; // Armor major type ID
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Armor major type name
|
||||
public ushort[] name; // Armor major type name public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -267,6 +271,7 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Armor sub-type name
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
|
||||
public uint equip_mask; // Equipment slot mask
|
||||
}
|
||||
@@ -433,6 +438,8 @@ namespace BrewMonster
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Decoration sub-type name
|
||||
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
|
||||
public uint equip_mask; // Equipment slot mask
|
||||
}
|
||||
|
||||
@@ -447,16 +454,22 @@ namespace BrewMonster
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Decoration name, max 15 characters
|
||||
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
|
||||
// Display information
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_model; // Model file path
|
||||
|
||||
public string FileModel => ByteToStringUtils.ByteArrayToCP936String(file_model);
|
||||
[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
|
||||
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
|
||||
public int level; // Decoration level
|
||||
|
||||
// Equipment requirements
|
||||
@@ -751,12 +764,10 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Fashion name, max 15 characters
|
||||
|
||||
public string Name => ByteToStringUtils.UshortArrayToCP936String(name);
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] realname; // Real fashion name
|
||||
|
||||
public string RealName => ByteToStringUtils.ByteArrayToUnicodeString(realname);
|
||||
|
||||
// Display information
|
||||
@@ -793,7 +804,6 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] wear_action; // Wear action
|
||||
|
||||
public string WearAction => ByteToStringUtils.ByteArrayToUnicodeString(wear_action);
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
@@ -827,6 +837,7 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Medicine major type name
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -847,13 +858,18 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Medicine name, max 15 characters
|
||||
public string Name => ByteToStringUtils.UshortArrayToCP936String(name);
|
||||
|
||||
[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
|
||||
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
|
||||
public int require_level; // Required level
|
||||
public int cool_time; // Cooldown time (seconds)
|
||||
|
||||
@@ -933,12 +949,18 @@ namespace BrewMonster
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Name, max 15 characters
|
||||
|
||||
public string Name => ByteToStringUtils.UshortArrayToCP936String(name);
|
||||
|
||||
[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
|
||||
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
|
||||
public int total_hp; // Total HP recovery
|
||||
public float trigger_amount; // Trigger HP threshold
|
||||
public int cool_time; // Cooldown time (seconds)
|
||||
@@ -959,13 +981,18 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Name, max 15 characters
|
||||
public string Name => ByteToStringUtils.UshortArrayToCP936String(name);
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_matter; // Matter model file path
|
||||
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
|
||||
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
|
||||
public int total_mp; // Total MP recovery
|
||||
public float trigger_amount; // Trigger MP threshold
|
||||
public int cool_time; // Cooldown time (seconds)
|
||||
@@ -1038,6 +1065,7 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Material major type name
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -1047,6 +1075,7 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Material sub-type name
|
||||
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
@@ -1058,13 +1087,15 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // Material name, max 15 characters
|
||||
public string Name => ByteToStringUtils.UshortArrayToCP936String(name);
|
||||
|
||||
[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
|
||||
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
public int price; // Base price
|
||||
public int shop_price; // Shop price
|
||||
|
||||
@@ -1304,10 +1335,10 @@ 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
|
||||
|
||||
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
|
||||
public int price; // Base price
|
||||
public int shop_price; // Shop price
|
||||
|
||||
@@ -2084,6 +2115,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 id_pet; // pet ID
|
||||
|
||||
@@ -2122,9 +2154,11 @@ namespace BrewMonster
|
||||
|
||||
[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); } }
|
||||
|
||||
public int level; // level
|
||||
|
||||
@@ -2963,31 +2997,27 @@ namespace BrewMonster
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public ushort[] name; // name, max 15 characters
|
||||
public string Name => ByteToStringUtils.UshortArrayToCP936String(name);
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_model1; // state 1 model file
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_model2; // state 2 model file
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_model3; // state 3 model file
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_model4; // state 4 model file
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_matter; // matter model path
|
||||
|
||||
public string FileMatter => ByteToStringUtils.ByteArrayToCP936String(file_matter);
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_icon1; // state 1 icon path
|
||||
|
||||
public string FileIcon1 => ByteToStringUtils.ByteArrayToCP936String(file_icon1);
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_icon2; // state 2 icon path
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_icon3; // state 3 icon path
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
|
||||
public byte[] file_icon4; // state 4 icon path
|
||||
|
||||
|
||||
@@ -80,4 +80,14 @@ namespace BrewMonster.Scripts
|
||||
|
||||
SIZE_FASHIONSCSET = 240,
|
||||
};
|
||||
// Pet food type
|
||||
enum PetFoodType
|
||||
{
|
||||
PET_FOOD_GRASS = 0,
|
||||
PET_FOOD_MEAT,
|
||||
PET_FOOD_VEGETABLE,
|
||||
PET_FOOD_FRUIT,
|
||||
PET_FOOD_WATER,
|
||||
MAX_PET_FOOD,
|
||||
};
|
||||
}
|
||||
@@ -84,7 +84,6 @@ namespace BrewMonster.Network
|
||||
}
|
||||
public static Dictionary<int, int> GetSuiteEquipTab()
|
||||
{
|
||||
Debug.Log("[EC_Game] GetSuiteEquipTab: " + m_SuiteEquipTab.Count);
|
||||
return m_SuiteEquipTab;
|
||||
}
|
||||
public static bool TryGetItemMsg(int templateId, out int messageId, out int displayMode)
|
||||
|
||||
@@ -64,7 +64,9 @@ using BrewMonster.Scripts;
|
||||
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Armor item class (Mu + Ao + Quan + Giay) / Armor item class (Helmet + Armor + Pants + Boots)
|
||||
/// </summary>
|
||||
public class EC_IvtrArmor : EC_IvtrEquip
|
||||
{
|
||||
//Attributes
|
||||
@@ -75,6 +77,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
protected ARMOR_SUB_TYPE m_pDBSubType;
|
||||
protected ARMOR_ESSENCE m_pDBEssence;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for armor item (Mu + Ao + Quan + Giay) / Constructor for armor item (Helmet + Armor + Pants + Boots)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrArmor(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_ARMOR;
|
||||
@@ -93,6 +100,10 @@ namespace PerfectWorld.Scripts.Managers
|
||||
RepairFee = m_pDBEssence.repairfee;
|
||||
ReputationReq = m_pDBEssence.require_reputation;
|
||||
}
|
||||
/// <summary>
|
||||
/// Copy constructor for armor item (Mu + Ao + Quan + Giay) / Copy constructor for armor item (Helmet + Armor + Pants + Boots)
|
||||
/// </summary>
|
||||
/// <param name="other">Other armor item to copy from</param>
|
||||
public EC_IvtrArmor(EC_IvtrArmor other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
@@ -386,10 +397,9 @@ namespace PerfectWorld.Scripts.Managers
|
||||
AddDestroyingDesc((int)m_pDBEssence.id_drop_after_damaged, m_pDBEssence.num_drop_after_damaged);
|
||||
AddExpireTimeDesc();
|
||||
// Sub class name
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_CLASSNAME), m_pDBSubType.name.ToString());
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_CLASSNAME), m_pDBSubType.Name);
|
||||
// Weapon level
|
||||
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVEL), m_pDBEssence.level);
|
||||
|
||||
// Physical defence
|
||||
if (m_Essence.defense - aPEEVals[PEEI_PHYDEF] + aRefines[REFINE_PHYDEF] != 0)
|
||||
{
|
||||
|
||||
@@ -4,6 +4,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrArmorrune : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrArmorrune(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrArrow : EC_IvtrEquip
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrArrow(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,15 +1,174 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Define and Macro
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Reference to External variables and functions
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Local Types and Variables and Global variables
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Local functions
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Implement CECIvtrDecoration
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
using BrewMonster;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
using System.Collections.Generic;
|
||||
using BrewMonster.Network;
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using BrewMonster.Scripts;
|
||||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
using CSNetwork.GPDataType;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrAutoHp : EC_IvtrItem
|
||||
/// <summary>
|
||||
/// Auto HP item class (tu dong hoi mau). This is a part of CEC_IvtrEquipMatter(C++)
|
||||
/// </summary>
|
||||
public class EC_IvtrAutoHp : EC_IvtrEquip
|
||||
{
|
||||
public IVTR_ESSENCE_AUTOHP m_Essence;
|
||||
|
||||
// Data in database
|
||||
public AUTOHP_ESSENCE m_pDBEssence;
|
||||
/// <summary>
|
||||
/// Constructor for auto HP item (tu dong hoi mau) / Constructor for auto HP item (automatic HP recovery)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrAutoHp(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_AUTOHP;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (AUTOHP_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 = (long)EC_IvtrType.EQUIP_MASK64_AUTOHP;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy constructor for auto HP item (tu dong hoi mau) / Copy constructor for auto HP item (automatic HP recovery)
|
||||
/// </summary>
|
||||
/// <param name="other">Other auto HP item to copy from</param>
|
||||
public EC_IvtrAutoHp(EC_IvtrAutoHp other) : base(other)
|
||||
{
|
||||
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);
|
||||
|
||||
m_Essence = new IVTR_ESSENCE_AUTOHP(dr.ReadData(Marshal.SizeOf<IVTR_ESSENCE_AUTOHP>()));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
BMLogger.LogError("CECIvtrAutoHP::SetItemInfo, data read error (" + e.GetType() + ")");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get item icon file name
|
||||
public override string GetIconFile()
|
||||
{
|
||||
return m_pDBEssence.FileIcon;
|
||||
}
|
||||
|
||||
// Get item name
|
||||
public override string GetName()
|
||||
{
|
||||
return m_pDBEssence.Name;
|
||||
}
|
||||
|
||||
|
||||
// Get item description text
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
if (m_bNeedUpdate)
|
||||
return null;
|
||||
|
||||
m_strDesc = string.Empty;
|
||||
|
||||
// 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;
|
||||
|
||||
if (m_iCount > 1)
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount);
|
||||
else
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName());
|
||||
|
||||
AddIDDescText();
|
||||
|
||||
AddBindDescText();
|
||||
|
||||
AddExpireTimeDesc();
|
||||
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_AUTOHP1), m_Essence.hp_left, m_pDBEssence.total_hp);
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_AUTOHP2), (int)(m_pDBEssence.trigger_amount * 100.0f + 0.5f));
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_COOLTIME), m_pDBEssence.cool_time / 1000);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Get item cool time
|
||||
public int GetCoolTime(ref int piMax)
|
||||
{
|
||||
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
|
||||
return pHost != null ? pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_AUTOHP, ref piMax) : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,174 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Define and Macro
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Reference to External variables and functions
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Local Types and Variables and Global variables
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Local functions
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Implement CECIvtrDecoration
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
using BrewMonster;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
using System.Collections.Generic;
|
||||
using BrewMonster.Network;
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using BrewMonster.Scripts;
|
||||
using System.Runtime.InteropServices;
|
||||
using System;
|
||||
using CSNetwork.GPDataType;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrAutoMp : EC_IvtrItem
|
||||
/// <summary>
|
||||
/// Auto MP item class (tu dong hoi mana). This is a part of CEC_IvtrEquipMatter(C++)
|
||||
/// </summary>
|
||||
public class EC_IvtrAutoMp : EC_IvtrEquip
|
||||
{
|
||||
public IVTR_ESSENCE_AUTOMP m_Essence;
|
||||
|
||||
// Data in database
|
||||
public AUTOMP_ESSENCE m_pDBEssence;
|
||||
/// <summary>
|
||||
/// Constructor for auto MP item (tu dong hoi mana) / Constructor for auto MP item (automatic MP recovery)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrAutoMp(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_AUTOMP;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (AUTOMP_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 = (long)EC_IvtrType.EQUIP_MASK64_AUTOMP;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy constructor for auto MP item (tu dong hoi mana) / Copy constructor for auto MP item (automatic MP recovery)
|
||||
/// </summary>
|
||||
/// <param name="other">Other auto MP item to copy from</param>
|
||||
public EC_IvtrAutoMp(EC_IvtrAutoMp other) : base(other)
|
||||
{
|
||||
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);
|
||||
|
||||
m_Essence = new IVTR_ESSENCE_AUTOMP(dr.ReadData(Marshal.SizeOf<IVTR_ESSENCE_AUTOMP>()));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
BMLogger.LogError("CECIvtrAutoHP::SetItemInfo, data read error (" + e.GetType() + ")");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get item icon file name
|
||||
public override string GetIconFile()
|
||||
{
|
||||
return m_pDBEssence.FileIcon;
|
||||
}
|
||||
|
||||
// Get item name
|
||||
public override string GetName()
|
||||
{
|
||||
return m_pDBEssence.Name;
|
||||
}
|
||||
|
||||
|
||||
// Get item description text
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
if (m_bNeedUpdate)
|
||||
return null;
|
||||
|
||||
m_strDesc = string.Empty;
|
||||
|
||||
// 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;
|
||||
|
||||
if (m_iCount > 1)
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount);
|
||||
else
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName());
|
||||
|
||||
AddIDDescText();
|
||||
|
||||
AddBindDescText();
|
||||
|
||||
AddExpireTimeDesc();
|
||||
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_AUTOMP1), m_Essence.mp_left, m_pDBEssence.total_mp);
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_AUTOMP2), (int)(m_pDBEssence.trigger_amount * 100.0f + 0.5f));
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_COOLTIME), m_pDBEssence.cool_time / 1000);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Get item cool time
|
||||
public int GetCoolTime(ref int piMax)
|
||||
{
|
||||
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
|
||||
return pHost != null ? pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_AUTOMP, ref piMax) : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrBible : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrBible(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrCertificate : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrCertificate(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrCongregate : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrCongregate(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrDamagerune : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrDamagerune(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -39,7 +39,9 @@ using BrewMonster.Scripts.Managers;
|
||||
using BrewMonster.Scripts;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Decoration item class (boi + nhan + ) / Decoration item class (various types of decorations)
|
||||
/// </summary>
|
||||
public class EC_IvtrDecoration : EC_IvtrEquip
|
||||
{
|
||||
protected IVTR_ESSENCE_DECORATION m_Essence;
|
||||
@@ -47,6 +49,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
protected DECORATION_SUB_TYPE m_pDBSubType;
|
||||
protected DECORATION_ESSENCE m_pDBEssence;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for decoration item (cac loai trang suc) / Constructor for decoration item (various types of decorations)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrDecoration(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_DECORATION;
|
||||
@@ -66,6 +73,10 @@ namespace PerfectWorld.Scripts.Managers
|
||||
ReputationReq = m_pDBEssence.require_reputation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy constructor for decoration item (cac loai trang suc) / Copy constructor for decoration item (various types of decorations)
|
||||
/// </summary>
|
||||
/// <param name="other">Other decoration item to copy from</param>
|
||||
public EC_IvtrDecoration(EC_IvtrDecoration other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
@@ -73,7 +84,435 @@ namespace PerfectWorld.Scripts.Managers
|
||||
m_pDBSubType = other.m_pDBSubType;
|
||||
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(6 * sizeof(short), CECDataReader.SEEK_CUR);
|
||||
dr.Offset(2 * sizeof(int), CECDataReader.SEEK_CUR);
|
||||
int iEssenceSize = dr.ReadShort();
|
||||
// Skip maker's information
|
||||
dr.ReadByte();
|
||||
int iMakerLen = dr.ReadByte();
|
||||
dr.Offset(iMakerLen, CECDataReader.SEEK_CUR);
|
||||
byte[] iEssenceData = dr.ReadData(iEssenceSize);
|
||||
m_Essence = new IVTR_ESSENCE_DECORATION(iEssenceData);
|
||||
// ���븽������˵��
|
||||
if(m_pDBEssence.fixed_props != 0 && m_pDBEssence.probability_addon_num0 != 1.0f)
|
||||
{
|
||||
// Get database data
|
||||
elementdataman pDataMan = ElementDataManProvider.GetElementDataMan();
|
||||
CECStringTab PropTab = EC_Game.GetItemExtProp();
|
||||
int i, iSize = 0;
|
||||
for(i=0;i<32;i++)
|
||||
{
|
||||
if(m_pDBEssence.addons[i].id_addon != 0)
|
||||
iSize++;
|
||||
}
|
||||
if(iSize > 0 && Props.Count == 0)
|
||||
{
|
||||
Props.Capacity = iSize;
|
||||
for(i=0;i<32;i++)
|
||||
{
|
||||
if(m_pDBEssence.addons[i].id_addon != 0)
|
||||
{
|
||||
Property Prop = new Property();
|
||||
Prop.Type = (int)m_pDBEssence.addons[i].id_addon;
|
||||
Prop.Embed = false;
|
||||
Prop.Suite = false;
|
||||
Prop.Engraved = false;
|
||||
Prop.Local = false;
|
||||
byte bType = PropTab.GetWideString(Prop.Type) != null ? (byte)0xff : (byte)0xff;
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
object pData = pDataMan.get_data_ptr(m_pDBEssence.addons[i].id_addon, ID_SPACE.ID_SPACE_ADDON, ref DataType);
|
||||
if (DataType != DATA_TYPE.DT_EQUIPMENT_ADDON)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
EQUIPMENT_ADDON pAddon = (EQUIPMENT_ADDON)pData;
|
||||
Prop.NumParam = pAddon.num_params;
|
||||
for(int j=0; j < Prop.NumParam; j++)
|
||||
{
|
||||
if(j==0)
|
||||
{
|
||||
Prop.Params[0] = pAddon.param1;
|
||||
}
|
||||
else if(j==1)
|
||||
{
|
||||
Prop.Params[1] = pAddon.param2;
|
||||
}
|
||||
else if(j==2)
|
||||
{
|
||||
Prop.Params[2] = pAddon.param3;
|
||||
}
|
||||
}
|
||||
Props.Add(Prop);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch ( System.Exception e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public override void DefaultInfo()
|
||||
{
|
||||
LevelReq = m_pDBEssence.require_level;
|
||||
StrengthReq = 0;
|
||||
AgilityReq = 0;
|
||||
ReputationReq = m_pDBEssence.require_reputation;
|
||||
CurEndurance = m_pDBEssence.durability_min * ENDURANCE_SCALE;
|
||||
MaxEndurance = m_pDBEssence.durability_min * ENDURANCE_SCALE;
|
||||
}
|
||||
public override string GetIconFile()
|
||||
{
|
||||
return m_pDBEssence.FileIcon;
|
||||
}
|
||||
// Get item name
|
||||
public override string GetName()
|
||||
{
|
||||
return m_pDBEssence.Name;
|
||||
}
|
||||
public override string GetPreviewInfo()
|
||||
{
|
||||
int[] aPEEVals = new int[MAX_PEEINDEX];
|
||||
int[] aRefines = new int[MAX_REFINEINDEX];
|
||||
for(int i=0; i<MAX_PEEINDEX; i++)
|
||||
aPEEVals[i] = 0;
|
||||
for(int i=0; i<MAX_REFINEINDEX; i++)
|
||||
aRefines[i] = 0;
|
||||
m_strDesc = "";
|
||||
BuildAddOnPropDesc(aPEEVals, aRefines);
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
// Add physical damage
|
||||
if (m_Essence.damage - aPEEVals[PEEI_PHYDAMAGE] + aRefines[REFINE_PHYDAMAGE] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDAMAGE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.damage - aPEEVals[PEEI_PHYDAMAGE] + aRefines[REFINE_PHYDAMAGE]);
|
||||
}
|
||||
// Add magic damage
|
||||
if (m_Essence.magic_damage - aPEEVals[PEEI_MAGICDAMAGE] + aRefines[REFINE_MAGICDAMAGE] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_MAGICDAMAGE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.magic_damage - aPEEVals[PEEI_MAGICDAMAGE] + aRefines[REFINE_MAGICDAMAGE]);
|
||||
}
|
||||
// Physical defense
|
||||
if (m_Essence.defense - aPEEVals[PEEI_PHYDEF] + aRefines[REFINE_PHYDEF] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDEFENCE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.defense - aPEEVals[PEEI_PHYDEF] + aRefines[REFINE_PHYDEF]);
|
||||
}
|
||||
// Dodge
|
||||
if (m_Essence.armor - aPEEVals[PEEI_DODGE] + aRefines[REFINE_DODGE] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_DODGE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.armor - aPEEVals[PEEI_DODGE] + aRefines[REFINE_DODGE]);
|
||||
}
|
||||
//Gold Resistance
|
||||
if (m_Essence.resistance[0] - aPEEVals[PEEI_GOLDDEF] + aRefines[REFINE_GOLDDEF] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_GOLDDEFENCE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.resistance[0] - aPEEVals[PEEI_GOLDDEF] + aRefines[REFINE_GOLDDEF]);
|
||||
}
|
||||
//Wood Resistance
|
||||
if (m_Essence.resistance[1] - aPEEVals[PEEI_WOODDEF] + aRefines[REFINE_WOODDEF] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_WOODDEFENCE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.resistance[1] - aPEEVals[PEEI_WOODDEF] + aRefines[REFINE_WOODDEF]);
|
||||
}
|
||||
//Water Resistance
|
||||
if (m_Essence.resistance[2] - aPEEVals[PEEI_WATERDEF] + aRefines[REFINE_WATERDEF] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_WATERDEFENCE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.resistance[2] - aPEEVals[PEEI_WATERDEF] + aRefines[REFINE_WATERDEF]);
|
||||
}
|
||||
//Fire Resistance
|
||||
if (m_Essence.resistance[3] - aPEEVals[PEEI_FIREDEF] + aRefines[REFINE_FIREDEF] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_FIREDEFENCE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.resistance[3] - aPEEVals[PEEI_FIREDEF] + aRefines[REFINE_FIREDEF]);
|
||||
}
|
||||
//Earth Resistance
|
||||
if (m_Essence.resistance[4] - aPEEVals[PEEI_EARTHDEF] + aRefines[REFINE_EARTHDEF] != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_EARTHDEFENCE));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, " %+d", m_Essence.resistance[4] - aPEEVals[PEEI_EARTHDEF] + aRefines[REFINE_EARTHDEF]);
|
||||
}
|
||||
return m_strDesc;
|
||||
}
|
||||
public override bool GetRefineEffectFor(string strEffect, RefineEffect rhs){
|
||||
strEffect = "";
|
||||
if (!m_bNeedUpdate){
|
||||
switch (rhs.RefineIndex){
|
||||
case REFINE_PHYDAMAGE:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDAMAGE),
|
||||
m_Essence.damage - rhs.APEEVals[PEEI_PHYDAMAGE] + rhs.ARefines[REFINE_PHYDAMAGE] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_MAGICDAMAGE:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_MAGICDAMAGE),
|
||||
m_Essence.magic_damage - rhs.APEEVals[PEEI_MAGICDAMAGE] + rhs.ARefines[REFINE_MAGICDAMAGE] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_PHYDEF:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDEFENCE),
|
||||
m_Essence.defense - rhs.APEEVals[PEEI_PHYDEF] + rhs.ARefines[REFINE_PHYDEF] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_DODGE:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_DODGE),
|
||||
m_Essence.armor - rhs.APEEVals[PEEI_DODGE] + rhs.ARefines[REFINE_DODGE] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_GOLDDEF:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_GOLDDEFENCE),
|
||||
m_Essence.resistance[0] - rhs.APEEVals[PEEI_GOLDDEF] + rhs.ARefines[REFINE_GOLDDEF] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_WOODDEF:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_WOODDEFENCE),
|
||||
m_Essence.resistance[1] - rhs.APEEVals[PEEI_WOODDEF] + rhs.ARefines[REFINE_WOODDEF] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_WATERDEF:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_WATERDEFENCE),
|
||||
m_Essence.resistance[2] - rhs.APEEVals[PEEI_WATERDEF] + rhs.ARefines[REFINE_WATERDEF] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_FIREDEF:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_FIREDEFENCE),
|
||||
m_Essence.resistance[3] - rhs.APEEVals[PEEI_FIREDEF] + rhs.ARefines[REFINE_FIREDEF] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
case REFINE_EARTHDEF:
|
||||
strEffect = string.Format("{0}{1} {2}(+{3})",
|
||||
rhs.GetClrAttribute(),
|
||||
EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_EARTHDEFENCE),
|
||||
m_Essence.resistance[4] - rhs.APEEVals[PEEI_EARTHDEF] + rhs.ARefines[REFINE_EARTHDEF] + rhs.GetIncEffect(),
|
||||
rhs.GetClrEffect(),
|
||||
rhs.GetIncEffect());
|
||||
break;
|
||||
}
|
||||
}
|
||||
return !string.IsNullOrEmpty(strEffect);
|
||||
}
|
||||
protected override string GetNormalDesc(bool bRepair){
|
||||
if (m_bNeedUpdate)
|
||||
return null;
|
||||
int[] aPEEVals = new int[MAX_PEEINDEX];
|
||||
int[] aRefines = new int[MAX_REFINEINDEX];
|
||||
for(int i=0; i<MAX_PEEINDEX; i++)
|
||||
aPEEVals[i] = 0;
|
||||
for(int i=0; i<MAX_REFINEINDEX; i++)
|
||||
aRefines[i] = 0;
|
||||
m_strDesc = "";
|
||||
BuildAddOnPropDesc(aPEEVals, aRefines);
|
||||
string strAddon = m_strDesc;
|
||||
m_strDesc = "";
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
|
||||
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
|
||||
int lblue = (int)DescriptipionMsg.ITEMDESC_COL_LIGHTBLUE;
|
||||
int red = (int)DescriptipionMsg.ITEMDESC_COL_RED;
|
||||
int namecol = DecideNameCol();
|
||||
uint dwPEE = PropEffectEssence();
|
||||
|
||||
AddDescText(namecol, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName());
|
||||
|
||||
// Refine level
|
||||
if (RefineLvl > 0)
|
||||
AddDescText(-1, true, "{0} +{1}", pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVEL), RefineLvl);
|
||||
else
|
||||
m_strDesc += "\\r";
|
||||
AddIDDescText();
|
||||
AddBindDescText();
|
||||
// Is destroying?
|
||||
AddDestroyingDesc((int)m_pDBEssence.id_drop_after_damaged, m_pDBEssence.num_drop_after_damaged);
|
||||
AddExpireTimeDesc();
|
||||
// Sub class name
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_CLASSNAME), m_pDBSubType.Name);
|
||||
// Decoration level
|
||||
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVEL), m_pDBEssence.level);
|
||||
|
||||
//add Physical damage
|
||||
if (m_Essence.damage - aPEEVals[PEEI_PHYDAMAGE] + aRefines[REFINE_PHYDAMAGE] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDAMAGE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.damage - aPEEVals[PEEI_PHYDAMAGE] + aRefines[REFINE_PHYDAMAGE]);
|
||||
}
|
||||
//add Magic damage
|
||||
if (m_Essence.magic_damage - aPEEVals[PEEI_MAGICDAMAGE] + aRefines[REFINE_MAGICDAMAGE] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_MAGICDAMAGE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.magic_damage - aPEEVals[PEEI_MAGICDAMAGE] + aRefines[REFINE_MAGICDAMAGE]);
|
||||
}
|
||||
// Physical defence
|
||||
if (m_Essence.defense - aPEEVals[PEEI_PHYDEF] + aRefines[REFINE_PHYDEF] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDEFENCE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.defense - aPEEVals[PEEI_PHYDEF] + aRefines[REFINE_PHYDEF]);
|
||||
}
|
||||
// Dodge
|
||||
if (m_Essence.armor - aPEEVals[PEEI_DODGE] + aRefines[REFINE_DODGE] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DODGE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.armor - aPEEVals[PEEI_DODGE] + aRefines[REFINE_DODGE]);
|
||||
}
|
||||
// Gold Resistance
|
||||
if (m_Essence.resistance[0] - aPEEVals[PEEI_GOLDDEF] + aRefines[REFINE_GOLDDEF] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOLDDEFENCE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.resistance[0] - aPEEVals[PEEI_GOLDDEF] + aRefines[REFINE_GOLDDEF]);
|
||||
}
|
||||
// Wood Resistance
|
||||
if (m_Essence.resistance[1] - aPEEVals[PEEI_WOODDEF] + aRefines[REFINE_WOODDEF] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_WOODDEFENCE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.resistance[1] - aPEEVals[PEEI_WOODDEF] + aRefines[REFINE_WOODDEF]);
|
||||
}
|
||||
// Water Resistance
|
||||
if (m_Essence.resistance[2] - aPEEVals[PEEI_WATERDEF] + aRefines[REFINE_WATERDEF] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_WATERDEFENCE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.resistance[2] - aPEEVals[PEEI_WATERDEF] + aRefines[REFINE_WATERDEF]);
|
||||
}
|
||||
// Fire Resistance
|
||||
if (m_Essence.resistance[3] - aPEEVals[PEEI_FIREDEF] + aRefines[REFINE_FIREDEF] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_FIREDEFENCE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.resistance[3] - aPEEVals[PEEI_FIREDEF] + aRefines[REFINE_FIREDEF]);
|
||||
}
|
||||
// Earth Resistance
|
||||
if (m_Essence.resistance[4] - aPEEVals[PEEI_EARTHDEF] + aRefines[REFINE_EARTHDEF] != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_EARTHDEFENCE));
|
||||
AddDescText(white, true, " +{0}", m_Essence.resistance[4] - aPEEVals[PEEI_EARTHDEF] + aRefines[REFINE_EARTHDEF]);
|
||||
}
|
||||
// Endurance
|
||||
int col = white;
|
||||
if (CurEndurance == 0)
|
||||
col = red;
|
||||
else if ((dwPEE & PEE_ENDURANCE) != 0)
|
||||
col = lblue;
|
||||
AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ENDURANCE));
|
||||
AddDescText(col, true, " {0}/{1}", VisualizeEndurance(CurEndurance), VisualizeEndurance(MaxEndurance));
|
||||
|
||||
// Profession requirement
|
||||
AddProfReqDesc((uint)ProfReq);
|
||||
// Level requirment
|
||||
if (LevelReq != 0)
|
||||
{
|
||||
col = pHost.GetMaxLevelSofar() >= LevelReq ? white : red;
|
||||
AddDescText(col, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVELREQ), LevelReq);
|
||||
}
|
||||
// Strength requirment
|
||||
if (StrengthReq != 0)
|
||||
{
|
||||
col = pHost.GetExtendProps().bs.strength < StrengthReq ? red : ((dwPEE & PEE_STRENGTHREQ) != 0 ? lblue : white);
|
||||
AddDescText(col, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_STRENGTHREQ), StrengthReq);
|
||||
}
|
||||
// Agility requirment
|
||||
if (AgilityReq != 0)
|
||||
{
|
||||
col = pHost.GetExtendProps().bs.agility < AgilityReq ? red : ((dwPEE & PEE_AGILITYREQ) != 0 ? lblue : white);
|
||||
AddDescText(col, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_AGILITYREQ), AgilityReq);
|
||||
}
|
||||
// Vitality requirment
|
||||
if (VitalityReq != 0)
|
||||
{
|
||||
col = pHost.GetExtendProps().bs.vitality < VitalityReq ? red : ((dwPEE & PEE_VITALITYREQ) != 0 ? lblue : white);
|
||||
AddDescText(col, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_VITALITYREQ), VitalityReq);
|
||||
}
|
||||
// Energy requirment
|
||||
if (EnergyReq != 0)
|
||||
{
|
||||
col = pHost.GetExtendProps().bs.energy < EnergyReq ? red : ((dwPEE & PEE_ENERGYREQ) != 0 ? lblue : white);
|
||||
AddDescText(col, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ENERGYREQ), EnergyReq);
|
||||
}
|
||||
// Reputation requirement
|
||||
AddReputationReqDesc();
|
||||
// Add addon properties
|
||||
if (!string.IsNullOrEmpty(strAddon))
|
||||
m_strDesc += strAddon;
|
||||
// Build tessera description
|
||||
BuildTesseraDesc();
|
||||
if(m_pDBEssence.fixed_props == 0 && m_bIsInNPCPack)
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL2_BRIGHTBLUE, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_HASRANDOM_PROP));
|
||||
// Price
|
||||
AddPriceDesc(white, bRepair);
|
||||
AddSharpenerDesc();
|
||||
AddEngravedDesc();
|
||||
AddMakerDesc();
|
||||
m_strDesc += "\\r";
|
||||
AddSuiteDesc();
|
||||
AddExtDescText();
|
||||
return m_strDesc;
|
||||
}
|
||||
public bool HasRandomProp()
|
||||
{
|
||||
for (int i = 0; i < Props.Count; i++)
|
||||
{
|
||||
if (!Props[i].Embed && !Props[i].Engraved && Props[i].Type == 472)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public int GetRefineMaterialNum()
|
||||
{
|
||||
return m_pDBEssence.material_need;
|
||||
}
|
||||
public override uint GetRefineAddOn()
|
||||
{
|
||||
return (uint)m_pDBEssence.levelup_addon;
|
||||
}
|
||||
public override string GetDropModel()
|
||||
{
|
||||
return m_pDBEssence.FileMatter;
|
||||
}
|
||||
public override bool IsRare()
|
||||
{
|
||||
return base.IsRare() || m_pDBEssence.level >= 6;
|
||||
}
|
||||
public override int GetItemLevel()
|
||||
{
|
||||
return m_pDBEssence.level;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrDestroyingEssence : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrDestroyingEssence(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrDoubleExp : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrDoubleExp(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrDyeTicket : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrDyeTicket(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrDynSkillEquip : EC_IvtrEquip
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrDynSkillEquip(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrElement : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrElement(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -2346,106 +2346,20 @@ namespace PerfectWorld.Scripts.Managers
|
||||
/// </summary>
|
||||
protected override void AddDescText(int color, bool newLine, string format, params object[] args)
|
||||
{
|
||||
// Add color prefix if color is specified
|
||||
if (color >= 0)
|
||||
{
|
||||
string colorStr = GetColorString((DescriptipionMsg)color);
|
||||
m_strDesc += colorStr;
|
||||
}
|
||||
|
||||
if (args.Length > 0)
|
||||
{
|
||||
// Accept both C#-style ("{0}") and printf-style ("%d", "%+d", "%.2f", "%%") formats
|
||||
string output;
|
||||
if (format.IndexOf('%') >= 0 && format.IndexOf('{') < 0)
|
||||
{
|
||||
output = FormatPrintfLike(format, args);
|
||||
}
|
||||
else
|
||||
{
|
||||
output = string.Format(format, args);
|
||||
}
|
||||
m_strDesc += output;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_strDesc += format;
|
||||
}
|
||||
// Call base implementation for format conversion (handles both {0} and %d styles)
|
||||
base.AddDescText(-1, false, format, args);
|
||||
|
||||
// Add newline if requested (base class uses "\n", but equip uses "\\r")
|
||||
if (newLine)
|
||||
m_strDesc += "\\r";
|
||||
}
|
||||
|
||||
private static string FormatPrintfLike(string fmt, object[] args)
|
||||
{
|
||||
System.Text.StringBuilder sb = new System.Text.StringBuilder();
|
||||
int argIndex = 0;
|
||||
for (int i = 0; i < fmt.Length; i++)
|
||||
{
|
||||
char c = fmt[i];
|
||||
if (c != '%')
|
||||
{
|
||||
sb.Append(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i + 1 < fmt.Length && fmt[i + 1] == '%')
|
||||
{
|
||||
sb.Append('%');
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
bool plus = false;
|
||||
int precision = -1;
|
||||
int j = i + 1;
|
||||
if (j < fmt.Length && fmt[j] == '+') { plus = true; j++; }
|
||||
if (j < fmt.Length && fmt[j] == '.')
|
||||
{
|
||||
// precision like %.2f
|
||||
j++;
|
||||
int start = j;
|
||||
while (j < fmt.Length && char.IsDigit(fmt[j])) j++;
|
||||
int.TryParse(fmt.Substring(start, j - start), out precision);
|
||||
}
|
||||
|
||||
if (j < fmt.Length)
|
||||
{
|
||||
char spec = fmt[j];
|
||||
if (spec == 'd')
|
||||
{
|
||||
object val = argIndex < args.Length ? args[argIndex++] : 0;
|
||||
long iv = Convert.ToInt64(val);
|
||||
string s = iv.ToString();
|
||||
if (plus && iv >= 0) s = "+" + s;
|
||||
sb.Append(s);
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
else if (spec == 'f')
|
||||
{
|
||||
object val = argIndex < args.Length ? args[argIndex++] : 0.0;
|
||||
double dv = Convert.ToDouble(val);
|
||||
string s = precision >= 0 ? dv.ToString("F" + precision) : dv.ToString("F");
|
||||
if (plus && dv >= 0) s = "+" + s;
|
||||
sb.Append(s);
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
else if (spec == 's')
|
||||
{
|
||||
object val = argIndex < args.Length ? args[argIndex++] : "";
|
||||
string s = val != null ? val.ToString() : "";
|
||||
sb.Append(s);
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: treat '%' as literal if format not recognized
|
||||
sb.Append('%');
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get color string for color ID
|
||||
@@ -4277,8 +4191,8 @@ namespace PerfectWorld.Scripts.Managers
|
||||
|
||||
if (!bShowDetail)
|
||||
{
|
||||
m_strDesc = "\\r\\r";
|
||||
AddDescText(iNameCol, true, "{0} {1}/{2}", pSuiteEss.Name, 0, pSuiteEss.max_equips);
|
||||
m_strDesc = "";
|
||||
AddDescText(iNameCol, false, "{0} {1}/{2}", pSuiteEss.Name, 0, pSuiteEss.max_equips);
|
||||
m_strDesc = strCurDesc + m_strDesc;
|
||||
return;
|
||||
}
|
||||
@@ -4310,7 +4224,7 @@ namespace PerfectWorld.Scripts.Managers
|
||||
iItemCnt = hostPlayer.GetEquippedSuiteItem(idSuite,ref aEquipped);
|
||||
if(iItemCnt == 0) return;
|
||||
|
||||
m_strDesc += "\\r\\r";
|
||||
//m_strDesc += "\\r\\r";
|
||||
// Build suite addon properties at first
|
||||
for (int i = 0; i < MAX_NUM; i++)
|
||||
{
|
||||
@@ -4392,7 +4306,7 @@ namespace PerfectWorld.Scripts.Managers
|
||||
AddDescText(red, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EQUIP_DESTROYING));
|
||||
|
||||
AddDescText(red, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EQUIP_REPAIR_NEED_ITEM), essenceName);
|
||||
AddDescText(red, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EQUIP_REPAIR_NEED_ITEMCNT), (int)(Math.Ceiling(num * 1.2)));
|
||||
AddDescText(red, true, GetItemDescString(DescriptipionMsg.ITEMDESC_EQUIP_REPAIR_NEED_ITEMCNT), (int)Math.Ceiling(num * 1.2));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -4647,7 +4561,7 @@ namespace PerfectWorld.Scripts.Managers
|
||||
if (string.IsNullOrEmpty(Maker))
|
||||
return;
|
||||
|
||||
m_strDesc += "\\r";
|
||||
m_strDesc += "\\r";
|
||||
// For signed marks (IMT_SIGN), Maker already contains color codes and formatted text.
|
||||
if (MadeFrom == (byte)ITEM_MAKE_TAG.IMT_SIGN)
|
||||
{
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrFacePill : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrFacePill(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrFaceTicket : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrFaceTicket(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrFactionMaterial : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrFactionMaterial(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrFashion : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrFashion(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrFirework : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrFirework(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrFlysword : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrFlysword(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrForceToken : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrForceToken(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrGeneralCard : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrGeneralCard(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrGeneralCardDice : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrGeneralCardDice(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrGmGenerator : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrGmGenerator(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,15 +1,763 @@
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
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 CSNetwork.GPDataType;
|
||||
using System.Runtime.InteropServices;
|
||||
using BrewMonster.Scripts;
|
||||
using BrewMonster.Scripts.Skills;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrGoblin : EC_IvtrItem
|
||||
/// <summary>
|
||||
/// The goblin item class (cac loai tinh linh).(not completed, need generate class).
|
||||
/// This feature is skip for now.
|
||||
/// </summary>
|
||||
public class EC_IvtrGoblin : EC_IvtrEquip
|
||||
{
|
||||
#region const, enum and struct
|
||||
const int MAX_ELF_REFINE_LEVEL = 36;
|
||||
const int INITIAL_MAX_VIGOR = 1000;
|
||||
|
||||
enum ElfSkillNum
|
||||
{
|
||||
MAX_SKILLNUM = 8, // Max skill num
|
||||
SKILL_LEARN_PT = 40, // ����ÿ���SKILL_LEARN_PT�㣨����+װ��+ģ�壩���ܶ�ѧһ������ (�ѹ�ʱ 2009-08-24)
|
||||
INIT_SKILL_NUM = 4, // ��ʼ��������
|
||||
};
|
||||
public struct GOBLINSKILL
|
||||
{
|
||||
public ushort skill;
|
||||
public short level;
|
||||
}
|
||||
#endregion
|
||||
#region Array and List declaration
|
||||
// Refine effect of goblin
|
||||
int[,] m_iRefineEffect = new int[MAX_ELF_REFINE_LEVEL, 3] {
|
||||
{45,0,0},
|
||||
{100,0,0},
|
||||
{165,0,0},
|
||||
{240,0,0},
|
||||
{325,0,0},
|
||||
|
||||
{420,0,0},
|
||||
{420,1,0},
|
||||
{420,2,0},
|
||||
{420,2,1},
|
||||
{420,2,2}, // 10
|
||||
{420,3,3},
|
||||
{420,4,4},
|
||||
{420,6,5},
|
||||
{420,9,6},
|
||||
{420,12,7},
|
||||
|
||||
{420,16,8},
|
||||
{420,20,9},
|
||||
{420,24,11},
|
||||
{420,28,13},
|
||||
{420,32,15}, // 20
|
||||
|
||||
{420,36,17},
|
||||
{420,41,19},
|
||||
{420,46,21},
|
||||
{420,51,24},
|
||||
{420,56,27},
|
||||
|
||||
{420,61,30},
|
||||
{420,66,33},
|
||||
{420,72,36},
|
||||
{420,78,39},
|
||||
{420,84,42}, // 30
|
||||
|
||||
{420,90,45},
|
||||
{420,96,48},
|
||||
{420,102,51},
|
||||
{420,108,54},
|
||||
{420,114,57},
|
||||
|
||||
{420,120,60}
|
||||
};
|
||||
int[] m_iRefineMaterial = new int[MAX_ELF_REFINE_LEVEL] {
|
||||
1, 2, 7, 20, 50, 110, 220, 390, 500, 550, // 10
|
||||
600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, // 20
|
||||
1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550, // 30
|
||||
1600, 1650, 1700, 1750, 1800, 1850,
|
||||
};
|
||||
static int[] elf_exp_loss_constant = new int[151] {0, //no use
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
|
||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
|
||||
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
|
||||
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
|
||||
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
|
||||
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
|
||||
91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
|
||||
100, 100, 100, 100, 100, //105
|
||||
|
||||
// Ϊ�����ڷ����Գ��������ȼ�������150
|
||||
100, 100, 100, 100, 100, //110
|
||||
100, 100, 100, 100, 100,
|
||||
100, 100, 100, 100, 100, //120
|
||||
100, 100, 100, 100, 100,
|
||||
100, 100, 100, 100, 100, //130
|
||||
100, 100, 100, 100, 100,
|
||||
100, 100, 100, 100, 100, //140
|
||||
100, 100, 100, 100, 100,
|
||||
100, 100, 100, 100, 100, //150
|
||||
};
|
||||
//��ʹ��rmb����Ŀ�꾫���ȼ���Ӧ�ijɹ���
|
||||
float[] elf_refine_succ_prob_ticket0 = new float[MAX_ELF_REFINE_LEVEL+1] {
|
||||
1.0f, 0.4f, 0.315789474f, 0.338983051f, 0.377358491f, 0.417754569f, 0.463208685f, 0.510769231f, 0.55f, 0.55f,
|
||||
0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f,
|
||||
0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f,
|
||||
0.55f, 0.55f, 0.55f, 0.55f, 0.55f, 0.55f,
|
||||
0.0f}; // [36]: cannot refine any more
|
||||
//ʹ�����絤(��߳ɹ��ʣ�ʧ�ܵȼ���0)Ŀ�꾫���ȼ���Ӧ�ijɹ���
|
||||
static float[] elf_refine_succ_prob_ticket1 = new float[MAX_ELF_REFINE_LEVEL+1]{
|
||||
1.0f, 0.6f, 0.368421053f, 0.355932203f, 0.383647799f, 0.420365535f, 0.464414958f, 0.511384615f, 0.557001027f, 0.60032861f,
|
||||
0.640836732f, 0.678052261f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f,
|
||||
0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f,
|
||||
0.7f, 0.7f, 0.7f, 0.7f, 0.7f, 0.7f,
|
||||
0.0f
|
||||
};
|
||||
//ʹ�����ϵ�(���ɹ��ʣ�ʧ�ܵȼ���1)Ŀ�꾫���ȼ���Ӧ�ijɹ���
|
||||
static float[] elf_refine_succ_prob_ticket2 = new float[MAX_ELF_REFINE_LEVEL+1]{
|
||||
1.0f, 0.6f, 0.333333333f, 0.296296296f, 0.3f, 0.314814815f, 0.337313433f, 0.360708535f, 0.381453155f, 0.4f,
|
||||
0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f,
|
||||
0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f,
|
||||
0.4f, 0.4f, 0.4f, 0.4f, 0.4f, 0.4f,
|
||||
0.0f
|
||||
};
|
||||
//ʹ���λõ�(�ɹ�����ʹ�ø����������и������ޣ�ʧ�ܵȼ�����)Ŀ�꾫���ȼ���Ӧ�����ʹ�������ɹ���=��������/���Էŵ��������
|
||||
static int[] elf_refine_max_use_ticket3 = new int[MAX_ELF_REFINE_LEVEL+1]{
|
||||
1 , 2 , 7 , 20 , 50 , 112 , 223 , 398 , 648 , 974 ,
|
||||
1366 , 1806 , 2271 , 2739 , 3191 , 3612 , 3993 , 4331 , 4623 , 4873 ,
|
||||
5084 , 5260 , 5405 , 5525 , 5623 , 5702 , 5767 , 5819 , 5861 , 5895 ,
|
||||
5923 , 5945 , 5962 , 5977 , 5988 , 5997,
|
||||
100000000
|
||||
};
|
||||
#endregion
|
||||
List<GOBLINSKILL> m_aSkills;
|
||||
List<uint> m_aEquipID;
|
||||
|
||||
IVTR_ESSENCE_GOBLIN m_Essence; // Goblin essence data
|
||||
// Data in database
|
||||
GOBLIN_ESSENCE m_pDBEssence;
|
||||
/// <summary>
|
||||
/// Create goblin item (cac loai tinh linh).
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrGoblin(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_GOBLIN;
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (GOBLIN_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_iPileLimit = m_pDBEssence.pile_num_max;
|
||||
Price = m_pDBEssence.price;
|
||||
m_iShopPrice = m_pDBEssence.shop_price;
|
||||
m_iProcType = (int)m_pDBEssence.proc_type;
|
||||
m_bNeedUpdate = false;
|
||||
m_i64EquipMask = (long)EC_IvtrType.EQUIP_MASK64_GOBLIN;
|
||||
|
||||
CurEndurance = 1;
|
||||
MaxEndurance = 1;
|
||||
}
|
||||
|
||||
public EC_IvtrGoblin(EC_IvtrGoblin other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
m_Essence = other.m_Essence; // Copy essence
|
||||
|
||||
// Copy skills
|
||||
int i, iNumSkill = other.m_aSkills.Count;
|
||||
m_aSkills = new List<GOBLINSKILL>(iNumSkill);
|
||||
|
||||
for (i=0; i < iNumSkill; i++)
|
||||
m_aSkills[i] = other.m_aSkills[i];
|
||||
|
||||
// Copy equipments
|
||||
int iNumEquip = other.m_aEquipID.Count;
|
||||
m_aEquipID = new List<uint>(iNumEquip);
|
||||
|
||||
for(i=0; i< iNumEquip; i++)
|
||||
m_aEquipID[i] = other.m_aEquipID[i];
|
||||
}
|
||||
|
||||
public IVTR_ESSENCE_GOBLIN GetEssence() { return m_Essence; }
|
||||
|
||||
// Get database data
|
||||
public GOBLIN_ESSENCE GetDBEssence() { return m_pDBEssence; }
|
||||
|
||||
// Get skill number
|
||||
public int GetSkillNum() { return m_aSkills.Count; }
|
||||
|
||||
public GOBLINSKILL GetSkill(int id) { if(id>=0 && id<m_aSkills.Count) return m_aSkills[id]; else throw new Exception("id is out of range"); }
|
||||
|
||||
// Set Goblin inventory stamina
|
||||
void SetStamina(int iStamina) { m_Essence.data.stamina = iStamina; }
|
||||
|
||||
// Set Goblin Exp
|
||||
public void SetExp(int iExp) { m_Essence.data.exp = (uint)iExp; }
|
||||
float GetRefineSuccProb0(int iLevel)
|
||||
{
|
||||
return elf_refine_succ_prob_ticket0[iLevel];
|
||||
}
|
||||
float GetRefineSuccProb1(int iLevel)
|
||||
{
|
||||
if (iLevel < 0 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
return elf_refine_succ_prob_ticket1[iLevel];
|
||||
}
|
||||
float GetRefineSuccProb2(int iLevel)
|
||||
{
|
||||
if (iLevel < 0 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
return elf_refine_succ_prob_ticket2[iLevel];
|
||||
}
|
||||
float GetRefineSuccProb3(int iLevel, int iNum)
|
||||
{
|
||||
if (iLevel < 0 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
if (iNum >= elf_refine_max_use_ticket3[iLevel])
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
if (iLevel == MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
return (float)iNum / (float)elf_refine_max_use_ticket3[iLevel];
|
||||
}
|
||||
int GetRefineLife(int iLevel)
|
||||
{
|
||||
if (iLevel < 1 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
return m_iRefineEffect[iLevel-1, 0];
|
||||
}
|
||||
int GetRefineAtkLvl(int iLevel)
|
||||
{
|
||||
if (iLevel < 1 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
return m_iRefineEffect[iLevel-1, 1];
|
||||
}
|
||||
int GetRefineDfsLvl(int iLevel)
|
||||
{
|
||||
if (iLevel < 1 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
return m_iRefineEffect[iLevel-1, 2];
|
||||
}
|
||||
int GetRefineMaterial(int iLevel)
|
||||
{
|
||||
if (iLevel < 1 || iLevel > MAX_ELF_REFINE_LEVEL)
|
||||
{
|
||||
throw new Exception("iLevel is out of range");
|
||||
}
|
||||
return m_iRefineMaterial[iLevel-1];
|
||||
}
|
||||
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);
|
||||
|
||||
// Set _GOBLIN_DATA info
|
||||
// Calculate size manually: uint(4) + 7*short(14) + short[5](10) + short(2) + 2*int(8) = 40 bytes
|
||||
const int GOBLIN_DATA_SIZE = 40;
|
||||
m_Essence.data = new IVTR_ESSENCE_GOBLIN._GOBLIN_DATA(dr.ReadData(GOBLIN_DATA_SIZE));
|
||||
|
||||
// Change proc type
|
||||
if(m_Essence.data.status_value < 0)
|
||||
{
|
||||
m_iProcType |= (int)ProcType.PROC_SELLABLE;
|
||||
m_iProcType |= (int)ProcType.PROC_TRADEABLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_iProcType &= ~(int)ProcType.PROC_SELLABLE;
|
||||
m_iProcType &= ~(int)ProcType.PROC_TRADEABLE;
|
||||
}
|
||||
|
||||
// Set equipment info
|
||||
int i, iEquipCnt = dr.ReadInt();
|
||||
m_Essence.equip_cnt = iEquipCnt;
|
||||
|
||||
m_aEquipID = new List<uint>(iEquipCnt);
|
||||
for(i=0; i< iEquipCnt; i++)
|
||||
{
|
||||
m_aEquipID[i] = (uint)dr.ReadInt();
|
||||
}
|
||||
|
||||
// Set skill info
|
||||
int iSkillCnt = dr.ReadInt();
|
||||
m_Essence.skill_cnt = iSkillCnt;
|
||||
|
||||
m_aSkills = new List<GOBLINSKILL>(iSkillCnt);
|
||||
for(i=0; i< iSkillCnt; i++)
|
||||
{
|
||||
GOBLINSKILL s = m_aSkills[i];
|
||||
s.skill = (ushort)dr.ReadShort();
|
||||
s.level = (short)dr.ReadShort();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError("CECIvtrGoblin::SetItemInfo, data read error (" + e.GetType() + ")");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
public override void DefaultInfo()
|
||||
{
|
||||
base.DefaultInfo();
|
||||
}
|
||||
public override string GetIconFile()
|
||||
{
|
||||
return m_pDBEssence.FileIcon1;
|
||||
}
|
||||
public override string GetName()
|
||||
{
|
||||
return m_pDBEssence.Name;
|
||||
}
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
if (m_bNeedUpdate)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
m_strDesc = "";
|
||||
|
||||
// Try to build item description
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
|
||||
int yellow = (int)DescriptipionMsg.ITEMDESC_COL_YELLOW;
|
||||
int green = (int)DescriptipionMsg.ITEMDESC_COL_GREEN;
|
||||
int color = white;
|
||||
int i;
|
||||
int namecol = DecideNameCol();
|
||||
|
||||
// Item name: always use the name in template
|
||||
if(m_Essence.data.refine_level != 0)
|
||||
{
|
||||
AddDescText(namecol, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), m_pDBEssence.Name);
|
||||
AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_REFINE_LEVEL), m_Essence.data.refine_level);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), m_pDBEssence.Name);
|
||||
}
|
||||
|
||||
AddIDDescText();
|
||||
|
||||
// Goblin level
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_LEVEL), m_Essence.data.level);
|
||||
|
||||
// Strength, Agility, Vitality, Energy + gained from equipment
|
||||
int iEquipStrength = 0;
|
||||
int iEquipAgility = 0;
|
||||
int iEquipTili = 0;
|
||||
int iEquipEnergy = 0;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
GOBLIN_EQUIP_ESSENCE pDBEssence;
|
||||
|
||||
for(i=0; i< m_aEquipID.Count; i++)
|
||||
{
|
||||
pDBEssence = (GOBLIN_EQUIP_ESSENCE)pDB.get_data_ptr(m_aEquipID[i], ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
iEquipStrength += pDBEssence.strength;
|
||||
iEquipAgility += pDBEssence.agility;
|
||||
iEquipTili += pDBEssence.tili;
|
||||
iEquipEnergy += pDBEssence.energy;
|
||||
}
|
||||
|
||||
color = (iEquipStrength == 0) ? white : green;
|
||||
AddDescText(color, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_STRENGTH), iEquipStrength + m_Essence.data.strength + m_pDBEssence.init_strength);
|
||||
color = (iEquipAgility == 0) ? white : green;
|
||||
AddDescText(color, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_AGILITY), iEquipAgility + m_Essence.data.agility + m_pDBEssence.init_agility);
|
||||
color = (iEquipTili == 0) ? white : green;
|
||||
AddDescText(color, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_VITALITY), iEquipTili + m_Essence.data.vitality + m_pDBEssence.init_tili);
|
||||
color = (iEquipEnergy == 0) ? white : green;
|
||||
AddDescText(color, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ENERGY), iEquipEnergy + m_Essence.data.energy + m_pDBEssence.init_energy);
|
||||
|
||||
// Grow degree
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_GROW_DEGREE), GetGrowDegree());
|
||||
|
||||
// Random status point
|
||||
int iMaxRandPt = GetMaxRandomStatusPt();
|
||||
if(iMaxRandPt != 0)
|
||||
{
|
||||
int iRandPt = GetRandomStatusPt();
|
||||
|
||||
int iGrowDegree = GetGrowDegree();
|
||||
int iRandomPt = GetRandomStatusPt();
|
||||
int iMaxPt= GetMaxStautsPt();
|
||||
|
||||
if(iRandomPt <= iGrowDegree*0.8)
|
||||
color = (int)DescriptipionMsg.ITEMDESC_COL_GREEN;
|
||||
else if(iRandomPt <= iGrowDegree)
|
||||
color = (int)DescriptipionMsg.ITEMDESC_COL_LIGHTBLUE;
|
||||
else if(iRandomPt <= (iMaxPt - iGrowDegree)*0.2 + iGrowDegree)
|
||||
color = (int)DescriptipionMsg.ITEMDESC_COL_PURPLE;
|
||||
else if(iRandomPt < iMaxPt)
|
||||
color = (int)DescriptipionMsg.ITEMDESC_COL_YELLOW;
|
||||
else if(iRandomPt == iMaxPt)
|
||||
color = (int)DescriptipionMsg.ITEMDESC_COL_DARKGOLD;
|
||||
|
||||
AddDescText(color, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_RANDPT), iRandPt, iMaxRandPt);
|
||||
}
|
||||
|
||||
// Energy
|
||||
int iEnergy = INITIAL_MAX_VIGOR + GetBasicProp(2);
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_ENERGY), iEnergy);
|
||||
|
||||
// Energy restore speed
|
||||
float fRestoreSpeed = 1.0f + GetBasicProp(3)*0.02f;
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_ENERGY_RESTORE), fRestoreSpeed);
|
||||
|
||||
// Current stamina
|
||||
int iCurrStamina = m_Essence.data.stamina;
|
||||
if(iCurrStamina > 999999)
|
||||
iCurrStamina = 999999;
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_STAMINA), iCurrStamina);
|
||||
|
||||
// Current refine effect
|
||||
if(m_Essence.data.refine_level != 0)
|
||||
{
|
||||
int iAttackLevel, iDefenceLevel, iLife;
|
||||
iLife = GetRefineLife(m_Essence.data.refine_level);
|
||||
iAttackLevel = GetRefineAtkLvl(m_Essence.data.refine_level);
|
||||
iDefenceLevel = GetRefineDfsLvl(m_Essence.data.refine_level);
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_REFINE_EFFECT), iLife, iAttackLevel, iDefenceLevel);
|
||||
}
|
||||
|
||||
// Trade state
|
||||
int iTradeState = m_Essence.data.status_value;
|
||||
if(iTradeState == 0)
|
||||
AddDescText(white,true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_TRADE_PROTECT));
|
||||
else if(iTradeState > 0)
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_TRADE_UNPROTECT));
|
||||
else if(iTradeState < 0)
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLIN_CANTRADE));
|
||||
|
||||
// Price
|
||||
AddPriceDesc(white, bRepair);
|
||||
|
||||
// Equipment info
|
||||
if(m_aEquipID.Count != 0)
|
||||
m_strDesc += "\\r";
|
||||
for(i=0; i< m_aEquipID.Count; i++)
|
||||
{
|
||||
pDBEssence = (GOBLIN_EQUIP_ESSENCE)pDB.get_data_ptr(m_aEquipID[i], ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_GOBLINEQUIP_POS_1 + pDBEssence.equip_type));
|
||||
AddDescText(white, true, " %s", pDBEssence.name);
|
||||
}
|
||||
|
||||
// Skill list
|
||||
if(m_aSkills.Count != 0 && m_aEquipID.Count == 0)
|
||||
m_strDesc += "\\r";
|
||||
for (i=0; i < m_aSkills.Count; i++)
|
||||
{
|
||||
GOBLINSKILL gSkill = m_aSkills[i];
|
||||
string szName = EC_Game.GetSkillDesc().GetWideString(gSkill.skill * 10);
|
||||
if(i==m_aSkills.Count-1)
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_YELLOW, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PETSKILL), szName != null ? szName : "", gSkill.level);
|
||||
else
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_YELLOW, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PETSKILL), szName != null ? szName : "", gSkill.level);
|
||||
}
|
||||
|
||||
AddExtDescText();
|
||||
|
||||
return m_strDesc;
|
||||
}
|
||||
|
||||
// Get grow degree
|
||||
int GetGrowDegree()
|
||||
{
|
||||
float fGrowDegree = 0.0f;
|
||||
for(int i=0;i<10;i++)
|
||||
{
|
||||
fGrowDegree += m_pDBEssence.rand_prop[i].rand_num * m_pDBEssence.rand_prop[i].rand_rate;
|
||||
}
|
||||
return (int)(fGrowDegree*10 + 0.5f);
|
||||
}
|
||||
// Max random status points that this goblin can get, depending on player's RP value
|
||||
int GetMaxRandomStatusPt()
|
||||
{
|
||||
return (GetMaxStautsPt()/10) * (m_Essence.data.level/10);
|
||||
}
|
||||
// Max status points that this goblin can get
|
||||
int GetMaxStautsPt()
|
||||
{
|
||||
int iMaxPt = 0;
|
||||
for(int i= 0;i<10;i++)
|
||||
{
|
||||
if(iMaxPt < m_pDBEssence.rand_prop[i].rand_num)
|
||||
iMaxPt = m_pDBEssence.rand_prop[i].rand_num;
|
||||
}
|
||||
|
||||
return iMaxPt * 10;
|
||||
}
|
||||
// Current random status point
|
||||
int GetRandomStatusPt()
|
||||
{
|
||||
return m_Essence.data.total_attribute - (m_Essence.data.level-1);
|
||||
}
|
||||
// Get basic property
|
||||
int GetBasicProp(int iIndex)
|
||||
{
|
||||
if(iIndex < 0 || iIndex >= 4)
|
||||
{
|
||||
throw new Exception("iIndex is out of range");
|
||||
}
|
||||
int i, iRet = 0;
|
||||
|
||||
// Strength, Agility, Vitality, Energy + gained from equipment
|
||||
int iEquipStrength = 0;
|
||||
int iEquipAgility = 0;
|
||||
int iEquipTili = 0;
|
||||
int iEquipEnergy = 0;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
GOBLIN_EQUIP_ESSENCE pDBEssence;
|
||||
|
||||
for(i=0; i< m_aEquipID.Count; i++)
|
||||
{
|
||||
pDBEssence = (GOBLIN_EQUIP_ESSENCE)pDB.get_data_ptr(m_aEquipID[i], ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
iEquipStrength += pDBEssence.strength;
|
||||
iEquipAgility += pDBEssence.agility;
|
||||
iEquipTili += pDBEssence.tili;
|
||||
iEquipEnergy += pDBEssence.energy;
|
||||
}
|
||||
|
||||
if(iIndex == 0)
|
||||
iRet = iEquipStrength + m_Essence.data.strength + m_pDBEssence.init_strength;
|
||||
else if(iIndex == 1)
|
||||
iRet = iEquipAgility + m_Essence.data.agility + m_pDBEssence.init_agility;
|
||||
else if(iIndex == 2)
|
||||
iRet = iEquipTili + m_Essence.data.vitality + m_pDBEssence.init_tili;
|
||||
else if(iIndex == 3)
|
||||
iRet = iEquipEnergy + m_Essence.data.energy + m_pDBEssence.init_energy;
|
||||
|
||||
return iRet;
|
||||
}
|
||||
uint GetDestroyExp()
|
||||
{
|
||||
double dRetExp = 0;
|
||||
int iLevel = m_Essence.data.level;
|
||||
uint iCurrExp = m_Essence.data.exp;
|
||||
double factor = 0.0f;
|
||||
|
||||
for(int i=1;i<iLevel;i++)
|
||||
{
|
||||
uint iPlayerLvlUpExp = (uint)(EC_Game.GetGameRun().GetHostPlayer().GetLevelUpExp(i) * m_pDBEssence.exp_factor);
|
||||
factor = (double)elf_exp_loss_constant[i]/(double)elf_exp_loss_constant[m_Essence.data.level];
|
||||
dRetExp += (((double)iPlayerLvlUpExp * 0.1) / factor);
|
||||
}
|
||||
|
||||
dRetExp += ((double)iCurrExp * 0.1);
|
||||
return (dRetExp>4200000000.0) ? 4200000000 : (uint)dRetExp;
|
||||
}
|
||||
// Check whether goblin can trade
|
||||
public override bool IsTradeable()
|
||||
{
|
||||
return (m_iProcType & (int)ProcType.PROC_TRADEABLE) != 0;
|
||||
}
|
||||
// Get drop model for shown
|
||||
public override string GetDropModel() => m_pDBEssence.FileMatter;
|
||||
// Get Equipment id
|
||||
public uint GetEquip(int id)
|
||||
{
|
||||
if(id<0 || id>=4)
|
||||
throw new Exception("id is out of range");
|
||||
int iEquipPos = (int)m_aEquipID[id];
|
||||
if(iEquipPos == id)
|
||||
return m_aEquipID[id];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Check whether goblin can learn specified skill
|
||||
// 0:�ɹ� 1:����SP���� 2:�����츳�㲻��
|
||||
// 3:���� 4:���ܸ������� 5:����ID
|
||||
// 6:��Ǯ���� 7:��С���鼼�� 8:û�м�����
|
||||
// 9:�ȼ����� 10:���������� 11:ְҵ��ƥ��
|
||||
// 12:���������㣬��ְҵ��ƥ��
|
||||
int CheckSkillLearnCondition(int idSkill, bool bCheckBook)
|
||||
{
|
||||
int iLevel = 1, i;
|
||||
for(i=0;i<m_aSkills.Count;i++)
|
||||
{
|
||||
if(m_aSkills[i].skill == idSkill)
|
||||
{
|
||||
iLevel = m_aSkills[i].level + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
|
||||
if (iLevel == 1 && bCheckBook)
|
||||
{
|
||||
// Do we have the skill book ?
|
||||
int idBook = ElementSkill.GetRequiredBook((uint)idSkill, iLevel);
|
||||
if ((idBook != 0) && (pHost.GetPack().FindItem(idBook) == -1))
|
||||
return 8;
|
||||
}
|
||||
|
||||
// Build player information
|
||||
GoblinRequirement Info;
|
||||
Info = new GoblinRequirement();
|
||||
|
||||
for(i=0;i<5;i++)
|
||||
{
|
||||
Info.genius[i] = GetGenius(i);
|
||||
}
|
||||
Info.profession = pHost.GetProfession();
|
||||
Info.sp = pHost.GetBasicProps().iSP;
|
||||
Info.money = (int)pHost.GetMoneyAmount();
|
||||
Info.level = m_Essence.data.level;
|
||||
Info.mp = INITIAL_MAX_VIGOR + GetBasicProp(2);
|
||||
|
||||
int iRet = ElementSkill.GoblinLearn((uint)idSkill, Info, iLevel);
|
||||
|
||||
if(iRet == 0) // success
|
||||
{
|
||||
if((GetSkillNum() > GetCurrMaxSkillNum()) ||
|
||||
(GetSkillNum() == GetCurrMaxSkillNum() && iLevel == 1))
|
||||
return 4;
|
||||
}
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
// Get genius point
|
||||
int GetGenius(int iIndex)
|
||||
{
|
||||
if(iIndex < 0 || iIndex >= 5)
|
||||
{
|
||||
throw new Exception("iIndex is out of range");
|
||||
}
|
||||
int i, iRet = m_Essence.data.genius[iIndex];
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
GOBLIN_EQUIP_ESSENCE pDBEssence;
|
||||
|
||||
for(i=0; i< m_aEquipID.Count; i++)
|
||||
{
|
||||
pDBEssence = (GOBLIN_EQUIP_ESSENCE)pDB.get_data_ptr(m_aEquipID[i], ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
iRet += pDBEssence.magic[iIndex];
|
||||
}
|
||||
|
||||
return (iRet > 8) ? 8 : iRet;
|
||||
}
|
||||
int GetCurrMaxSkillNum()
|
||||
{
|
||||
int iRandPt = GetRandomStatusPt();
|
||||
|
||||
if(iRandPt > 90)
|
||||
return 8;
|
||||
else if(iRandPt > 80)
|
||||
return 7;
|
||||
else if(iRandPt > 70)
|
||||
return 6;
|
||||
else if(iRandPt > 50)
|
||||
return 5;
|
||||
|
||||
return (int)ElfSkillNum.INIT_SKILL_NUM;
|
||||
}
|
||||
//Check whether goblin can cast specified skill
|
||||
/// <summary>
|
||||
/// implement later
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <returns></returns>
|
||||
bool CheckSkillCastCondition(int index)
|
||||
{
|
||||
return true;
|
||||
// if(index<0 || index >= m_aSkills.Count)
|
||||
// {
|
||||
// throw new Exception("index is out of range");
|
||||
// return false;
|
||||
// }
|
||||
// if (EC_Game.GetGameRun().GetHostPlayer().GetBattleInfo().IsChariotWar())
|
||||
// return false; // ս��ս�� ��ֹ���鼼��
|
||||
|
||||
|
||||
// GNET::GoblinUseRequirement Info;
|
||||
// memset(&Info, 0, sizeof(Info));
|
||||
|
||||
// for(int i=0;i<5;i++)
|
||||
// {
|
||||
// Info.genius[i] = GetGenius(i);
|
||||
// }
|
||||
|
||||
// Info.level = m_Essence.data.level;
|
||||
// Info.move_env = g_pGame->GetGameRun()->GetHostPlayer()->GetMoveEnv();
|
||||
|
||||
// GOBLINSKILL pSkill = GetSkill(index);
|
||||
// int ret = GNET::ElementSkill::GoblinCondition(pSkill.skill, Info, pSkill.level);
|
||||
|
||||
// if(ret == 4)
|
||||
// return false;
|
||||
// return true;
|
||||
}
|
||||
|
||||
int GetModelLevel()
|
||||
{
|
||||
int iGrowDegree = GetGrowDegree();
|
||||
int iRandomPt = GetRandomStatusPt();
|
||||
int iMaxPt= GetMaxStautsPt();
|
||||
int iModelLvl = 0;
|
||||
|
||||
// �ɳ��ȡ���������뼸��ģ�͵Ĺ�ϵ����������֪������ͬ������
|
||||
if(iRandomPt <= iGrowDegree*0.8)
|
||||
iModelLvl = 1;
|
||||
else if(iRandomPt <= iGrowDegree)
|
||||
iModelLvl = 2;
|
||||
else if(iRandomPt <= (iMaxPt - iGrowDegree)*0.2 + iGrowDegree)
|
||||
iModelLvl = 3;
|
||||
else
|
||||
iModelLvl = 4;
|
||||
|
||||
return iModelLvl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get current max skill number
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrGoblinEquip : EC_IvtrEquip
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrGoblinEquip(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrGoblinExpPill : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrGoblinExpPill(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrIncSkillAbility : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrIncSkillAbility(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -807,7 +807,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
var pItem = new EC_IvtrItem(tid, expire_date);
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
object data = ElementDataManProvider.GetElementDataMan().get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
Debug.Log("DataType: " + DataType);
|
||||
Debug.Log("Create item data: DataType: " + DataType);
|
||||
switch(DataType)
|
||||
{
|
||||
case DATA_TYPE.DT_WEAPON_ESSENCE:
|
||||
@@ -1199,9 +1199,11 @@ namespace BrewMonster.Scripts.Managers
|
||||
/// <summary>Add item amount. Returns new amount of item.</summary>
|
||||
public int AddAmount(int iAmount)
|
||||
{
|
||||
Debug.Log($"[EC_IvtrItem] Old Amount: {m_iCount}");
|
||||
m_iCount += iAmount;
|
||||
if (m_iCount < 0) m_iCount = 0;
|
||||
if (m_iCount > m_iPileLimit) m_iCount = m_iPileLimit;
|
||||
//if (m_iCount > m_iPileLimit) m_iCount = m_iPileLimit;
|
||||
Debug.Log($"[EC_IvtrItem] New Amount: {m_iCount}");
|
||||
return m_iCount;
|
||||
}
|
||||
|
||||
@@ -1383,6 +1385,8 @@ namespace BrewMonster.Scripts.Managers
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ERRORITEM));
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, "({0})", m_tid);
|
||||
m_strDesc += "\\r";
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_RED, false, "This Item Type is not implemented yet. Type of {0}", this.GetType().Name);
|
||||
|
||||
TrimLastReturn();
|
||||
return m_strDesc;
|
||||
@@ -1401,9 +1405,63 @@ namespace BrewMonster.Scripts.Managers
|
||||
protected virtual void AddPriceDesc(int col, bool bRepair)
|
||||
{
|
||||
// Basic price string using scaled price; color is ignored at this level.
|
||||
int price = GetScaledPrice();
|
||||
if (price <= 0) return;
|
||||
AddDescText(col, true, "Price: {0}", price);
|
||||
if ((!IsEquipment() && bRepair) || m_iPrice == 0 || m_fPriceScale == 0.0f)
|
||||
{
|
||||
TrimLastReturn();
|
||||
return;
|
||||
}
|
||||
|
||||
// use specific color for the item price
|
||||
if((int)DescriptipionMsg.ITEMDESC_COL_WHITE == col)
|
||||
{
|
||||
if( m_iPrice >= 100000000) // 100 million
|
||||
col = (int)DescriptipionMsg.ITEMDESC_COL_GREEN;
|
||||
else if ( m_iPrice >= 10000000) // 10 million
|
||||
col = (int)DescriptipionMsg.ITEMDESC_COL_DARKGOLD;
|
||||
else if ( m_iPrice >= 1000000) // 1 million
|
||||
col = (int)DescriptipionMsg.ITEMDESC_COL_YELLOW;
|
||||
}
|
||||
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
if (m_iScaleType == (int)ScaleType.SCALE_OFFLINESHOP)
|
||||
{
|
||||
AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PRICE));
|
||||
|
||||
string s1,s2;
|
||||
BuildPriceNumberStr(m_iPrice, out s1);
|
||||
if (GetCount()>1)
|
||||
{
|
||||
s2 = (m_iPrice * (long)GetCount()).ToString();
|
||||
AddDescText(-1, false, " %s (%s)", s1, s2);
|
||||
}
|
||||
else
|
||||
AddDescText(-1, false, " %s", s1);
|
||||
}
|
||||
else if (m_iScaleType == (int)ScaleType.SCALE_BOOTH || m_tid == 21652) // 21651: yinpiao
|
||||
{
|
||||
string s1;
|
||||
BuildPriceNumberStr(m_iPrice, out s1);
|
||||
|
||||
AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_UNITPRICE));
|
||||
AddDescText(-1, false, " %s", s1);
|
||||
}
|
||||
else if (m_iScaleType == (int)ScaleType.SCALE_SELL && m_iCount > 1 && m_tid != 21652)
|
||||
{
|
||||
string s1, s2;
|
||||
BuildPriceNumberStr(m_iPrice, out s1);
|
||||
BuildPriceNumberStr(GetScaledPrice(), out s2);
|
||||
|
||||
AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PRICE));
|
||||
AddDescText(-1, false, " %s (%s)", s1, s2);
|
||||
}
|
||||
else
|
||||
{
|
||||
string s1;
|
||||
BuildPriceNumberStr(GetScaledPrice(), out s1);
|
||||
|
||||
AddDescText(col, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PRICE));
|
||||
AddDescText(-1, false, " %s", s1);
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void AddProfReqDesc(uint iProfReq)
|
||||
@@ -1445,12 +1503,131 @@ namespace BrewMonster.Scripts.Managers
|
||||
|
||||
protected virtual void AddDescText(int iCol, bool bRet, string szText, params object[] args)
|
||||
{
|
||||
string line = (args != null && args.Length > 0) ? string.Format(szText, args) : szText;
|
||||
// Add color prefix if color is specified
|
||||
if (iCol >= 0)
|
||||
{
|
||||
string colorStr = GetColorString((DescriptipionMsg)iCol);
|
||||
m_strDesc += colorStr;
|
||||
}
|
||||
|
||||
string line;
|
||||
if (args != null && args.Length > 0)
|
||||
{
|
||||
// Accept both C#-style ("{0}") and printf-style ("%d", "%+d", "%.2f", "%%") formats
|
||||
if (szText.IndexOf('%') >= 0 && szText.IndexOf('{') < 0)
|
||||
{
|
||||
line = FormatPrintfLike(szText, args);
|
||||
}
|
||||
else
|
||||
{
|
||||
line = string.Format(szText, args);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
line = szText;
|
||||
}
|
||||
m_strDesc += line;
|
||||
if (bRet)
|
||||
m_strDesc += "\n";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get color string for color ID
|
||||
/// Returns color codes in ^RRGGBB format (6 hex digits) for text formatting
|
||||
/// </summary>
|
||||
protected virtual string GetColorString(DescriptipionMsg colorId)
|
||||
{
|
||||
switch (colorId)
|
||||
{
|
||||
case DescriptipionMsg.ITEMDESC_COL_WHITE: return "^FFFFFF"; // White
|
||||
case DescriptipionMsg.ITEMDESC_COL_GREEN: return "^00FF00"; // Green
|
||||
case DescriptipionMsg.ITEMDESC_COL_YELLOW: return "^FFFF00"; // Yellow
|
||||
case DescriptipionMsg.ITEMDESC_COL_DARKGOLD: return "^FF8C00"; // Dark Gold / Orange
|
||||
case DescriptipionMsg.ITEMDESC_COL_LIGHTBLUE: return "^5998FF"; // Light Blue
|
||||
case DescriptipionMsg.ITEMDESC_COL_CYANINE: return "^00FFFF"; // Cyan
|
||||
case DescriptipionMsg.ITEMDESC_COL_RED: return "^FF0000"; // Red
|
||||
case DescriptipionMsg.ITEMDESC_COL_GRAY: return "^808080"; // Gray
|
||||
default: return "^FFFFFF"; // Default to white
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Format string using printf-style format specifiers (%d, %+d, %.2f, %s, etc.)
|
||||
/// Converts printf-style formats to C# string formatting
|
||||
/// </summary>
|
||||
private static string FormatPrintfLike(string fmt, object[] args)
|
||||
{
|
||||
System.Text.StringBuilder sb = new System.Text.StringBuilder();
|
||||
int argIndex = 0;
|
||||
for (int i = 0; i < fmt.Length; i++)
|
||||
{
|
||||
char c = fmt[i];
|
||||
if (c != '%')
|
||||
{
|
||||
sb.Append(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (i + 1 < fmt.Length && fmt[i + 1] == '%')
|
||||
{
|
||||
sb.Append('%');
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
bool plus = false;
|
||||
int precision = -1;
|
||||
int j = i + 1;
|
||||
if (j < fmt.Length && fmt[j] == '+') { plus = true; j++; }
|
||||
if (j < fmt.Length && fmt[j] == '.')
|
||||
{
|
||||
// precision like %.2f
|
||||
j++;
|
||||
int start = j;
|
||||
while (j < fmt.Length && char.IsDigit(fmt[j])) j++;
|
||||
int.TryParse(fmt.Substring(start, j - start), out precision);
|
||||
}
|
||||
|
||||
if (j < fmt.Length)
|
||||
{
|
||||
char spec = fmt[j];
|
||||
if (spec == 'd')
|
||||
{
|
||||
object val = argIndex < args.Length ? args[argIndex++] : 0;
|
||||
long iv = Convert.ToInt64(val);
|
||||
string s = iv.ToString();
|
||||
if (plus && iv >= 0) s = "+" + s;
|
||||
sb.Append(s);
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
else if (spec == 'f')
|
||||
{
|
||||
object val = argIndex < args.Length ? args[argIndex++] : 0.0;
|
||||
double dv = Convert.ToDouble(val);
|
||||
string s = precision >= 0 ? dv.ToString("F" + precision) : dv.ToString("F");
|
||||
if (plus && dv >= 0) s = "+" + s;
|
||||
sb.Append(s);
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
else if (spec == 's')
|
||||
{
|
||||
object val = argIndex < args.Length ? args[argIndex++] : "";
|
||||
string s = val != null ? val.ToString() : "";
|
||||
sb.Append(s);
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: treat '%' as literal if format not recognized
|
||||
sb.Append('%');
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
// Add extend description to description string / 添加扩展描述到描述字符串
|
||||
protected void AddExtDescText()
|
||||
{
|
||||
@@ -1467,22 +1644,9 @@ namespace BrewMonster.Scripts.Managers
|
||||
var pDescTab = EC_Game.GetItemDesc();
|
||||
// Note: ITEMDESC_COL2_BRIGHTBLUE constant - adjust based on actual string table / 注意:ITEMDESC_COL2_BRIGHTBLUE常量 - 根据实际字符串表调整
|
||||
int green = (int)DescriptipionMsg.ITEMDESC_COL2_BRIGHTBLUE; // ITEMDESC_COL2_BRIGHTBLUE placeholder - adjust this value
|
||||
if(typeof(EC_IvtrArmor) == this.GetType())
|
||||
{
|
||||
Debug.Log("This is an armor");
|
||||
}
|
||||
|
||||
Debug.Log("armor m_iCID: " + m_iCID);
|
||||
Debug.Log("armor m_iProcType: " + m_iProcType);
|
||||
|
||||
if (m_iCID != (int)InventoryClassId.ICID_GOBLIN) // goblin does not need to display these special properties / 地精不需要显示这些特殊属性
|
||||
{
|
||||
Debug.Log("m_iCID != (int)InventoryClassId.ICID_GOBLIN");
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_NO_USER_TRASH: " + (m_iProcType & (int)ProcType.PROC_NO_USER_TRASH));
|
||||
Debug.Log("!((m_iProcType & (int)ProcType.PROC_BINDING) != 0): " + !((m_iProcType & (int)ProcType.PROC_BINDING) != 0));
|
||||
Debug.Log("((m_iProcType & (int)ProcType.PROC_DROPWHENDIE) != 0): " + ((m_iProcType & (int)ProcType.PROC_DROPWHENDIE) != 0));
|
||||
Debug.Log("((m_iProcType & (int)ProcType.PROC_DROPPABLE) != 0): " + ((m_iProcType & (int)ProcType.PROC_DROPPABLE) != 0));
|
||||
Debug.Log("((m_iProcType & (int)ProcType.PROC_SELLABLE) != 0): " + ((m_iProcType & (int)ProcType.PROC_SELLABLE) != 0));
|
||||
// Exact C++ logic: (PROC_NO_USER_TRASH) || (!PROC_BINDING && (PROC_DROPWHENDIE || ...))
|
||||
// 精确的C++逻辑:(PROC_NO_USER_TRASH) || (!PROC_BINDING && (PROC_DROPWHENDIE || ...))
|
||||
if ((m_iProcType & (int)ProcType.PROC_NO_USER_TRASH) != 0
|
||||
@@ -1506,8 +1670,6 @@ namespace BrewMonster.Scripts.Managers
|
||||
m_strDesc += szCol;
|
||||
}
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_DROPWHENDIE: " + (m_iProcType & (int)ProcType.PROC_DROPWHENDIE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_DROPWHENDIE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1517,10 +1679,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_DROPPABLE: " + (m_iProcType & (int)ProcType.PROC_DROPPABLE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_DROPPABLE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1530,10 +1689,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_SELLABLE: " + (m_iProcType & (int)ProcType.PROC_SELLABLE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_SELLABLE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1543,10 +1699,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_TRADEABLE: " + (m_iProcType & (int)ProcType.PROC_TRADEABLE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_TRADEABLE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1556,10 +1709,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_DISAPEAR: " + (m_iProcType & (int)ProcType.PROC_DISAPEAR));
|
||||
if ((m_iProcType & (int)ProcType.PROC_DISAPEAR) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1569,10 +1719,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_USE: " + (m_iProcType & (int)ProcType.PROC_USE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_USE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1582,10 +1729,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_DEADDROP: " + (m_iProcType & (int)ProcType.PROC_DEADDROP));
|
||||
if ((m_iProcType & (int)ProcType.PROC_DEADDROP) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1595,10 +1739,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_OFFLINE: " + (m_iProcType & (int)ProcType.PROC_OFFLINE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_OFFLINE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1608,10 +1749,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_UNREPAIRABLE: " + (m_iProcType & (int)ProcType.PROC_UNREPAIRABLE));
|
||||
if ((m_iProcType & (int)ProcType.PROC_UNREPAIRABLE) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1621,10 +1759,7 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
Debug.Log("m_iProcType: " + m_iProcType);
|
||||
Debug.Log("m_iProcType & (int)ProcType.PROC_NO_USER_TRASH: " + (m_iProcType & (int)ProcType.PROC_NO_USER_TRASH));
|
||||
if ((m_iProcType & (int)ProcType.PROC_NO_USER_TRASH) != 0)
|
||||
{
|
||||
m_strDesc += "\\r";
|
||||
@@ -1634,12 +1769,10 @@ namespace BrewMonster.Scripts.Managers
|
||||
if (!string.IsNullOrEmpty(desc))
|
||||
m_strDesc += desc;
|
||||
}
|
||||
Debug.Log("m_strDesc: " + m_strDesc);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("m_iCID == (int)InventoryClassId.ICID_GOBLIN");
|
||||
TrimLastReturn();
|
||||
}
|
||||
}
|
||||
@@ -1673,7 +1806,10 @@ namespace BrewMonster.Scripts.Managers
|
||||
protected void AddIDDescText()
|
||||
{
|
||||
// Optional: show internal id for debugging
|
||||
AddDescText(0, true, "ID: {0}", m_tid);
|
||||
#if UNITY_EDITOR
|
||||
AddDescText(0, true, "ID: {0}", m_tid);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
protected void AddBindDescText()
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrLookInfoItem : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrLookInfoItem(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,15 +1,105 @@
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using BrewMonster;
|
||||
using BrewMonster.Scripts;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
using ModelRenderer.Scripts.Common;
|
||||
using BrewMonster.Network;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrMaterial : EC_IvtrItem
|
||||
{
|
||||
protected MATERIAL_MAJOR_TYPE m_pDBMajorType;
|
||||
protected MATERIAL_SUB_TYPE m_pDBSubType;
|
||||
protected MATERIAL_ESSENCE m_pDBEssence;
|
||||
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrMaterial(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_MATERIAL;
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (MATERIAL_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_pDBMajorType = (MATERIAL_MAJOR_TYPE)pDB.get_data_ptr(m_pDBEssence.id_major_type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_pDBSubType = (MATERIAL_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_iProcType = (int)m_pDBEssence.proc_type;
|
||||
m_i64EquipMask = 0;
|
||||
m_bNeedUpdate = false;
|
||||
}
|
||||
|
||||
public EC_IvtrMaterial(EC_IvtrMaterial other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
m_pDBMajorType = other.m_pDBMajorType;
|
||||
m_pDBSubType = other.m_pDBSubType;
|
||||
}
|
||||
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 = "";
|
||||
|
||||
// Try to build item description
|
||||
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
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,15 +1,192 @@
|
||||
using BrewMonster;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
using System.Collections.Generic;
|
||||
using BrewMonster.Network;
|
||||
using BrewMonster.Scripts.Managers;
|
||||
using BrewMonster.Scripts;
|
||||
using CSNetwork.GPDataType;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
/// <summary>
|
||||
/// Medicine item class (cac loai thuoc).
|
||||
/// This is a part of CEC_IvtrConsume(C++)
|
||||
/// </summary>
|
||||
public class EC_IvtrMedicine : EC_IvtrItem
|
||||
{
|
||||
protected MEDICINE_MAJOR_TYPE m_pDBMajorType;
|
||||
protected MEDICINE_SUB_TYPE m_pDBSubType;
|
||||
protected MEDICINE_ESSENCE m_pDBEssence;
|
||||
|
||||
protected int m_iLevelReq;
|
||||
/// <summary>
|
||||
/// Create medicine item (cac loai thuoc)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrMedicine(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_MEDICINE;
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (MEDICINE_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_pDBMajorType = (MEDICINE_MAJOR_TYPE)pDB.get_data_ptr(m_pDBEssence.id_major_type, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_pDBSubType = (MEDICINE_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 = 0;
|
||||
m_iLevelReq = m_pDBEssence.require_level;
|
||||
m_iProcType = (int)m_pDBEssence.proc_type;
|
||||
m_bUseable = true;
|
||||
m_bNeedUpdate = false;
|
||||
}
|
||||
|
||||
public EC_IvtrMedicine(EC_IvtrMedicine other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
m_pDBMajorType = other.m_pDBMajorType;
|
||||
m_pDBSubType = other.m_pDBSubType;
|
||||
m_iLevelReq = other.m_iLevelReq;
|
||||
}
|
||||
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()
|
||||
{
|
||||
return m_pDBEssence.Name;
|
||||
}
|
||||
public int GetCoolTime(ref int piMax/* NULL */)
|
||||
{
|
||||
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
|
||||
if (!pHost)
|
||||
return 0;
|
||||
|
||||
int iTime = 0;
|
||||
|
||||
switch (m_pDBMajorType.id)
|
||||
{
|
||||
case 1810: iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_REJUVENATION_POTION, ref piMax); break;
|
||||
case 1794: iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_HP_POTION, ref piMax); break;
|
||||
case 1802: iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_MP_POTION, ref piMax); break;
|
||||
case 1815:
|
||||
case 2038: iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_ANTIDOTE_POTION, ref piMax); break;
|
||||
}
|
||||
|
||||
return iTime;
|
||||
}
|
||||
// Get item description text
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
m_strDesc = string.Empty;
|
||||
|
||||
BMLogger.Log("EC_IvtrMedicine: GetNormalDesc: m_iLevelReq: " + m_iLevelReq);
|
||||
// Level requirement
|
||||
if (m_iLevelReq > 0)
|
||||
{
|
||||
BMLogger.Log("EC_IvtrMedicine: m_iLevelReq: " + m_iLevelReq);
|
||||
BMLogger.Log("EC_IvtrMedicine: GetMaxLevelSofar: " + CECGameRun.Instance.GetHostPlayer().GetMaxLevelSofar());
|
||||
int col = CECGameRun.Instance.GetHostPlayer().GetMaxLevelSofar() >= m_iLevelReq ? (int)DescriptipionMsg.ITEMDESC_COL_WHITE : (int)DescriptipionMsg.ITEMDESC_COL_RED;
|
||||
AddDescText(col, true, EC_Game.GetItemDesc().GetWideString((int)DescriptipionMsg.ITEMDESC_LEVELREQ), m_iLevelReq);
|
||||
}
|
||||
|
||||
// Build effect description
|
||||
BuildEffectDesc();
|
||||
|
||||
// Price
|
||||
AddPriceDesc((int)DescriptipionMsg.ITEMDESC_COL_WHITE, bRepair);
|
||||
|
||||
// Extend description
|
||||
AddExtDescText();
|
||||
|
||||
return m_strDesc;
|
||||
}
|
||||
|
||||
// Build medicine effect description
|
||||
protected void BuildEffectDesc()
|
||||
{
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
|
||||
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_USEEFFECT));
|
||||
|
||||
switch (m_pDBMajorType.id)
|
||||
{
|
||||
case 1794: // Recruit HP
|
||||
|
||||
if (m_pDBEssence.hp_add_total > 0)
|
||||
{
|
||||
BMLogger.Log("EC_IvtrMedicine: BuildEffectDesc: m_pDBEssence.hp_add_total: " + m_pDBEssence.hp_add_total);
|
||||
BMLogger.Log("EC_IvtrMedicine: BuildEffectDesc: m_pDBEssence.hp_add_time: " + m_pDBEssence.hp_add_time);
|
||||
if (m_pDBEssence.hp_add_time > 0)
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ADDHPINTIME), m_pDBEssence.hp_add_time, m_pDBEssence.hp_add_total);
|
||||
else
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_RECRUITHP), m_pDBEssence.hp_add_total);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 1802: // Recruit MP
|
||||
|
||||
if (m_pDBEssence.mp_add_total > 0)
|
||||
{
|
||||
if (m_pDBEssence.mp_add_time > 0)
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ADDMPINTIME), m_pDBEssence.mp_add_time, m_pDBEssence.mp_add_total);
|
||||
else
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_RECRUITMP), m_pDBEssence.mp_add_total);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 1810: // Recruit HP and MP
|
||||
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_RECRUITHPMP), m_pDBEssence.hp_add_total, m_pDBEssence.mp_add_total);
|
||||
break;
|
||||
|
||||
case 1815:
|
||||
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DECHALFPOISON));
|
||||
break;
|
||||
|
||||
case 2038:
|
||||
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ANTIDOTE));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
BMLogger.LogError("EC_IvtrMedicine: Unknown major type: " + m_pDBMajorType.id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Check item use condition
|
||||
protected bool CheckUseCondition()
|
||||
{
|
||||
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
|
||||
|
||||
if (pHost.GetMaxLevelSofar() < m_iLevelReq)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get drop model for shown
|
||||
public override string GetDropModel()
|
||||
{
|
||||
return m_pDBEssence.FileMatter;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrMoneyConvertible : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrMoneyConvertible(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrMonsterSpirit : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrMonsterSpirit(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,15 +1,360 @@
|
||||
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 struct PETSKILL
|
||||
{
|
||||
public int idSkill;
|
||||
public int iLevel;
|
||||
};
|
||||
/// <summary>
|
||||
/// Class for Pet Egg(cac loai trung pet(thu cuoi, chien dau, di theo, p2w pet)). This is a part of IvtrPetItem(C++)
|
||||
/// </summary>
|
||||
public class EC_IvtrPetEgg : EC_IvtrItem
|
||||
{
|
||||
List<PETSKILL> m_aSkills;
|
||||
|
||||
IVTR_ESSENCE_PETEGG m_Essence;
|
||||
string m_strName;
|
||||
|
||||
// Data in database
|
||||
PET_EGG_ESSENCE m_pDBEssence;
|
||||
PET_ESSENCE m_pPetEssence;
|
||||
PET_ESSENCE m_pEvoPetEssence;
|
||||
PET_EVOLVED_SKILL_CONFIG m_pEvoNatureConfig;
|
||||
_evo_prop m_EvoProp; // ������̳�����
|
||||
/// <summary>
|
||||
/// Constructor for Pet Egg(cac loai trung pet(thu cuoi, chien dau, di theo, p2w pet))
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrPetEgg(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_PETEGG;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (PET_EGG_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_pPetEssence = (PET_ESSENCE)pDB.get_data_ptr((uint)m_pDBEssence.id_pet, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
// ASSERT(m_pPetEssence);
|
||||
|
||||
//struct can't be null
|
||||
//m_pEvoPetEssence = null;
|
||||
m_pEvoPetEssence = new PET_ESSENCE();
|
||||
if (m_pPetEssence.id >=0)
|
||||
{
|
||||
object pTempDBEssenceObj = pDB.get_data_ptr((uint)m_pPetEssence.id_pet_egg_evolved, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
if (pTempDBEssenceObj != null)
|
||||
{
|
||||
PET_EGG_ESSENCE pTempDBEssence = (PET_EGG_ESSENCE)pTempDBEssenceObj;
|
||||
if (pTempDBEssence.id >=0)
|
||||
{
|
||||
object pEvoPetEssenceObj = pDB.get_data_ptr((uint)pTempDBEssence.id_pet, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
if (pEvoPetEssenceObj != null)
|
||||
m_pEvoPetEssence = (PET_ESSENCE)pEvoPetEssenceObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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 = USE_PERSIST;
|
||||
|
||||
m_Essence = new IVTR_ESSENCE_PETEGG();
|
||||
m_EvoProp = new _evo_prop{
|
||||
r_attack = 0,
|
||||
r_defense = 0,
|
||||
r_hp = 0,
|
||||
r_atk_lvl = 0,
|
||||
r_def_lvl = 0,
|
||||
nature = 0
|
||||
};
|
||||
|
||||
m_pEvoNatureConfig = new PET_EVOLVED_SKILL_CONFIG();
|
||||
}
|
||||
|
||||
public EC_IvtrPetEgg(EC_IvtrPetEgg other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
m_pPetEssence = other.m_pPetEssence;
|
||||
m_Essence = other.m_Essence;
|
||||
m_strName = other.m_strName;
|
||||
|
||||
// Copy skills
|
||||
int i, iNumSkill = other.m_aSkills.Count;
|
||||
m_aSkills = new List<PETSKILL>(iNumSkill);
|
||||
|
||||
for (i=0; i < iNumSkill; i++)
|
||||
m_aSkills[i] = other.m_aSkills[i];
|
||||
|
||||
m_EvoProp = other.m_EvoProp;
|
||||
m_pEvoNatureConfig = other.m_pEvoNatureConfig;
|
||||
m_pEvoPetEssence = other.m_pEvoPetEssence;
|
||||
}
|
||||
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);
|
||||
m_Essence = new IVTR_ESSENCE_PETEGG(dr.ReadData(Marshal.SizeOf<IVTR_ESSENCE_PETEGG>()));
|
||||
|
||||
if (m_Essence.name_len != 0)
|
||||
{
|
||||
m_strName = ByteToStringUtils.UshortArrayToUnicodeString(m_Essence.name);
|
||||
EC_Game.GetGameRun().GetUIManager().FilterBadWords(m_strName);
|
||||
}
|
||||
|
||||
m_aSkills = new List<PETSKILL>(m_Essence.skill_count);
|
||||
for (int i=0; i < m_Essence.skill_count; i++)
|
||||
{
|
||||
PETSKILL s = new PETSKILL();
|
||||
s.idSkill = dr.ReadInt();
|
||||
s.iLevel = dr.ReadInt();
|
||||
m_aSkills.Add(s);
|
||||
}
|
||||
|
||||
if (m_Essence.pet_class == (int)GP_PET_TYPE.GP_PET_CLASS_EVOLUTION)
|
||||
{
|
||||
m_EvoProp.r_attack = dr.ReadInt();
|
||||
m_EvoProp.r_defense = dr.ReadInt();
|
||||
m_EvoProp.r_hp = dr.ReadInt();
|
||||
m_EvoProp.r_atk_lvl = dr.ReadInt();
|
||||
m_EvoProp.r_def_lvl = dr.ReadInt();
|
||||
m_EvoProp.nature = dr.ReadInt();
|
||||
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
object pDBData = pDB.get_data_ptr((uint)m_EvoProp.nature, ID_SPACE.ID_SPACE_CONFIG, ref DataType);
|
||||
if (pDBData != null && DataType == DATA_TYPE.DT_PET_EVOLVED_SKILL_CONFIG)
|
||||
m_pEvoNatureConfig = (PET_EVOLVED_SKILL_CONFIG)pDBData;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError("EC_IvtrPetEgg::SetItemInfo, data read error (" + e.GetType() + e.StackTrace + ")");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
public override string GetIconFile()
|
||||
{
|
||||
return m_pDBEssence.FileIcon;
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
string szDesc = "";
|
||||
switch (m_Essence.pet_class)
|
||||
{
|
||||
case (int)GP_PET_TYPE.GP_PET_CLASS_MOUNT: szDesc = GetRidingPetDesc(bRepair); break;
|
||||
case (int)GP_PET_TYPE.GP_PET_CLASS_COMBAT: szDesc = GetCombatPetDesc(bRepair); break;
|
||||
case (int)GP_PET_TYPE.GP_PET_CLASS_FOLLOW: szDesc = GetFollowPetDesc(bRepair); break;
|
||||
case (int)GP_PET_TYPE.GP_PET_CLASS_EVOLUTION:szDesc = GetEvolutionPetDesc(bRepair); break;
|
||||
}
|
||||
|
||||
return szDesc;
|
||||
}
|
||||
private string GetRidingPetDesc(bool bRepair)
|
||||
{
|
||||
Debug.Log("GetRidingPetDesc. This is not implemented yet.");
|
||||
return "";
|
||||
}
|
||||
private string GetCombatPetDesc(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: always use the name in template
|
||||
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();
|
||||
|
||||
AddBindDescText();
|
||||
|
||||
AddExpireTimeDesc();
|
||||
|
||||
// Food type requirement
|
||||
AddFoodTypeDesc();
|
||||
|
||||
if (m_pPetEssence.id != 0)
|
||||
{
|
||||
// Pet level
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PETLEVEL), m_Essence.level);
|
||||
|
||||
// Physical damage
|
||||
int iVal = (int)(((PET_ESSENCE)m_pPetEssence).damage_a * (((PET_ESSENCE)m_pPetEssence).damage_b * m_Essence.level * m_Essence.level + ((PET_ESSENCE)m_pPetEssence).damage_c * m_Essence.level + ((PET_ESSENCE)m_pPetEssence).damage_d));
|
||||
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DAMAGE), iVal);
|
||||
|
||||
// Attack speed
|
||||
AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ATKSPEED));
|
||||
AddDescText(-1, true, " %.2f", 1.0f / ((PET_ESSENCE)m_pPetEssence).attack_speed);
|
||||
|
||||
//Attack rating
|
||||
iVal = (int)(((PET_ESSENCE)m_pPetEssence).attack_a * (m_Essence.level - ((PET_ESSENCE)m_pPetEssence).attack_b * ((PET_ESSENCE)m_pPetEssence).level_require + ((PET_ESSENCE)m_pPetEssence).attack_c));
|
||||
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ATTACKRATE), iVal);
|
||||
|
||||
// Physical defence
|
||||
iVal = (int)(((PET_ESSENCE)m_pPetEssence).physic_defence_a * (((PET_ESSENCE)m_pPetEssence).physic_defence_b * (m_Essence.level - ((PET_ESSENCE)m_pPetEssence).physic_defence_c * ((PET_ESSENCE)m_pPetEssence).level_require) + ((PET_ESSENCE)m_pPetEssence).physic_defence_d));
|
||||
AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PHYDEFENCE));
|
||||
AddDescText(-1, true, " %d", iVal);
|
||||
|
||||
// Magic defence
|
||||
iVal = (int)(((PET_ESSENCE)m_pPetEssence).magic_defence_a * (((PET_ESSENCE)m_pPetEssence).magic_defence_b * (m_Essence.level - ((PET_ESSENCE)m_pPetEssence).magic_defence_c * ((PET_ESSENCE)m_pPetEssence).level_require) + ((PET_ESSENCE)m_pPetEssence).magic_defence_d));
|
||||
AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ALLMAGICDEF));
|
||||
AddDescText(-1, true, " %d", iVal);
|
||||
|
||||
// Dodge
|
||||
iVal = (int)(((PET_ESSENCE)m_pPetEssence).armor_a * (m_Essence.level - ((PET_ESSENCE)m_pPetEssence).armor_b * ((PET_ESSENCE)m_pPetEssence).level_require + ((PET_ESSENCE)m_pPetEssence).armor_c));
|
||||
AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_DODGE));
|
||||
AddDescText(-1, true, " %d", iVal);
|
||||
|
||||
// hp
|
||||
iVal = (int)(((PET_ESSENCE)m_pPetEssence).hp_a * (m_Essence.level - ((PET_ESSENCE)m_pPetEssence).hp_b * ((PET_ESSENCE)m_pPetEssence).level_require + ((PET_ESSENCE)m_pPetEssence).hp_c));
|
||||
AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ADDHP));
|
||||
AddDescText(-1, true, " %d", iVal);
|
||||
|
||||
// Profession requirement
|
||||
AddProfReqDesc(((PET_ESSENCE)m_pPetEssence).character_combo_id);
|
||||
}
|
||||
|
||||
// Level requirement
|
||||
int iLevelReq = Mathf.Max((int)m_Essence.level, m_Essence.req_level);
|
||||
if (iLevelReq > 0)
|
||||
{
|
||||
int col = pHost.GetMaxLevelSofar() >= iLevelReq ? white : red;
|
||||
AddDescText(col, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVELREQ), iLevelReq);
|
||||
}
|
||||
|
||||
// Skill list
|
||||
for (int i=0; i < m_aSkills.Count; i++)
|
||||
{
|
||||
PETSKILL skill = m_aSkills[i];
|
||||
string szName = EC_Game.GetSkillDesc().GetWideString(skill.idSkill * 10);
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_YELLOW, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PETSKILL), szName != null ? szName : "", skill.iLevel);
|
||||
|
||||
}
|
||||
|
||||
// �ɽ���
|
||||
if (m_pEvoPetEssence.id != 0)
|
||||
{
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_PET_EVO_NAME), ByteToStringUtils.UshortArrayToUnicodeString(((PET_ESSENCE)m_pEvoPetEssence).name));
|
||||
}
|
||||
|
||||
// Price
|
||||
AddPriceDesc(white, bRepair);
|
||||
|
||||
// Extend description
|
||||
AddExtDescText();
|
||||
|
||||
return m_strDesc;
|
||||
}
|
||||
private string GetFollowPetDesc(bool bRepair)
|
||||
{
|
||||
Debug.Log("[THN]GetFollowPetDesc. This is not implemented yet.");
|
||||
return "";
|
||||
}
|
||||
private string GetEvolutionPetDesc(bool bRepair)
|
||||
{
|
||||
Debug.Log("[THN]GetEvolutionPetDesc. This is not implemented yet.");
|
||||
return "";
|
||||
}
|
||||
private void AddFoodTypeDesc()
|
||||
{
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
object pPetEssence = pDB.get_data_ptr((uint)m_Essence.pet_tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
if (pPetEssence == null)
|
||||
return;
|
||||
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
AddDescText((int)DescriptipionMsg.ITEMDESC_COL_WHITE, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_FOODTYPE));
|
||||
|
||||
for (int i=0; i < (int)PetFoodType.MAX_PET_FOOD; i++)
|
||||
{
|
||||
if ((((PET_ESSENCE)pPetEssence).food_mask & (1 << i)) != 0)
|
||||
{
|
||||
m_strDesc += " ";
|
||||
AddDescText(-1, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_FOOD_GRASS+i));
|
||||
}
|
||||
}
|
||||
|
||||
m_strDesc += "\\r";
|
||||
}
|
||||
// Get item description for booth buying
|
||||
protected override string GetBoothBuyDesc()
|
||||
{
|
||||
m_strDesc = "";
|
||||
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
|
||||
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
|
||||
|
||||
// Item name
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), ByteToStringUtils.UshortArrayToUnicodeString(m_pDBEssence.name));
|
||||
|
||||
// Price
|
||||
AddPriceDesc(white, false);
|
||||
|
||||
return m_strDesc;
|
||||
}
|
||||
|
||||
// Get drop model for shown
|
||||
public override string GetDropModel()
|
||||
{
|
||||
return ByteToStringUtils.ByteArrayToCP936String(m_pDBEssence.file_matter);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrPetFaceTicket : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrPetFaceTicket(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,15 +1,152 @@
|
||||
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_IvtrPetFood : EC_IvtrItem
|
||||
{
|
||||
|
||||
protected PET_FOOD_ESSENCE m_pDBEssence;
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrPetFood(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_PETFOOD;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (PET_FOOD_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_bNeedUpdate = false;
|
||||
}
|
||||
|
||||
public EC_IvtrPetFood(EC_IvtrPetFood 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 cool time
|
||||
public int GetCoolTime(ref int piMax)
|
||||
{
|
||||
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
|
||||
if (!pHost)
|
||||
return 0;
|
||||
|
||||
int iTime = pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_FEED_PET, ref piMax);
|
||||
return iTime;
|
||||
}
|
||||
|
||||
// Check item use condition
|
||||
public override bool CheckUseCondition()
|
||||
{
|
||||
CECPetData pPet = EC_Game.GetGameRun().GetHostPlayer().GetPetCorral().GetActivePet();
|
||||
if (pPet == null)
|
||||
return false;
|
||||
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
|
||||
object temp = ElementDataManProvider.GetElementDataMan().get_data_ptr((uint)pPet.GetTemplateID(), ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
|
||||
if (temp == null)
|
||||
return false;
|
||||
PET_ESSENCE pPetEssence = (PET_ESSENCE)temp;
|
||||
|
||||
return ((m_pDBEssence.food_type & pPetEssence.food_mask) != 0) ? true : false;
|
||||
}
|
||||
|
||||
// Get item description text
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
m_strDesc = "";
|
||||
|
||||
// Try to build item description
|
||||
CECStringTab pDescTab = EC_Game.GetItemDesc();
|
||||
int white = (int)DescriptipionMsg.ITEMDESC_COL_WHITE;
|
||||
int namecol = DecideNameCol();
|
||||
|
||||
// Item name
|
||||
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();
|
||||
|
||||
// Food type
|
||||
for (int i=0; i < (int)PetFoodType.MAX_PET_FOOD; i++)
|
||||
{
|
||||
if ((m_pDBEssence.food_type & (1 << i)) != 0)
|
||||
{
|
||||
AddDescText(white, false, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_FOODTYPE));
|
||||
m_strDesc += " ";
|
||||
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_FOOD_GRASS+i));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Price
|
||||
AddPriceDesc(white, bRepair);
|
||||
|
||||
// Extend description
|
||||
AddExtDescText();
|
||||
|
||||
return m_strDesc;
|
||||
}
|
||||
|
||||
// Get drop model for shown
|
||||
public override string GetDropModel()
|
||||
{
|
||||
return m_pDBEssence.FileMatter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrRecipe : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrRecipe(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrRefineTicket : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrRefineTicket(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrRevScroll : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrRevScroll(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrSharpener : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrSharpener(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrShopToken : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrShopToken(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrSkillMat : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrSkillMat(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,15 +1,116 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
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;
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
/// <summary>
|
||||
/// Skill tome item class(sach ky nang). This is a part of CEC_IvtrScroll(C++)
|
||||
/// </summary>
|
||||
public class EC_IvtrSkilltome : EC_IvtrItem
|
||||
{
|
||||
|
||||
protected SKILLTOME_ESSENCE m_pDBEssence;
|
||||
protected SKILLTOME_SUB_TYPE m_pDBSubType;
|
||||
/// <summary>
|
||||
/// Create skill tome item(sach ky nang)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrSkilltome(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_SKILLTOME;
|
||||
|
||||
// Get database data
|
||||
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
|
||||
DATA_TYPE DataType = DATA_TYPE.DT_INVALID;
|
||||
m_pDBEssence = (SKILLTOME_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE, ref DataType);
|
||||
m_pDBSubType = (SKILLTOME_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_iProcType = (int)m_pDBEssence.proc_type;
|
||||
m_i64EquipMask = 0;
|
||||
m_bNeedUpdate = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copy constructor for skill tome item(sach ky nang)
|
||||
/// </summary>
|
||||
/// <param name="other">Other skill tome item</param>
|
||||
public EC_IvtrSkilltome(EC_IvtrSkilltome other) : base(other)
|
||||
{
|
||||
m_pDBEssence = other.m_pDBEssence;
|
||||
m_pDBSubType = other.m_pDBSubType;
|
||||
}
|
||||
|
||||
public override bool SetItemInfo(byte[] pInfoData, int iDataLen)
|
||||
{
|
||||
base.SetItemInfo(pInfoData, iDataLen);
|
||||
return true;
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
protected override string GetNormalDesc(bool bRepair)
|
||||
{
|
||||
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();
|
||||
|
||||
// Price
|
||||
AddPriceDesc(white, bRepair);
|
||||
|
||||
// Extend description
|
||||
AddExtDescText();
|
||||
|
||||
return m_strDesc;
|
||||
}
|
||||
|
||||
public override string GetDropModel()
|
||||
{
|
||||
return m_pDBEssence.FileMatter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrSpeaker : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrSpeaker(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrStone : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrStone(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTargetItem : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTargetItem(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTaskDice : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTaskDice(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTaskNmMatter : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTaskNmMatter(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTaskmatter : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTaskmatter(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTossMat : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTossMat(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTownscroll : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTownscroll(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrTransmitScroll : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrTransmitScroll(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using UnityEngine;
|
||||
using ModelRenderer.Scripts.GameData;
|
||||
using BrewMonster;
|
||||
@@ -95,11 +96,11 @@ namespace BrewMonster.Scripts.Managers
|
||||
};
|
||||
public struct IVTR_ESSENCE_DECORATION
|
||||
{
|
||||
int damage;
|
||||
int magic_damage;
|
||||
int defense;
|
||||
int armor;
|
||||
int[] resistance;
|
||||
public int damage;
|
||||
public int magic_damage;
|
||||
public int defense;
|
||||
public int armor;
|
||||
public int[] resistance;
|
||||
public IVTR_ESSENCE_DECORATION(byte[] data)
|
||||
{
|
||||
Debug.Log("IVTR_ESSENCE_DECORATION: data.Length: " + data.Length);
|
||||
@@ -168,33 +169,65 @@ namespace BrewMonster.Scripts.Managers
|
||||
};
|
||||
public struct IVTR_ESSENCE_AUTOHP
|
||||
{
|
||||
// TODO : implement data later
|
||||
// int hp_left;
|
||||
// float trigger;
|
||||
public int hp_left;
|
||||
public float trigger;
|
||||
public IVTR_ESSENCE_AUTOHP(byte[] data)
|
||||
{
|
||||
CECDataReader dr = new (data, data.Length);
|
||||
hp_left = dr.ReadInt();
|
||||
trigger = dr.ReadFloat();
|
||||
}
|
||||
};
|
||||
public struct IVTR_ESSENCE_AUTOMP
|
||||
{
|
||||
// TODO : implement data later
|
||||
// int mp_left;
|
||||
// float trigger;
|
||||
public int mp_left;
|
||||
public float trigger;
|
||||
public IVTR_ESSENCE_AUTOMP(byte[] data)
|
||||
{
|
||||
CECDataReader dr = new (data, data.Length);
|
||||
mp_left = dr.ReadInt();
|
||||
trigger = dr.ReadFloat();
|
||||
}
|
||||
};
|
||||
public struct IVTR_ESSENCE_PETEGG
|
||||
{
|
||||
// TODO : implement data later
|
||||
// int req_level;
|
||||
// int req_class;
|
||||
// int honor_point;
|
||||
// int pet_tid;
|
||||
// int pet_vis_tid;
|
||||
// int pet_egg_tid;
|
||||
// int pet_class;
|
||||
// short level;
|
||||
// unsigned short color;
|
||||
// int exp;
|
||||
// int skill_point;
|
||||
// unsigned short name_len;
|
||||
// unsigned short skill_count;
|
||||
// wchar_t name[8];
|
||||
public int req_level;
|
||||
public int req_class;
|
||||
public int honor_point;
|
||||
public int pet_tid;
|
||||
public int pet_vis_tid;
|
||||
public int pet_egg_tid;
|
||||
public int pet_class;
|
||||
public short level;
|
||||
public ushort color;
|
||||
public int exp;
|
||||
public int skill_point;
|
||||
public ushort name_len;
|
||||
public ushort skill_count;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public ushort[] name;
|
||||
public IVTR_ESSENCE_PETEGG(byte[] data)
|
||||
{
|
||||
CECDataReader dr = new (data, data.Length);
|
||||
req_level = dr.ReadInt();
|
||||
req_class = dr.ReadInt();
|
||||
honor_point = dr.ReadInt();
|
||||
pet_tid = dr.ReadInt();
|
||||
pet_vis_tid = dr.ReadInt();
|
||||
pet_egg_tid = dr.ReadInt();
|
||||
pet_class = dr.ReadInt();
|
||||
level = dr.ReadShort();
|
||||
color = dr.ReadUShort();
|
||||
exp = dr.ReadInt();
|
||||
skill_point = dr.ReadInt();
|
||||
name_len = dr.ReadUShort();
|
||||
skill_count = dr.ReadUShort();
|
||||
name = new ushort[8];
|
||||
for(int i = 0; i < 8; i++)
|
||||
{
|
||||
name[i] = dr.ReadUShort();
|
||||
}
|
||||
}
|
||||
};
|
||||
public struct IVTR_ESSENCE_DESTROYING
|
||||
{
|
||||
@@ -203,22 +236,54 @@ namespace BrewMonster.Scripts.Managers
|
||||
};
|
||||
public struct IVTR_ESSENCE_GOBLIN
|
||||
{
|
||||
struct _GOBLIN_DATA
|
||||
public struct _GOBLIN_DATA
|
||||
{
|
||||
// TODO : implement data later
|
||||
// unsigned int exp;
|
||||
// short level;
|
||||
// short total_attribute;
|
||||
// short strength;
|
||||
// short agility;
|
||||
// short vitality;
|
||||
// short energy;
|
||||
// short total_genius;
|
||||
// short genius[5];
|
||||
// short refine_level;
|
||||
// int stamina;
|
||||
// int status_value;
|
||||
};
|
||||
public uint exp;
|
||||
public short level;
|
||||
public short total_attribute;
|
||||
public short strength;
|
||||
public short agility;
|
||||
public short vitality;
|
||||
public short energy;
|
||||
public short total_genius;
|
||||
public short[] genius ;
|
||||
public short refine_level;
|
||||
public int stamina;
|
||||
public int status_value;
|
||||
public _GOBLIN_DATA(byte[] data)
|
||||
{
|
||||
CECDataReader dr = new (data, data.Length);
|
||||
exp = dr.ReadUInt();
|
||||
level = dr.ReadShort();
|
||||
total_attribute = dr.ReadShort();
|
||||
strength = dr.ReadShort();
|
||||
agility = dr.ReadShort();
|
||||
vitality = dr.ReadShort();
|
||||
energy = dr.ReadShort();
|
||||
total_genius = dr.ReadShort();
|
||||
genius = new short[5];
|
||||
for(int i = 0; i < 5; i++)
|
||||
{
|
||||
genius[i] = dr.ReadShort();
|
||||
}
|
||||
refine_level = dr.ReadShort();
|
||||
stamina = dr.ReadInt();
|
||||
status_value = dr.ReadInt();
|
||||
}
|
||||
}
|
||||
public _GOBLIN_DATA data;
|
||||
public int equip_cnt;
|
||||
public int skill_cnt;
|
||||
public IVTR_ESSENCE_GOBLIN(byte[] data)
|
||||
{
|
||||
CECDataReader dr = new (data, data.Length);
|
||||
// Calculate size manually: uint(4) + 7*short(14) + short[5](10) + short(2) + 2*int(8) = 40 bytes
|
||||
const int GOBLIN_DATA_SIZE = 40;
|
||||
this.data = new _GOBLIN_DATA(dr.ReadData(GOBLIN_DATA_SIZE));
|
||||
equip_cnt = dr.ReadInt();
|
||||
skill_cnt = dr.ReadInt();
|
||||
}
|
||||
|
||||
// TODO : implement data later
|
||||
// _GOBLIN_DATA data;
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrUnionscroll : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrUnionscroll(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrUniversalToken : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrUniversalToken(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrUnknown : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrUnknown(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrWarTankCallin : EC_IvtrItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrWarTankCallin(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -64,7 +64,9 @@ using BrewMonster.Scripts;
|
||||
|
||||
namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Weapon item class (cac loai vu khi)
|
||||
/// </summary>
|
||||
public class EC_IvtrWeapon : EC_IvtrEquip
|
||||
{
|
||||
//Attributes
|
||||
@@ -75,6 +77,10 @@ namespace PerfectWorld.Scripts.Managers
|
||||
protected WEAPON_SUB_TYPE m_pDBSubType;
|
||||
protected WEAPON_ESSENCE m_pDBEssence;
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for weapon item (cac loai vu khi)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
public EC_IvtrWeapon(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
m_iCID = (int)InventoryClassId.ICID_WEAPON;
|
||||
@@ -126,7 +132,6 @@ namespace PerfectWorld.Scripts.Managers
|
||||
dr.Offset(iMakerLen, CECDataReader.SEEK_CUR);
|
||||
byte[] iEssenceData = dr.ReadData(iEssenceSize);
|
||||
m_Essence = new IVTR_ESSENCE_WEAPON(iEssenceData);
|
||||
BMLogger.Log("[thn] weapon addon m_Essence: " + m_Essence.ToString());
|
||||
// ���븽������˵��
|
||||
if(m_pDBEssence.fixed_props != 0 && m_pDBEssence.probability_addon_num0 != 1.0f)
|
||||
{
|
||||
@@ -293,7 +298,7 @@ namespace PerfectWorld.Scripts.Managers
|
||||
AddDestroyingDesc((int)m_pDBEssence.id_drop_after_damaged, m_pDBEssence.num_drop_after_damaged);
|
||||
AddExpireTimeDesc();
|
||||
// Sub class name
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_CLASSNAME), m_pDBSubType.name.ToString());
|
||||
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_CLASSNAME), m_pDBSubType.Name);
|
||||
// Weapon level
|
||||
AddDescText(-1, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_LEVEL), m_Essence.weapon_level);
|
||||
// Attack speed
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrWeddingBookCard : EC_IvtrEquip
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrWeddingBookCard(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrWeddingInviteCard : EC_IvtrEquip
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrWeddingInviteCard(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -3,6 +3,11 @@ namespace PerfectWorld.Scripts.Managers
|
||||
{
|
||||
public class EC_IvtrWing : EC_IvtrEquip
|
||||
{
|
||||
/// <summary>
|
||||
/// Not create logic yet (add summary later)
|
||||
/// </summary>
|
||||
/// <param name="tid">Template id</param>
|
||||
/// <param name="expire_date">Expire date</param>
|
||||
public EC_IvtrWing(int tid, int expire_date) : base(tid, expire_date)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
using CSNetwork.GPDataType;
|
||||
using PerfectWorld.Scripts;
|
||||
using BrewMonster;
|
||||
using BrewMonster.Scripts;
|
||||
|
||||
public struct PETSKILL
|
||||
{
|
||||
public int idSkill;
|
||||
public int iLevel;
|
||||
public int iCoolCnt;
|
||||
public int iCoolMax;
|
||||
};
|
||||
|
||||
public enum SkillType
|
||||
{
|
||||
EM_SKILL_DEFAULT = 0, // �������Ը���
|
||||
EM_SKILL_NORMAL, // ��ͨ����
|
||||
EM_SKILL_NATURE, // �Ը���
|
||||
EM_SKILL_SPECIAL, // ר������
|
||||
}
|
||||
public class EC_PetCorral
|
||||
{
|
||||
public enum MaxSlotNum
|
||||
{
|
||||
MAX_SLOTNUM = 20, // ��ͨ����������
|
||||
MAX_SLOTNUM2 = 21, // �����������
|
||||
};
|
||||
// Moving mode
|
||||
public enum MoveMode
|
||||
{
|
||||
MOVE_FOLLOW = 0,
|
||||
MOVE_STAND,
|
||||
};
|
||||
|
||||
// Attacking mode
|
||||
public enum AttackMode
|
||||
{
|
||||
ATK_DEFENSE = 0,
|
||||
ATK_POSITIVE,
|
||||
ATK_PASSIVE,
|
||||
};
|
||||
protected int m_iIntimacy; // �øж�
|
||||
protected int m_iHunger; // ������
|
||||
protected int m_tid; // ������ID
|
||||
protected int m_tidVis; // ���������ģ��ID�����Ϊ0�����ʾ������ɼ�ID��
|
||||
protected int m_idEgg; // ���ﵰ��ID
|
||||
protected int m_iClass; // �������� ս�裬��裬���ͳ�
|
||||
protected float m_fHPFactor; // Ѫ��������������ջ�ʱʹ�ã� 0��Ϊ����
|
||||
protected float m_fMPFactor; // MP��������������ջ�ʱʹ�ã� 0��Ϊ����
|
||||
protected int m_iLevel; // ���V��
|
||||
protected bool m_isBind; // �Ƿ����˺�һ
|
||||
protected bool m_canWebTrade; // �Ƿ�Ѱ�����ɽ���
|
||||
protected ushort m_color; // ���Ⱦɫ��ɫ����λΪ1ʱ��Ч
|
||||
protected int m_iExp; // ���ﵱǰ����
|
||||
protected int m_iSkillPt; // ʣ�༼�ܵ�
|
||||
protected string m_strName;
|
||||
|
||||
protected int m_iHP; // Only fight pets have this
|
||||
protected int m_iMP;
|
||||
protected PETSKILL[] m_aSkills = new PETSKILL[(int)GP_PET_SKILL_NUM.GP_PET_SKILL_NUM];
|
||||
|
||||
protected int[] m_vecNorSkillIndex; // ��ֹ�Ը��ܺ���ͨ����˳����ҵ���������漼���� m_aSkills������
|
||||
protected int[] m_vecDynSkillIndex;
|
||||
protected int m_iSpecialSkillIndex; // ����ר��������m_aSkills�����ţ�ֻ�н�������һ���˼���
|
||||
|
||||
protected CECCounter m_cntAutoSkill;
|
||||
protected int[] m_aAutoSkills;
|
||||
|
||||
protected ROLEEXTPROP m_ExtProps;
|
||||
protected PET_ESSENCE m_pDBEssence = new PET_ESSENCE();
|
||||
|
||||
protected int m_iAtkRation;
|
||||
protected int m_iDefRation;
|
||||
protected int m_iHpRation;
|
||||
protected int m_iAtkLvlRation;
|
||||
protected int m_iDefLvlRation;
|
||||
protected int m_iNature;
|
||||
public CECPetData GetActivePet()
|
||||
{
|
||||
//Place holder for ivtrPetFood
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public class CECPetData
|
||||
{
|
||||
#region enum
|
||||
public enum HungerLevel
|
||||
{
|
||||
HUNGER_LEVEL_0, // ��ʳ
|
||||
HUNGER_LEVEL_1, // ����
|
||||
HUNGER_LEVEL_2, // ���̶�һ��
|
||||
HUNGER_LEVEL_3,
|
||||
HUNGER_LEVEL_4, // ���̶ȶ���
|
||||
HUNGER_LEVEL_5,
|
||||
HUNGER_LEVEL_6,
|
||||
HUNGER_LEVEL_7, // ���̶�����
|
||||
HUNGER_LEVEL_8,
|
||||
HUNGER_LEVEL_9,
|
||||
HUNGER_LEVEL_10,
|
||||
HUNGER_LEVEL_11, // ���̶��ļ�
|
||||
HUNGER_LEVEL_COUNT,
|
||||
};
|
||||
// Intimacy level
|
||||
public enum IntimacyLevel
|
||||
{
|
||||
INTIMACY_LEVEL_0, // Ұ����ѱ, 0-50
|
||||
INTIMACY_LEVEL_1, // ������, 51-150
|
||||
INTIMACY_LEVEL_2, // ��������, 151-500
|
||||
INTIMACY_LEVEL_3, // ������, 501-999
|
||||
INTIMACY_LEVEL_COUNT,
|
||||
INTIMACY_POINT_MAX = 999,
|
||||
};
|
||||
#endregion
|
||||
|
||||
public int GetTemplateID()
|
||||
{
|
||||
//Place holder for ivtrPetFood
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c41c880dbc2344f819944899348d5124
|
||||
@@ -2195,5 +2195,89 @@ namespace CSNetwork.GPDataType
|
||||
return buf_size >= sz;
|
||||
}
|
||||
};
|
||||
|
||||
// Pet type
|
||||
public enum GP_PET_TYPE
|
||||
{
|
||||
GP_PET_CLASS_INVALID = -1,
|
||||
GP_PET_CLASS_MOUNT = 0, // ���
|
||||
GP_PET_CLASS_COMBAT, // ս������
|
||||
GP_PET_CLASS_FOLLOW, // �������
|
||||
GP_PET_CLASS_SUMMON, // �ٻ�����
|
||||
GP_PET_CLASS_PLANT, // ֲ�ֻ��Ϊ�˺ͷ�������ֵ����һ�£��ͻ���û���õ�
|
||||
GP_PET_CLASS_EVOLUTION, // ������
|
||||
GP_PET_CLASS_MAX,
|
||||
};
|
||||
|
||||
public struct PetSkill
|
||||
{
|
||||
public int skill;
|
||||
public int level;
|
||||
|
||||
}
|
||||
public struct _evo_prop
|
||||
{
|
||||
public int r_attack;
|
||||
public int r_defense;
|
||||
public int r_hp;
|
||||
public int r_atk_lvl;
|
||||
public int r_def_lvl;
|
||||
public int nature;
|
||||
}
|
||||
public enum GP_PET_SKILL_NUM
|
||||
{
|
||||
GP_PET_SKILL_NUM = 8
|
||||
};
|
||||
public struct info_pet
|
||||
{
|
||||
public int honor_point; // �øж�
|
||||
public int hunger; // ������
|
||||
public int feed_time; // �ϴ�ι�������ڵ�ʱ��
|
||||
public int pet_tid; // ������ID
|
||||
public int pet_vis_tid; // ����Ŀɼ�ID�����Ϊ0�����ʾ������ɼ�ID��
|
||||
public int pet_egg_tid; // ���ﵰ��ID
|
||||
public int pet_class; // �������� ս�裬��裬���ͳ�
|
||||
public float hp_factor; // Ѫ��������������ջ�ʱʹ�ã� 0��Ϊ����
|
||||
public short level; // ���V��
|
||||
public ushort color; // ������ɫ�����λΪ1��ʾ��Ч��Ŀǰ���������Ч
|
||||
public int exp; // ���ﵱǰ����
|
||||
public int skill_point; // ʣ�༼�ܵ�
|
||||
public char is_bind; // �Ƿ����˺�һ��������һ��Mask��0x01 ���˺�һ��0x02 Ѱ�����ɽ���
|
||||
public char unused; // Ŀǰ������Ч
|
||||
public ushort name_len; // ���ֳ��� Ŀǰ������Ч����Ϊ��������������
|
||||
public char[] name; // ��������
|
||||
public PetSkill[] skills;
|
||||
public _evo_prop evo_prop;
|
||||
public int[] reserved; // �
|
||||
public info_pet(bool isDefault = true)
|
||||
{
|
||||
honor_point = 0;
|
||||
hunger = 0;
|
||||
feed_time = 0;
|
||||
pet_tid = 0;
|
||||
pet_vis_tid = 0;
|
||||
pet_egg_tid = 0;
|
||||
pet_class = 0;
|
||||
hp_factor = 0;
|
||||
level = 0;
|
||||
color = 0;
|
||||
exp = 0;
|
||||
skill_point = 0;
|
||||
is_bind = (char)0x00;
|
||||
unused = (char)0x00;
|
||||
name_len = 0;
|
||||
name = new char[16];
|
||||
skills = new PetSkill[(int)GP_PET_SKILL_NUM.GP_PET_SKILL_NUM];
|
||||
evo_prop = new _evo_prop{
|
||||
r_attack = 0,
|
||||
r_defense = 0,
|
||||
r_hp = 0,
|
||||
r_atk_lvl = 0,
|
||||
r_def_lvl = 0,
|
||||
nature = 0
|
||||
};
|
||||
reserved = new int[10];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ namespace BrewMonster.Scripts.Skills
|
||||
{
|
||||
s = SkillStub.GetStub(id);
|
||||
if (s != null)
|
||||
return s.GetName();
|
||||
return s.GetIcon();
|
||||
return "";
|
||||
}
|
||||
// ����˵��
|
||||
@@ -425,5 +425,59 @@ namespace BrewMonster.Scripts.Skills
|
||||
|
||||
return ret;
|
||||
}
|
||||
// 0:�ɹ� 1:����SP���� 2:�����츳�㲻��
|
||||
// 3:���� 4:���ܸ������� 5:����ID
|
||||
// 6:��Ǯ���� 7:��С���鼼�� 8:û�м�����
|
||||
// 9:�ȼ����� 10:���������� 11:ְҵ��ƥ��
|
||||
// 12:���������㣬��ְҵ��ƥ��
|
||||
public static int GoblinLearn(uint id, GoblinRequirement info, int level)
|
||||
{
|
||||
Skill s = Skill.Create(id, level);
|
||||
if(s == null)
|
||||
return 5;
|
||||
if(level<1 || level> s.GetMaxLevel())
|
||||
return 3;
|
||||
if(s.GetCls() != 258)
|
||||
return 7;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
int[] iReqGen = new int[5] {0, 0, 0, 0, 0};
|
||||
int iReqLevel = s.GetRequiredLevel();
|
||||
// iReqLevelΪ7λ�����������λΪ�ȼ���ǰ5λΪ�츳���������λΪ��
|
||||
int iLevelRequirement = iReqLevel%100;
|
||||
if(info.level < iLevelRequirement)
|
||||
return 9;
|
||||
|
||||
iReqLevel /= 100;
|
||||
|
||||
int i;
|
||||
for(i=0;i<5;i++)
|
||||
{
|
||||
iReqGen[4-i] = iReqLevel%10;
|
||||
iReqLevel /= 10;
|
||||
}
|
||||
|
||||
for(i=0;i<5;i++)
|
||||
{
|
||||
if(info.genius[i] < iReqGen[4-i])
|
||||
return 2;
|
||||
}
|
||||
|
||||
if(info.sp < s.GetRequiredSp())
|
||||
ret = 1;
|
||||
//else if(info.money<s->GetRequiredMoney(id, level))
|
||||
// ret = 6;
|
||||
|
||||
if(info.mp < s.GetMpCost() &&
|
||||
((s.GetCls() != 0) && (((1 << info.profession) & s.GetCls()) == 0)))
|
||||
ret = 12;
|
||||
else if(info.mp < s.GetMpCost())
|
||||
ret = 10;
|
||||
else if((s.GetCls() != 0) && (((1 << info.profession) & s.GetCls()) == 0))
|
||||
ret = 11;
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,10 @@ namespace BrewMonster
|
||||
int m_nCurPanel1 = 1;
|
||||
int m_nCurPanel2 = 1;
|
||||
|
||||
/// <summary>
|
||||
/// Apply for a license remove later
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool UpdateShortcuts()
|
||||
{
|
||||
CECShortcut pSC;
|
||||
@@ -46,10 +50,10 @@ namespace BrewMonster
|
||||
|
||||
/*CDlgQuickBar* pQuickBar = dynamic_cast<CDlgQuickBar*>(GetGameUIMan()->GetDialog(a_pszPanel[i]));
|
||||
if (!pQuickBar || !pQuickBar->IsShow()) continue;*/
|
||||
|
||||
for (int j = 0; j < AUIImagePictureList.Count; j++)
|
||||
int slotIndex = 0;
|
||||
for (int j = 0; j < a_pSCS.Count; j++)
|
||||
{
|
||||
pCell = AUIImagePictureList[j];
|
||||
pCell = AUIImagePictureList[slotIndex];
|
||||
pSC = a_pSCS[i].GetShortcut(j);
|
||||
pClock = pCell.GetClockIcon();
|
||||
pClock.SetProgressRange(0, 1);
|
||||
@@ -203,7 +207,7 @@ namespace BrewMonster
|
||||
{
|
||||
if (pSkill != null)
|
||||
{
|
||||
pCell.gameObject.SetActive(true);
|
||||
slotIndex++;
|
||||
//BMLogger.Log("HoangDev: QuickBar Set Skill Icon: " + (uint)pSkill.GetSkillID() + " : " + ElementSkill.GetIcon((uint)pSkill.GetSkillID()));
|
||||
var nameskill = ElementSkill.GetIcon((uint)pSkill.GetSkillID());
|
||||
GetGameUIMan().SetCover(pCell, nameskill, EC_GAMEUI_ICONS.ICONS_SKILL);
|
||||
@@ -226,6 +230,213 @@ namespace BrewMonster
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/* public bool UpdateShortcuts()
|
||||
{
|
||||
CECShortcut pSC;
|
||||
Image skillImage;
|
||||
CECSCSkill pSCSkill;
|
||||
int iIconFile, nMax;
|
||||
AUIImagePicture pCell;
|
||||
CECSkill pSkill = new CECSkill(-1, -1);
|
||||
AUIClockIcon pClock;
|
||||
|
||||
|
||||
int nCurPanel9 = GetCurPanel1();
|
||||
int nCurPanel8 = GetCurPanel2();
|
||||
|
||||
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
|
||||
if (pHost == null) return false;
|
||||
var a_pSCS = new List<CECShortcutSet>();
|
||||
var a_pszPanel = new List<string>();
|
||||
GetQuickBarNameAndSC(pHost, a_pszPanel, a_pSCS, nCurPanel9, nCurPanel8);
|
||||
|
||||
for (int i = 0; i <= 1*//*(int)a_pSCS.Count*//*; i++)
|
||||
{
|
||||
if (a_pSCS[i] == null)
|
||||
continue;
|
||||
|
||||
*//*CDlgQuickBar* pQuickBar = dynamic_cast<CDlgQuickBar*>(GetGameUIMan()->GetDialog(a_pszPanel[i]));
|
||||
if (!pQuickBar || !pQuickBar->IsShow()) continue;*//*
|
||||
|
||||
for (int j = 0; j < AUIImagePictureList.Count; j++)
|
||||
{
|
||||
pCell = AUIImagePictureList[j];
|
||||
pSC = a_pSCS[i].GetShortcut(j);
|
||||
pClock = pCell.GetClockIcon();
|
||||
pClock.SetProgressRange(0, 1);
|
||||
pClock.SetProgressPos(1);
|
||||
if (pSC != null)
|
||||
{
|
||||
if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_SKILL)
|
||||
{
|
||||
iIconFile = (int)EC_GAMEUI_ICONS.ICONS_SKILL;
|
||||
pSCSkill = (CECSCSkill)pSC;
|
||||
pSkill = pSCSkill.GetSkill();
|
||||
if (false*//*m_bDelGoblinSkillSC && GNET::ElementSkill::IsGoblinSkill(pSkill->GetSkillID())*//*)
|
||||
{
|
||||
*//* a_pSCS[i]->SetShortcut(j, NULL);
|
||||
pSC = NULL;*//*
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pSkill != null && pSkill.ReadyToCast() && pHost.GetPrepSkill() != pSkill)
|
||||
{
|
||||
if (ElementSkill.IsGoblinSkill((uint)pSkill.GetSkillID()))
|
||||
{
|
||||
*//* if (pHostGoblin && !pHostGoblin->CheckSkillCastCondition(pSkill))
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
}
|
||||
else
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(128, 128, 128));
|
||||
}*//*
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pHost.CheckSkillCastCondition(pSkill) == 0)
|
||||
{
|
||||
//pCell.SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
}
|
||||
else
|
||||
{
|
||||
//pCell.SetColor(A3DCOLORRGB(128, 128, 128));
|
||||
}
|
||||
}
|
||||
}
|
||||
*//* else
|
||||
pClock.SetColor(A3DCOLORRGBA(0, 0, 0, 128));*//*
|
||||
if (pSkill != null && (pSkill.GetCoolingTime() > 0 ||
|
||||
pHost.GetPrepSkill() == pSkill))
|
||||
{
|
||||
pClock.SetProgressRange(0, pSkill.GetCoolingTime());
|
||||
if (pHost.GetPrepSkill() == pSkill)
|
||||
{
|
||||
pClock.SetProgressPos(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
pClock.SetProgressPos(pSkill.GetCoolingTime() - pSkill.GetCoolingCnt());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*//*else if (pSC->GetType() == CECShortcut::SCT_ITEM)
|
||||
{
|
||||
iIconFile = CECGameUIMan::ICONS_INVENTORY;
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
pSCItem = (CECSCItem*)pSC;
|
||||
pIvtr = GetHostPlayer()->GetPack(pSCItem->GetInventory());
|
||||
pItem = pIvtr->GetItem(pSCItem->GetIvtrSlot());
|
||||
if (pItem && pItem->GetCoolTime(&nMax) > 0)
|
||||
{
|
||||
pClock->SetProgressRange(0, nMax);
|
||||
pClock->SetProgressPos(nMax - pItem->GetCoolTime());
|
||||
pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 128));
|
||||
}
|
||||
if (pSCItem->GetInventory() == IVTRTYPE_EQUIPPACK)
|
||||
pCell->SetColor(A3DCOLORRGBA(128, 128, 255, 128));
|
||||
}
|
||||
else if (pSC->GetType() == CECShortcut::SCT_PET)
|
||||
{
|
||||
pSCPet = (CECSCPet*)pSC;
|
||||
CECPetData* pPet = pPetCorral->GetPetData(pSCPet->GetPetIndex());
|
||||
iIconFile = CECGameUIMan::ICONS_INVENTORY;
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
if (pPet)
|
||||
{
|
||||
// dead combat pet
|
||||
if ((pPet->GetClass() == GP_PET_CLASS_COMBAT || pPet->GetClass() == GP_PET_CLASS_EVOLUTION) && pPet->GetHPFactor() == 0.0f)
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(128, 128, 128));
|
||||
}
|
||||
// current active pet
|
||||
else if (pSCPet->IsActivePet())
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (pSC->GetType() == CECShortcut::SCT_AUTOFASHION)
|
||||
{
|
||||
iIconFile = CECGameUIMan::ICONS_SUITE;
|
||||
fashionCoolTime = pHost->GetCoolTime(GP_CT_EQUIP_FASHION_ITEM, &fashionCoolTimeMax);
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
if (fashionCoolTimeMax > 0)
|
||||
{
|
||||
pClock->SetProgressRange(0, fashionCoolTimeMax);
|
||||
pClock->SetProgressPos(fashionCoolTimeMax - fashionCoolTime);
|
||||
pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 175));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iIconFile = CECGameUIMan::ICONS_ACTION;
|
||||
if (pSC->GetType() == CECShortcut::SCT_COMMAND)
|
||||
{
|
||||
CECSCCommand* pCommandSC = (CECSCCommand*)pSC;
|
||||
if (GetHostPlayer()->IsInvisible())
|
||||
{
|
||||
if (pCommandSC->GetCommandID() == CECSCCommand::CMD_STARTTRADE ||
|
||||
pCommandSC->GetCommandID() == CECSCCommand::CMD_SELLBOOTH ||
|
||||
pCommandSC->GetCommandID() == CECSCCommand::CMD_BINDBUDDY)
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(128, 128, 128));
|
||||
}
|
||||
else
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));
|
||||
}
|
||||
}
|
||||
|
||||
if (pSC->GetCoolTime(&nMax) > 0)
|
||||
{
|
||||
pClock->SetProgressRange(0, nMax);
|
||||
pClock->SetProgressPos(nMax - pSC->GetCoolTime());
|
||||
pClock->SetColor(A3DCOLORRGBA(0, 0, 0, 128));
|
||||
}
|
||||
}*//*
|
||||
if (pSC != null)
|
||||
{
|
||||
pCell.SetDataPtr(pSC, "ptr_CECShortcut");
|
||||
if (pSC.GetType() == (int)CECShortcut.ShortcutType.SCT_SKILLGRP)
|
||||
{
|
||||
*//* EC_VIDEO_SETTING setting = GetGame()->GetConfigs()->GetVideoSettings();
|
||||
pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[CECGameUIMan::ICONS_SKILLGRP],
|
||||
setting.comboSkill[((CECSCSkillGrp*)pSC)->GetGroupIndex()].nIcon + 1);*//*
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pSkill != null)
|
||||
{
|
||||
pCell.gameObject.SetActive(true);
|
||||
//BMLogger.Log("HoangDev: QuickBar Set Skill Icon: " + (uint)pSkill.GetSkillID() + " : " + ElementSkill.GetIcon((uint)pSkill.GetSkillID()));
|
||||
var nameskill = ElementSkill.GetIcon((uint)pSkill.GetSkillID());
|
||||
GetGameUIMan().SetCover(pCell, nameskill, EC_GAMEUI_ICONS.ICONS_SKILL);
|
||||
}
|
||||
*//*af_GetFileTitle(pSC->GetIconFile(), strFile);
|
||||
strFile.MakeLower();
|
||||
pCell->SetCover(GetGameUIMan()->m_pA2DSpriteIcons[iIconFile],
|
||||
GetGameUIMan()->m_IconMap[iIconFile][strFile]);*//*
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*//* pCell->SetCover(NULL, -1);
|
||||
pCell->SetText(_AL(""));
|
||||
pCell->SetDataPtr(NULL);
|
||||
pCell->SetColor(A3DCOLORRGB(255, 255, 255));*//*
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}*/
|
||||
private void GetQuickBarNameAndSC(CECHostPlayer pHost, List<string> pszPanel, List<CECShortcutSet> pSCS, int panel9, int panel8)
|
||||
{
|
||||
string dlgName;
|
||||
|
||||
@@ -131,7 +131,6 @@ namespace BrewMonster.UI
|
||||
{
|
||||
return m_dialogResouce;
|
||||
}
|
||||
|
||||
public Canvas GetCanvas()
|
||||
{
|
||||
return m_canvas;
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace BrewMonster
|
||||
{
|
||||
[Header("LearnedSkillUI")]
|
||||
[SerializeField] Button learnedSkillbutton;
|
||||
[SerializeField] private DoubleTapButton wButton;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
@@ -15,15 +16,24 @@ namespace BrewMonster
|
||||
{
|
||||
Debug.LogError("Learned Skill Button is not assigned in LearnedSkillUI");
|
||||
}
|
||||
learnedSkillbutton.onClick.RemoveAllListeners();
|
||||
learnedSkillbutton.onClick.AddListener(AddShortCutSkill);
|
||||
wButton.DoubleTapped += OpenSetShortCutSkillUI;
|
||||
}
|
||||
private void AddShortCutSkill()
|
||||
{
|
||||
learnedSkillbutton.onClick.AddListener(OpenSetShortCutSkillUI);
|
||||
|
||||
}
|
||||
private void OpenSetShortCutSkillUI()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
/*public struct OpenSetShortCutSkillUIEvent
|
||||
{
|
||||
public OpenSetShortCutSkillUIEvent()
|
||||
{
|
||||
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
public class DoubleTapButton : MonoBehaviour, IPointerClickHandler
|
||||
{
|
||||
[SerializeField] private float doubleTapThreshold = 0.25f;
|
||||
|
||||
// Subscribe bằng code: doubleTapButton.DoubleTapped += () => ...
|
||||
public event Action SingleTapped;
|
||||
public event Action DoubleTapped;
|
||||
|
||||
private float _lastTapTime = -999f;
|
||||
private bool _waitingSingle;
|
||||
private int _tapCount;
|
||||
private Coroutine _singleRoutine;
|
||||
|
||||
public void OnPointerClick(PointerEventData eventData)
|
||||
{
|
||||
if (eventData.button != PointerEventData.InputButton.Left) return;
|
||||
|
||||
float now = Time.unscaledTime;
|
||||
|
||||
if (now - _lastTapTime <= doubleTapThreshold) _tapCount++;
|
||||
else _tapCount = 1;
|
||||
|
||||
_lastTapTime = now;
|
||||
|
||||
if (_tapCount == 2)
|
||||
{
|
||||
_tapCount = 0;
|
||||
|
||||
// huỷ single đang chờ
|
||||
_waitingSingle = false;
|
||||
if (_singleRoutine != null)
|
||||
{
|
||||
StopCoroutine(_singleRoutine);
|
||||
_singleRoutine = null;
|
||||
}
|
||||
|
||||
DoubleTapped?.Invoke();
|
||||
}
|
||||
else
|
||||
{
|
||||
// chờ 1 khoảng để xem có tap lần 2 không, rồi mới fire single
|
||||
if (!_waitingSingle)
|
||||
{
|
||||
_waitingSingle = true;
|
||||
_singleRoutine = StartCoroutine(WaitThenSingle());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator WaitThenSingle()
|
||||
{
|
||||
float start = Time.unscaledTime;
|
||||
while (Time.unscaledTime - start < doubleTapThreshold)
|
||||
{
|
||||
if (!_waitingSingle) yield break; // đã double-tap
|
||||
yield return null;
|
||||
}
|
||||
|
||||
_waitingSingle = false;
|
||||
_singleRoutine = null;
|
||||
SingleTapped?.Invoke();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 106e019fdd0d35744a1cf51aa2ea4b01
|
||||
@@ -64,6 +64,23 @@ namespace BrewMonster
|
||||
m_pCur += sizeof(short);
|
||||
return value;
|
||||
}
|
||||
public ushort ReadUShort()
|
||||
{
|
||||
BoundCheck(sizeof(ushort));
|
||||
|
||||
ushort value = System.BitConverter.ToUInt16(data, m_pCur);
|
||||
m_pCur += sizeof(ushort);
|
||||
return value;
|
||||
}
|
||||
public ushort[] ReadUShortArray(int size)
|
||||
{
|
||||
BoundCheck(size * sizeof(ushort));
|
||||
|
||||
ushort[] result = new ushort[size];
|
||||
System.Array.Copy(data, m_pCur, result, 0, size * sizeof(ushort));
|
||||
m_pCur += size * sizeof(ushort);
|
||||
return result;
|
||||
}
|
||||
public uint ReadUInt()
|
||||
{
|
||||
BoundCheck(sizeof(uint));
|
||||
|
||||
@@ -223,7 +223,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
@@ -631,7 +631,7 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_Material: {fileID: 0}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_RaycastTarget: 0
|
||||
m_RaycastTarget: 1
|
||||
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_Maskable: 1
|
||||
m_OnCullStateChanged:
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5db879889e44dd2b56efd7a8e828bc01595c1ba111ee36c3aeb1c1b56fc4f7f1
|
||||
size 200605217
|
||||
oid sha256:def3c6a4f58ef9b5c9558210328e5b6f3ed11bfee5b577271ee43fa110616b82
|
||||
size 200521689
|
||||
|
||||
+183
-24
@@ -61,6 +61,7 @@ namespace BrewMonster
|
||||
private int m_iRoleLastLoginTime; // Role last login time
|
||||
private int m_iAccountTotalCash;
|
||||
|
||||
private EC_PetCorral m_pPetCorral;
|
||||
private List<CECObject> m_aTabSels = new List<CECObject>();
|
||||
private List<CECSkill> m_aPtSkills = new List<CECSkill>();
|
||||
private List<CECSkill> m_aPsSkills = new List<CECSkill>();
|
||||
@@ -773,7 +774,7 @@ namespace BrewMonster
|
||||
// Is skill cool time
|
||||
int idSkill = item.idx - (int)CoolTimeIndex.GP_CT_SKILL_START;
|
||||
|
||||
COOLTIME ct = m_skillCoolTime[idSkill];
|
||||
COOLTIME ct = default;
|
||||
ct.iCurTime = item.cooldown;
|
||||
ct.iMaxTime = item.max_cooltime;
|
||||
Mathf.Clamp(ct.iCurTime, 0, ct.iMaxTime);
|
||||
@@ -936,6 +937,13 @@ namespace BrewMonster
|
||||
bActionStartSkill = true;
|
||||
iActionTime = iWaitTime;
|
||||
Debug.Log($"Cast skill({m_pCurSkill.GetSkillID()})");
|
||||
|
||||
// Special logging for return-to-town skill (167)
|
||||
// 回城技能(167)的特殊日志
|
||||
if (m_pCurSkill.GetSkillID() == ID_RETURNTOWN_SKILL)
|
||||
{
|
||||
Debug.Log($"Return-to-town skill (167) cast - State2 should trigger SetReturntown(1) on server");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case int value2 when value2 == CommandID.SKILL_PERFORM:
|
||||
@@ -947,6 +955,15 @@ namespace BrewMonster
|
||||
if (m_pCurSkill != null && m_pCurSkill.IsDurative())
|
||||
m_bSpellDSkill = true;
|
||||
|
||||
// Special handling for return-to-town skill (167)
|
||||
// 回城技能(167)的特殊处理
|
||||
// When skill 167 reaches State2, server calls SetReturntown(1) which should trigger MSG_HST_GOTO
|
||||
// 当技能167到达State2时,服务器调用SetReturntown(1),这应该触发MSG_HST_GOTO
|
||||
if (m_pCurSkill != null && m_pCurSkill.GetSkillID() == ID_RETURNTOWN_SKILL)
|
||||
{
|
||||
Debug.Log($"Skill 167 (Return to Town) performed - waiting for MSG_HST_GOTO from server");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case int value2 when value2 == CommandID.HOST_STOP_SKILL:
|
||||
@@ -1388,27 +1405,27 @@ namespace BrewMonster
|
||||
}
|
||||
}
|
||||
// Restore and convert shortcuts after loading new skills
|
||||
/* if (hostPlayer.HostIsReady())
|
||||
{
|
||||
hostPlayer.ConvertSkillShortcut(skillSCConfigArray1);
|
||||
hostPlayer.AssignSkillShortcut(skillSCConfigArray1, hostPlayer.m_aSCSets1);
|
||||
hostPlayer.ConvertSkillShortcut(skillSCConfigArray2);
|
||||
hostPlayer.AssignSkillShortcut(skillSCConfigArray2, hostPlayer.m_aSCSets2);
|
||||
hostPlayer.ConvertComboSkill();
|
||||
hostPlayer.ValidateSkillGrpShortcut(skillGrpSCConfigArray1);
|
||||
hostPlayer.AssignSkillGrpShortcut(skillGrpSCConfigArray1, hostPlayer.m_aSCSets1);
|
||||
hostPlayer.ValidateSkillGrpShortcut(skillGrpSCConfigArray2);
|
||||
hostPlayer.AssignSkillGrpShortcut(skillGrpSCConfigArray2, hostPlayer.m_aSCSets2);
|
||||
}
|
||||
if (HostIsReady())
|
||||
{
|
||||
/* ConvertSkillShortcut(skillSCConfigArray1);
|
||||
AssignSkillShortcut(skillSCConfigArray1, hostPlayer.m_aSCSets1);*/
|
||||
/* ConvertSkillShortcut(skillSCConfigArray2);
|
||||
AssignSkillShortcut(skillSCConfigArray2, hostPlayer.m_aSCSets2);*/
|
||||
/* ConvertComboSkill();
|
||||
ValidateSkillGrpShortcut(skillGrpSCConfigArray1);
|
||||
AssignSkillGrpShortcut(skillGrpSCConfigArray1, hostPlayer.m_aSCSets1);
|
||||
ValidateSkillGrpShortcut(skillGrpSCConfigArray2);
|
||||
AssignSkillGrpShortcut(skillGrpSCConfigArray2, hostPlayer.m_aSCSets2);*/
|
||||
}
|
||||
|
||||
if (hostPlayer.HostIsReady())
|
||||
{
|
||||
// Update UI when profession changes, save all shortcut configurations
|
||||
// to remove effects from intermediate skills (invalid pointers)
|
||||
// C++: CECGameUIMan *pGameUIMan = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan();
|
||||
// pGameUIMan.UpdateSkillRelatedUI();
|
||||
hostPlayer.UpdateSkillRelatedUI();
|
||||
}*/
|
||||
if (HostIsReady())
|
||||
{
|
||||
// Update UI when profession changes, save all shortcut configurations
|
||||
// to remove effects from intermediate skills (invalid pointers)
|
||||
// C++: CECGameUIMan *pGameUIMan = g_pGame.GetGameRun().GetUIManager().GetInGameUIMan();
|
||||
// pGameUIMan.UpdateSkillRelatedUI();
|
||||
CECUIManager.Instance.UpdateSkillRelatedUI();
|
||||
}
|
||||
}
|
||||
|
||||
public bool HostIsReady()
|
||||
@@ -2449,9 +2466,76 @@ namespace BrewMonster
|
||||
{
|
||||
PopupManager.Instance.OnPlayerRevived();
|
||||
// p1 is a byte[] buffer; parse into cmd_notify_hostpos then set position
|
||||
// p1 是一个 byte[] 缓冲区;解析为 cmd_notify_hostpos 然后设置位置
|
||||
byte[] buf = (byte[])Msg.dwParam1;
|
||||
cmd_notify_hostpos pCmd = GPDataTypeHelper.FromBytes<cmd_notify_hostpos>(buf);
|
||||
SetPos(new Vector3(pCmd.vPos.x, pCmd.vPos.y, pCmd.vPos.z));
|
||||
|
||||
int idInst = pCmd.tag;
|
||||
Vector3 vPos = new Vector3(pCmd.vPos.x, pCmd.vPos.y, pCmd.vPos.z);
|
||||
int iLine = pCmd.line;
|
||||
|
||||
|
||||
// Call Goto method to properly handle teleportation
|
||||
// 调用 Goto 方法来正确处理传送
|
||||
if (!Goto(idInst, vPos, iLine))
|
||||
{
|
||||
Debug.LogError($"OnMsgHstGoto: Failed to teleport to instance {idInst}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Return to a target town through skill
|
||||
// 通过技能返回目标城镇
|
||||
// This method implements the Goto logic from the original C++ code
|
||||
// 此方法实现了原始 C++ 代码中的 Goto 逻辑
|
||||
private bool Goto(int idInst, Vector3 vPos, int iParallelWorldID)
|
||||
{
|
||||
// Jump to instance (change world/instance)
|
||||
// 跳转到实例(更改世界/实例)
|
||||
// Note: JumpToInstance is currently a stub in CECGameRun, so we skip the call for now
|
||||
// 注意:JumpToInstance 目前在 CECGameRun 中是一个存根,所以我们现在跳过调用
|
||||
// if (CECGameRun.Instance != null && !CECGameRun.Instance.JumpToInstance(idInst, vPos, iParallelWorldID))
|
||||
// {
|
||||
// Debug.LogError($"CECHostPlayer::Goto, Failed to jump to instance {idInst}");
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// Stop all current work and goto specified position
|
||||
// 停止所有当前工作并转到指定位置
|
||||
if (m_pWorkMan != null)
|
||||
{
|
||||
// Stop auto-moving if active
|
||||
// 如果正在自动移动则停止
|
||||
// Note: IsAutoMoving check would go here if available
|
||||
// 注意:如果可用,IsAutoMoving 检查将放在这里
|
||||
|
||||
// Finish all work
|
||||
// 完成所有工作
|
||||
m_pWorkMan.FinishAllWork(true);
|
||||
}
|
||||
|
||||
// Add a little height to ensure player's AABB won't embed with building
|
||||
// 增加一点高度以确保玩家的 AABB 不会嵌入建筑物
|
||||
vPos.y += 0.1f;
|
||||
|
||||
// Ensure we are not under ground (terrain height check would go here)
|
||||
// 确保我们不会在地下(地形高度检查将放在这里)
|
||||
// Note: Terrain height check is skipped for now as it requires world access
|
||||
// 注意:暂时跳过地形高度检查,因为它需要世界访问
|
||||
|
||||
// Set position
|
||||
// 设置位置
|
||||
SetPos(vPos);
|
||||
|
||||
// Reset jump state if available
|
||||
// 如果可用则重置跳跃状态
|
||||
// ResetJump(); // Uncomment if ResetJump method exists
|
||||
|
||||
// Update camera if available
|
||||
// 如果可用则更新相机
|
||||
// UpdateFollowCamera(false, 10); // Uncomment if UpdateFollowCamera method exists
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void OnMsgHstStartAttack(in ECMSG Msg)
|
||||
@@ -3409,8 +3493,13 @@ namespace BrewMonster
|
||||
m_pActionSwitcher.PostMessge((int)EMsgActionSwitcher.MSG_CASTSKILL);
|
||||
|
||||
// Return-town skill is very special, handle it separately
|
||||
//if (idSkill == ID_RETURNTOWN_SKILL)
|
||||
// return ReturnToTargetTown(0, bCombo);
|
||||
// 回城技能非常特殊,单独处理
|
||||
Debug.Log($"ApplySkillShortcut: Checking skill {idSkill}, ID_RETURNTOWN_SKILL={ID_RETURNTOWN_SKILL}");
|
||||
if (idSkill == ID_RETURNTOWN_SKILL)
|
||||
{
|
||||
Debug.Log($"ApplySkillShortcut: Skill 167 detected, calling ReturnToTargetTown");
|
||||
return ReturnToTargetTown(0, bCombo);
|
||||
}
|
||||
|
||||
//if (idSkill == ID_SUMMONPLAYER_SKILL)
|
||||
// return SummonPlayer(idSelTarget, bCombo);
|
||||
@@ -4098,6 +4187,72 @@ namespace BrewMonster
|
||||
return true;
|
||||
}
|
||||
|
||||
// Return to a target town through skill
|
||||
// 通过技能返回目标城镇
|
||||
private bool ReturnToTargetTown(int idTarget, bool bCombo = false)
|
||||
{
|
||||
|
||||
if (!CanDo(ActionCanDo.CANDO_SPELLMAGIC))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int idSkill = ID_RETURNTOWN_SKILL;
|
||||
CECSkill pSkill = GetPositiveSkillByID(idSkill);
|
||||
if (pSkill == null) pSkill = GetEquipSkillByID(idSkill);
|
||||
if (pSkill == null)
|
||||
{
|
||||
Debug.LogError("ReturnToTargetTown: Skill 167 not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!bCombo)
|
||||
{
|
||||
// ClearComboSkill(); // Uncomment if ClearComboSkill exists
|
||||
}
|
||||
|
||||
// Check skill cast condition (commented out in ApplySkillShortcut, so skip for now)
|
||||
// int iCon = CheckSkillCastCondition(pSkill);
|
||||
// if (iCon)
|
||||
// {
|
||||
// ProcessSkillCondition(iCon);
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// If this skill is in cooling time or we are casting other skill, return
|
||||
// 如果此技能在冷却时间或我们正在施放其他技能,返回
|
||||
if (!pSkill.ReadyToCast() ||
|
||||
!m_pWorkMan.CanCastSkillImmediately(pSkill.GetSkillID()))
|
||||
{
|
||||
// If the current Work in m_pWorkMan is CECHPWorkSpell or CECHPWorkFly, it should be executed first
|
||||
// Otherwise, when receiving OBJECT_CAST_SKILL protocol, CECHPWorkSpell cannot be executed
|
||||
// This causes CECHostPlayer::IsSpellingMagic() to return false, causing the client to send c2s_CmdCancelAction
|
||||
// When this CECHPWorkSpell executes, it cannot respond
|
||||
// After this method is executed, we use the return to city mechanism
|
||||
// 如果 m_pWorkMan 中的当前 Work 是 CECHPWorkSpell 或 CECHPWorkFly,则应先执行
|
||||
// 否则,当收到 OBJECT_CAST_SKILL 协议时,CECHPWorkSpell 无法执行
|
||||
// 这会导致 CECHostPlayer::IsSpellingMagic() 返回 false,导致客户端发送 c2s_CmdCancelAction
|
||||
// 当此 CECHPWorkSpell 执行时,它无法响应
|
||||
// 在此方法执行完成后,我们使用回城机制
|
||||
Debug.LogError($"ReturnToTargetTown: Skill not ready - ReadyToCast={pSkill.ReadyToCast()}, CanCastSkillImmediately={m_pWorkMan.CanCastSkillImmediately(pSkill.GetSkillID())}");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_pPrepSkill = pSkill;
|
||||
byte byPVPMask = glb_BuildPVPMask(false);
|
||||
|
||||
// Call c2s_CmdCastSkill with target parameter
|
||||
// 使用目标参数调用 c2s_CmdCastSkill
|
||||
int targets = 1;
|
||||
int[] targetsCastSkill = new int[targets];
|
||||
targetsCastSkill[0] = idTarget;
|
||||
UnityGameSession.c2s_CmdCastSkill(idSkill, byPVPMask, targets, targetsCastSkill);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public A3DVECTOR3 GetDir()
|
||||
{
|
||||
// Return forward direction from transform
|
||||
@@ -6900,5 +7055,9 @@ namespace BrewMonster
|
||||
// todo make receive request
|
||||
UnityGameSession.c2s_CmdGetItemInfo(Inventory_type.IVTRTYPE_PACK, pCmd.equip_idx);
|
||||
}
|
||||
public EC_PetCorral GetPetCorral()
|
||||
{
|
||||
return m_pPetCorral;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,6 +116,19 @@ public class CECUIManager : MonoSingleton<CECUIManager>
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public void UpdateSkillRelatedUI()
|
||||
{
|
||||
// ¸üм¼ÄÜÏà¹ØµÄ½çÃæÏÔʾ
|
||||
|
||||
if (m_pDlgQuickBar1)
|
||||
m_pDlgQuickBar1.UpdateShortcuts();
|
||||
|
||||
/* if (m_pDlgSkillEdit != null && m_pDlgSkillEdit->IsShow())
|
||||
{
|
||||
// ¼¼Äܱ༽çÃæÖ»ÔÚ Show(true) µÄʱºò²ÅÄܸüÐÂ
|
||||
m_pDlgSkillEdit->Show(false);
|
||||
}*/
|
||||
}
|
||||
|
||||
private void OnMessageBox(MessageBoxEvent messageBoxEvent)
|
||||
{
|
||||
@@ -359,4 +372,8 @@ public class CECUIManager : MonoSingleton<CECUIManager>
|
||||
pDlg = dlg;
|
||||
}
|
||||
}
|
||||
public void FilterBadWords(string str)
|
||||
{
|
||||
// TODO: Implement bad word filtering
|
||||
}
|
||||
}
|
||||
+426
-372
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user