Initial commit of a mostly working ornament implementation

This commit is contained in:
ricardocampos23
2014-04-10 11:34:06 +01:00
parent 451d422b8a
commit 6d2eb6d03f
7 changed files with 117 additions and 19 deletions
+29
View File
@@ -392,6 +392,35 @@ void ItemInst::PutAugment(SharedDatabase *db, uint8 slot, uint32 item_id)
} }
} }
bool ItemInst::HasOrnamentation() const
{
const ItemInst *item;
for (int i = 0; i < MAX_AUGMENT_SLOTS; ++i)
{
uint32 id = 0;
if ((item = GetItem(i)) != nullptr)
{
if (item->GetItem()->AugType == 524288)return true;
}
}
return false;
}
ItemInst* ItemInst::GetOrnamentation() const
{
if (m_item->ItemClass == ItemClassCommon)
{
ItemInst *item;
for (int i = 0; i < MAX_AUGMENT_SLOTS; ++i)
{
uint32 id = 0;
if ((item = GetItem(i)) != nullptr && item->GetItem()->AugType == 524288) return item;
}
}
return nullptr;
}
// Retrieve item inside container // Retrieve item inside container
ItemInst* ItemInst::GetItem(uint8 index) const ItemInst* ItemInst::GetItem(uint8 index) const
{ {
+2 -1
View File
@@ -303,7 +303,8 @@ public:
bool AvailableWearSlot(uint32 aug_wear_slots) const; bool AvailableWearSlot(uint32 aug_wear_slots) const;
int8 AvailableAugmentSlot(int32 augtype) const; int8 AvailableAugmentSlot(int32 augtype) const;
inline int32 GetAugmentType() const { return m_item->AugType; } inline int32 GetAugmentType() const { return m_item->AugType; }
bool HasOrnamentation() const;
ItemInst* GetOrnamentation() const;
inline bool IsExpendable() const { return ((m_item->Click.Type == ET_Expendable ) || (m_item->ItemType == ItemTypePotion)); } inline bool IsExpendable() const { return ((m_item->Click.Type == ET_Expendable ) || (m_item->ItemType == ItemTypePotion)); }
// //
+17 -3
View File
@@ -4926,13 +4926,27 @@ char* SerializeItem(const ItemInst *inst, int16 slot_id_in, uint32 *length, uint
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
// Moofta: if the item has an aug of type 20 (ornamentation) then we use the ID file of that when serializing.
// the only thing we should probably worry about is generating a wear change packet to all cl;ients in zone if someone adds a type 20 aug.
if (inst && inst->HasOrnamentation()) //instance is not null and does have an ornament aug (slot 20)
{
ItemInst* ornamentation = inst->GetOrnamentation();
if (ornamentation) //paranoid!
{
ss.write(ornamentation->GetItem()->IDFile, strlen(ornamentation->GetItem()->IDFile));
}
else if (strlen(item->IDFile) > 0)
{
ss.write(item->IDFile, strlen(item->IDFile));
}
ss.write((const char*)&null_term, sizeof(uint8));
}
else //original code although I shortened it
{
if (strlen(item->IDFile) > 0) if (strlen(item->IDFile) > 0)
{ {
ss.write(item->IDFile, strlen(item->IDFile)); ss.write(item->IDFile, strlen(item->IDFile));
ss.write((const char*)&null_term, sizeof(uint8));
} }
else
{
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
+17 -3
View File
@@ -3119,13 +3119,27 @@ char* SerializeItem(const ItemInst *inst, int16 slot_id_in, uint32 *length, uint
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
// Moofta: if the item has an aug of type 20 (ornamentation) then we use the ID file of that when serializing.
// the only thing we should probably worry about is generating a wear change packet to all cl;ients in zone if someone adds a type 20 aug.
if (inst && inst->HasOrnamentation()) //instance is not null and does have an ornament aug (slot 20)
{
ItemInst* ornamentation = inst->GetOrnamentation();
if (ornamentation) //paranoid!
{
ss.write(ornamentation->GetItem()->IDFile, strlen(ornamentation->GetItem()->IDFile));
}
else if (strlen(item->IDFile) > 0)
{
ss.write(item->IDFile, strlen(item->IDFile));
}
ss.write((const char*)&null_term, sizeof(uint8));
}
else //original code although I shortened it
{
if (strlen(item->IDFile) > 0) if (strlen(item->IDFile) > 0)
{ {
ss.write(item->IDFile, strlen(item->IDFile)); ss.write(item->IDFile, strlen(item->IDFile));
ss.write((const char*)&null_term, sizeof(uint8));
} }
else
{
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
+17 -3
View File
@@ -2437,13 +2437,27 @@ char* SerializeItem(const ItemInst *inst, int16 slot_id_in, uint32 *length, uint
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
// Moofta: if the item has an aug of type 20/524288 (ornamentation) then we use the ID file of that when serializing.
// the only thing we should probably worry about is generating a wear change packet to all cl;ients in zone if someone adds a type 20 aug.
if (inst && inst->HasOrnamentation()) //instance is not null and does have an ornament aug (slot 20)
{
ItemInst* ornamentation = inst->GetOrnamentation();
if (ornamentation) //paranoid!
{
ss.write(ornamentation->GetItem()->IDFile, strlen(ornamentation->GetItem()->IDFile));
}
else if (strlen(item->IDFile) > 0)
{
ss.write(item->IDFile, strlen(item->IDFile));
}
ss.write((const char*)&null_term, sizeof(uint8));
}
else //original code although I shortened it
{
if (strlen(item->IDFile) > 0) if (strlen(item->IDFile) > 0)
{ {
ss.write(item->IDFile, strlen(item->IDFile)); ss.write(item->IDFile, strlen(item->IDFile));
ss.write((const char*)&null_term, sizeof(uint8));
} }
else
{
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
+17 -3
View File
@@ -3530,13 +3530,27 @@ char* SerializeItem(const ItemInst *inst, int16 slot_id_in, uint32 *length, uint
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
// Moofta: if the item has an aug of type 20 (ornamentation) then we use the ID file of that when serializing.
// the only thing we should probably worry about is generating a wear change packet to all cl;ients in zone if someone adds a type 20 aug.
if (inst && inst->HasOrnamentation()) //instance is not null and does have an ornament aug (slot 20)
{
ItemInst* ornamentation = inst->GetOrnamentation();
if (ornamentation) //paranoid!
{
ss.write(ornamentation->GetItem()->IDFile, strlen(ornamentation->GetItem()->IDFile));
}
else if (strlen(item->IDFile) > 0)
{
ss.write(item->IDFile, strlen(item->IDFile));
}
ss.write((const char*)&null_term, sizeof(uint8));
}
else //original code although I shortened it
{
if (strlen(item->IDFile) > 0) if (strlen(item->IDFile) > 0)
{ {
ss.write(item->IDFile, strlen(item->IDFile)); ss.write(item->IDFile, strlen(item->IDFile));
ss.write((const char*)&null_term, sizeof(uint8));
} }
else
{
ss.write((const char*)&null_term, sizeof(uint8)); ss.write((const char*)&null_term, sizeof(uint8));
} }
+13 -1
View File
@@ -200,7 +200,19 @@ void WorldDatabase::GetCharSelectInfo(uint32 account_id, CharacterSelect_Struct*
if ((material == MaterialPrimary) || (material == MaterialSecondary)) if ((material == MaterialPrimary) || (material == MaterialSecondary))
{ {
if (strlen(item->GetItem()->IDFile) > 2) { if (strlen(item->GetItem()->IDFile) > 2) {
uint32 idfile=atoi(&item->GetItem()->IDFile[2]); uint32 idfile = 0;
if (item->HasOrnamentation())
{
ItemInst* ornament = item->GetOrnamentation();
if (strlen(ornament->GetItem()->IDFile) > 2)
{
idfile = atoi(&ornament->GetItem()->IDFile[2]);
}
}
else
{
idfile = atoi(&item->GetItem()->IDFile[2]);
}
if (material == MaterialPrimary) if (material == MaterialPrimary)
cs->primary[char_num] = idfile; cs->primary[char_num] = idfile;
else else