Skip to content

Commit

Permalink
refactor emails and remove item_text in line with other cores
Browse files Browse the repository at this point in the history
  • Loading branch information
billy1arm committed Feb 3, 2023
1 parent 8583415 commit 0639ac1
Show file tree
Hide file tree
Showing 17 changed files with 105 additions and 264 deletions.
2 changes: 1 addition & 1 deletion src/game/Object/AuctionHouseMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction)
auction->itemGuidLow = 0;

// will delete item or place to receiver mail list
MailDraft(subject.str())
MailDraft(subject.str(),"")
.AddItem(pItem)
.SendMailTo(MailReceiver(owner, owner_guid), auction, MAIL_CHECK_MASK_COPIED);
}
Expand Down
19 changes: 8 additions & 11 deletions src/game/Object/Item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -379,23 +379,25 @@ void Item::SaveToDB()
ss << GetUInt32Value(i) << " ";
}

stmt = CharacterDatabase.CreateStatement(insItem, "INSERT INTO `item_instance` (`guid`,`owner_guid`,`data`) VALUES (?, ?, ?)");
stmt.PExecute(guid, GetOwnerGuid().GetCounter(), ss.str().c_str());
stmt = CharacterDatabase.CreateStatement(insItem, "INSERT INTO `item_instance` (`guid`,`owner_guid`,`data`,`text`) VALUES (?, ?, ?, ?)");
stmt.PExecute(guid, GetOwnerGuid().GetCounter(), ss.str().c_str(), m_text.c_str());
} break;
case ITEM_CHANGED:
{
std::string text = m_text;
CharacterDatabase.escape_string(text);
static SqlStatementID updInstance ;
static SqlStatementID updGifts ;

SqlStatement stmt = CharacterDatabase.CreateStatement(updInstance, "UPDATE `item_instance` SET `data` = ?, `owner_guid` = ? WHERE `guid` = ?");
SqlStatement stmt = CharacterDatabase.CreateStatement(updInstance, "UPDATE `item_instance` SET `data` = ?, `owner_guid` = ?, `text` = ? WHERE `guid` = ?");

std::ostringstream ss;
for (uint16 i = 0; i < m_valuesCount; ++i)
{
ss << GetUInt32Value(i) << " ";
}

stmt.PExecute(ss.str().c_str(), GetOwnerGuid().GetCounter(), guid);
stmt.PExecute(ss.str().c_str(), GetOwnerGuid().GetCounter(), m_text.c_str(), guid);

if (HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED))
{
Expand All @@ -405,17 +407,10 @@ void Item::SaveToDB()
} break;
case ITEM_REMOVED:
{
static SqlStatementID delItemText;
static SqlStatementID delInst ;
static SqlStatementID delGifts ;
static SqlStatementID delLoot ;

if (uint32 item_text_id = GetUInt32Value(ITEM_FIELD_ITEM_TEXT_ID))
{
SqlStatement stmt = CharacterDatabase.CreateStatement(delItemText, "DELETE FROM `item_text` WHERE `id` = ?");
stmt.PExecute(item_text_id);
}

SqlStatement stmt = CharacterDatabase.CreateStatement(delInst, "DELETE FROM `item_instance` WHERE `guid` = ?");
stmt.PExecute(guid);

Expand Down Expand Up @@ -511,6 +506,8 @@ bool Item::LoadFromDB(uint32 guidLow, Field* fields, ObjectGuid ownerGuid)
return false;
}

SetText(fields[1].GetCppString());

bool need_save = false; // need explicit save data at load fixes

// overwrite possible wrong/corrupted guid
Expand Down
4 changes: 4 additions & 0 deletions src/game/Object/Item.h
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,9 @@ class Item : public Object
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);}
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);}

std::string const& GetText() const { return m_text; }
void SetText(std::string const& text) { m_text = text; }

void SendTimeUpdate(Player* owner);
void UpdateDuration(Player* owner, uint32 diff);

Expand Down Expand Up @@ -379,6 +382,7 @@ class Item : public Object
void RemoveFromClientUpdateList() override;
void BuildUpdateData(UpdateDataMapType& update_players) override;
private:
std::string m_text;
uint8 m_slot;
Bag* m_container;
ItemUpdateState uState;
Expand Down
85 changes: 7 additions & 78 deletions src/game/Object/ObjectMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ ObjectMgr::ObjectMgr() :
m_ArenaTeamIds("Arena team ids"),
m_AuctionIds("Auction ids"),
m_GuildIds("Guild ids"),
m_ItemTextIds("Item text ids"),
m_MailIds("Mail ids"),
m_PetNumbers("Pet numbers"),
m_FirstTemporaryCreatureGuid(1),
Expand Down Expand Up @@ -4685,43 +4684,6 @@ void ObjectMgr::LoadPetCreateSpells()
sLog.outString(">> Loaded %u pet create spells from table and %u from DBC", count, dcount);
}

void ObjectMgr::LoadItemTexts()
{
QueryResult* result = CharacterDatabase.Query("SELECT `id`, `text` FROM `item_text`");

uint32 count = 0;

if (!result)
{
BarGoLink bar(1);
bar.step();

sLog.outString();
sLog.outString(">> Loaded %u item pages", count);
return;
}

BarGoLink bar(result->GetRowCount());

Field* fields;
do
{
bar.step();

fields = result->Fetch();

mItemTexts[ fields[0].GetUInt32()] = fields[1].GetCppString();

++count;
}
while (result->NextRow());

delete result;

sLog.outString(">> Loaded %u item texts", count);
sLog.outString();
}

void ObjectMgr::LoadPageTexts()
{
sPageTextStore.Load();
Expand Down Expand Up @@ -5108,10 +5070,10 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
// delete all old mails without item and without body immediately, if starting server
if (!serverUp)
{
CharacterDatabase.PExecute("DELETE FROM `mail` WHERE `expire_time` < '" UI64FMTD "' AND `has_items` = '0' AND `itemTextId` = 0", (uint64)basetime);
CharacterDatabase.PExecute("DELETE FROM `mail` WHERE `expire_time` < '" UI64FMTD "' AND `has_items` = '0' AND `body` = ''", (uint64)basetime);
}
// 0 1 2 3 4 5 6 7 8 9
QueryResult* result = CharacterDatabase.PQuery("SELECT `id`,`messageType`,`sender`,`receiver`,`itemTextId`,`has_items`,`expire_time`,`cod`,`checked`,`mailTemplateId` FROM `mail` WHERE `expire_time` < '" UI64FMTD "'", (uint64)basetime);
QueryResult* result = CharacterDatabase.PQuery("SELECT `id`,`messageType`,`sender`,`receiver`,`has_items`,`expire_time`,`cod`,`checked`,`mailTemplateId` FROM `mail` WHERE `expire_time` < '" UI64FMTD "'", (uint64)basetime);
if (!result)
{
BarGoLink bar(1);
Expand Down Expand Up @@ -5140,12 +5102,12 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
m->messageType = fields[1].GetUInt8();
m->sender = fields[2].GetUInt32();
m->receiverGuid = ObjectGuid(HIGHGUID_PLAYER, fields[3].GetUInt32());
bool has_items = fields[5].GetBool();
m->expire_time = (time_t)fields[6].GetUInt64();
bool has_items = fields[4].GetBool();
m->expire_time = (time_t)fields[5].GetUInt64();
m->deliver_time = 0;
m->COD = fields[7].GetUInt32();
m->checked = fields[8].GetUInt32();
m->mailTemplateId = fields[9].GetInt16();
m->COD = fields[6].GetUInt32();
m->checked = fields[7].GetUInt32();
m->mailTemplateId = fields[8].GetInt16();

Player* pl = 0;
if (serverUp)
Expand Down Expand Up @@ -5203,11 +5165,6 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
}
}

if (m->itemTextId)
{
CharacterDatabase.PExecute("DELETE FROM `item_text` WHERE `id` = '%u'", m->itemTextId);
}

// deletemail = true;
// delmails << m->messageID << ", ";
CharacterDatabase.PExecute("DELETE FROM `mail` WHERE `id` = '%u'", m->messageID);
Expand Down Expand Up @@ -5999,13 +5956,6 @@ void ObjectMgr::SetHighestGuids()
delete result;
}

result = CharacterDatabase.Query("SELECT MAX(`id`) FROM `item_text`");
if (result)
{
m_ItemTextGuids.Set((*result)[0].GetUInt32() + 1);
delete result;
}

// Cleanup other tables from nonexistent guids (>=m_hiItemGuid)
CharacterDatabase.BeginTransaction();
CharacterDatabase.PExecute("DELETE FROM `character_inventory` WHERE `item` >= '%u'", m_ItemGuids.GetNextAfterMaxUsed());
Expand Down Expand Up @@ -6035,13 +5985,6 @@ void ObjectMgr::SetHighestGuids()
delete result;
}

result = CharacterDatabase.Query("SELECT MAX(`id`) FROM `item_text`");
if (result)
{
m_ItemTextIds.Set((*result)[0].GetUInt32() + 1);
delete result;
}

result = CharacterDatabase.Query("SELECT MAX(`guid`) FROM `corpse`");
if (result)
{
Expand Down Expand Up @@ -6078,20 +6021,6 @@ void ObjectMgr::SetHighestGuids()
m_FirstTemporaryGameObjectGuid += sWorld.getConfig(CONFIG_UINT32_GUID_RESERVE_SIZE_GAMEOBJECT);
}

uint32 ObjectMgr::CreateItemText(std::string text)
{
uint32 newItemTextId = GenerateItemTextID();
// insert new itempage to container
mItemTexts[ newItemTextId ] = text;
// save new itempage
CharacterDatabase.escape_string(text);
// any Delete query needed, itemTextId is maximum of all ids
std::ostringstream query;
query << "INSERT INTO `item_text` (`id`,`text`) VALUES ( '" << newItemTextId << "', '" << text << "')";
CharacterDatabase.Execute(query.str().c_str()); // needs to be run this way, because mail body may be more than 1024 characters
return newItemTextId;
}

void ObjectMgr::LoadGameObjectLocales()
{
mGameObjectLocaleMap.clear(); // need for reload case
Expand Down
26 changes: 5 additions & 21 deletions src/game/Object/ObjectMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -460,8 +460,6 @@ class ObjectMgr
ObjectMgr();
~ObjectMgr();

typedef UNORDERED_MAP<uint32, Item*> ItemMap;

typedef UNORDERED_MAP<uint32, Group*> GroupMap;

typedef UNORDERED_MAP<uint32, ArenaTeam*> ArenaTeamMap;
Expand Down Expand Up @@ -704,7 +702,6 @@ class ObjectMgr
void LoadTavernAreaTriggers();
void LoadGameObjectForQuests();

void LoadItemTexts();
void LoadPageTexts();

void LoadPlayerInfo();
Expand Down Expand Up @@ -811,10 +808,6 @@ class ObjectMgr
{
return m_GuildIds.Generate();
}
uint32 GenerateItemTextID()
{
return m_ItemTextGuids.Generate();
}
uint32 GenerateMailID()
{
return m_MailIds.Generate();
Expand All @@ -823,18 +816,14 @@ class ObjectMgr
{
return m_PetNumbers.Generate();
}

uint32 CreateItemText(std::string text);
void AddItemText(uint32 itemTextId, std::string text)
{
mItemTexts[itemTextId] = text;
}
std::string GetItemText(uint32 id)
{
ItemTextMap::const_iterator itr = mItemTexts.find(id);
if (itr != mItemTexts.end())
if (QueryResult* result = CharacterDatabase.PQuery("SELECT `body` FROM `mail` WHERE `id` = '%u'", id))
{
return itr->second;
Field* fields = result->Fetch();
std::string body = fields[0].GetCppString();
delete result;
return body;
}
else
{
Expand Down Expand Up @@ -1221,7 +1210,6 @@ class ObjectMgr
IdGenerator<uint32> m_ArenaTeamIds;
IdGenerator<uint32> m_AuctionIds;
IdGenerator<uint32> m_GuildIds;
IdGenerator<uint32> m_ItemTextIds;
IdGenerator<uint32> m_MailIds;
IdGenerator<uint32> m_PetNumbers;

Expand All @@ -1236,15 +1224,13 @@ class ObjectMgr
// first free low guid for selected guid type
ObjectGuidGenerator<HIGHGUID_PLAYER> m_CharGuids;
ObjectGuidGenerator<HIGHGUID_ITEM> m_ItemGuids;
ObjectGuidGenerator<HIGHGUID_ITEM> m_ItemTextGuids;
ObjectGuidGenerator<HIGHGUID_CORPSE> m_CorpseGuids;
ObjectGuidGenerator<HIGHGUID_GROUP> m_GroupGuids;

QuestMap mQuestTemplates;

typedef UNORDERED_MAP<uint32, GossipText> GossipTextMap;
typedef UNORDERED_MAP<uint32, uint32> QuestAreaTriggerMap;
typedef UNORDERED_MAP<uint32, std::string> ItemTextMap;
typedef std::set<uint32> TavernAreaTriggerSet;
typedef std::set<uint32> GameObjectForQuestSet;

Expand All @@ -1254,8 +1240,6 @@ class ObjectMgr
GroupMap mGroupMap;
ArenaTeamMap mArenaTeamMap;

ItemTextMap mItemTexts;

QuestAreaTriggerMap mQuestAreaTriggerMap;
TavernAreaTriggerSet mTavernAreaTriggerSet;
GameObjectForQuestSet mGameObjectForQuestSet;
Expand Down
Loading

0 comments on commit 0639ac1

Please sign in to comment.