Fix overflow issue with character corpse creation using the wrong struct in allocation

This commit is contained in:
Akkadius 2020-08-21 00:23:13 -05:00
parent b57bcced40
commit 51356610b2
2 changed files with 25 additions and 10 deletions

View File

@ -621,7 +621,7 @@ bool Corpse::Save() {
end = itemlist.end(); end = itemlist.end();
for (; cur != end; ++cur) { for (; cur != end; ++cur) {
ServerLootItem_Struct* item = *cur; ServerLootItem_Struct* item = *cur;
memcpy((char*)&dbpc->items[x++], (char*)item, sizeof(ServerLootItem_Struct)); memcpy((char*)&dbpc->items[x++], (char*)item, sizeof(player_lootitem::ServerLootItem_Struct));
} }
/* Create New Corpse*/ /* Create New Corpse*/
@ -1573,10 +1573,10 @@ void Corpse::UpdateEquipmentLight()
for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) {
if ((*iter)->equip_slot < EQ::invslot::EQUIPMENT_BEGIN || (*iter)->equip_slot > EQ::invslot::EQUIPMENT_END) { continue; } if ((*iter)->equip_slot < EQ::invslot::EQUIPMENT_BEGIN || (*iter)->equip_slot > EQ::invslot::EQUIPMENT_END) { continue; }
if ((*iter)->equip_slot == EQ::invslot::slotAmmo) { continue; } if ((*iter)->equip_slot == EQ::invslot::slotAmmo) { continue; }
auto item = database.GetItem((*iter)->item_id); auto item = database.GetItem((*iter)->item_id);
if (item == nullptr) { continue; } if (item == nullptr) { continue; }
if (EQ::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQ::lightsource::LightEquipment])) if (EQ::lightsource::IsLevelGreater(item->Light, m_Light.Type[EQ::lightsource::LightEquipment]))
m_Light.Type[EQ::lightsource::LightEquipment] = item->Light; m_Light.Type[EQ::lightsource::LightEquipment] = item->Light;
} }
@ -1584,7 +1584,7 @@ void Corpse::UpdateEquipmentLight()
uint8 general_light_type = 0; uint8 general_light_type = 0;
for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) { for (auto iter = itemlist.begin(); iter != itemlist.end(); ++iter) {
if ((*iter)->equip_slot < EQ::invslot::GENERAL_BEGIN || (*iter)->equip_slot > EQ::invslot::GENERAL_END) { continue; } if ((*iter)->equip_slot < EQ::invslot::GENERAL_BEGIN || (*iter)->equip_slot > EQ::invslot::GENERAL_END) { continue; }
auto item = database.GetItem((*iter)->item_id); auto item = database.GetItem((*iter)->item_id);
if (item == nullptr) { continue; } if (item == nullptr) { continue; }

View File

@ -523,22 +523,37 @@ void NPC::AddLootDrop(
} }
} }
void NPC::AddItem(const EQ::ItemData* item, uint16 charges, bool equipitem) { void NPC::AddItem(const EQ::ItemData *item, uint16 charges, bool equipitem)
{
//slot isnt needed, its determined from the item. //slot isnt needed, its determined from the item.
auto loot_drop_entry = NPC::NewLootDropEntry(); auto loot_drop_entry = NPC::NewLootDropEntry();
loot_drop_entry.equip_item = static_cast<uint8>(equipitem ? 1 : 0); loot_drop_entry.equip_item = static_cast<uint8>(equipitem ? 1 : 0);
loot_drop_entry.item_charges = charges;
AddLootDrop(item, &itemlist, loot_drop_entry, true); AddLootDrop(item, &itemlist, loot_drop_entry, true);
} }
void NPC::AddItem(uint32 itemid, uint16 charges, bool equipitem, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, uint32 aug6) { void NPC::AddItem(
uint32 itemid,
uint16 charges,
bool equipitem,
uint32 aug1,
uint32 aug2,
uint32 aug3,
uint32 aug4,
uint32 aug5,
uint32 aug6
)
{
//slot isnt needed, its determined from the item. //slot isnt needed, its determined from the item.
const EQ::ItemData * i = database.GetItem(itemid); const EQ::ItemData *i = database.GetItem(itemid);
if(i == nullptr) if (i == nullptr) {
return; return;
}
auto loot_drop_entry = NPC::NewLootDropEntry(); auto loot_drop_entry = NPC::NewLootDropEntry();
loot_drop_entry.equip_item = static_cast<uint8>(equipitem ? 1 : 0); loot_drop_entry.equip_item = static_cast<uint8>(equipitem ? 1 : 0);
loot_drop_entry.item_charges = charges;
AddLootDrop(i, &itemlist, loot_drop_entry, true, aug1, aug2, aug3, aug4, aug5, aug6); AddLootDrop(i, &itemlist, loot_drop_entry, true, aug1, aug2, aug3, aug4, aug5, aug6);
} }