From 517369a3df355f40187fbc7a278e98f64b70aade Mon Sep 17 00:00:00 2001 From: Rat Date: Wed, 29 Oct 2014 21:47:25 +0100 Subject: [PATCH] Core/Phases: more work on corpse phasing - moved all sql queries to prepared statements - implemented corpse phases saving, loading, cleaning --- .../characters/2014_10_28_00_characters.sql | 2 ++ src/server/game/Entities/Corpse/Corpse.cpp | 27 ++++++++++++++++++- src/server/game/Globals/ObjectMgr.cpp | 5 ++-- src/server/game/World/World.cpp | 4 +++ .../Implementation/CharacterDatabase.cpp | 5 ++++ .../Implementation/CharacterDatabase.h | 5 ++++ 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/sql/updates/characters/2014_10_28_00_characters.sql b/sql/updates/characters/2014_10_28_00_characters.sql index c1c0452e7b7..543c70bda0f 100644 --- a/sql/updates/characters/2014_10_28_00_characters.sql +++ b/sql/updates/characters/2014_10_28_00_characters.sql @@ -4,5 +4,7 @@ DROP TABLE IF EXISTS `corpse_phases`; CREATE TABLE `corpse_phases` ( `Guid` int(10) unsigned NOT NULL, `PhaseId` int(10) unsigned NOT NULL, + `Time` int(10) unsigned NOT NULL DEFAULT '0', + `CorpseType` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`Guid`,`PhaseId`) ); diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index fb60a3d1dee..04a74101a31 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -92,6 +92,9 @@ bool Corpse::Create(uint32 guidlow, Player* owner) _gridCoord = Trinity::ComputeGridCoord(GetPositionX(), GetPositionY()); + for (auto itr : owner->GetPhases()) + SetInPhase(itr, false, true); + return true; } @@ -121,6 +124,17 @@ void Corpse::SaveToDB() stmt->setUInt32(index++, GetInstanceId()); // instanceId trans->Append(stmt); + for (auto phaseId : GetPhases()) + { + index = 0; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE_PHASES); + stmt->setUInt32(index++, GetGUIDLow()); // Guid (corpse's) + stmt->setUInt32(index++, phaseId); // PhaseId + stmt->setUInt32(index++, uint32(m_time)); // Time + stmt->setUInt8(index++, GetType()); // CorpseType + trans->Append(stmt); + } + CharacterDatabase.CommitTransaction(trans); } @@ -146,14 +160,25 @@ void Corpse::DeleteFromDB(SQLTransaction& trans) // Only specific bones stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSE); stmt->setUInt32(0, GetGUIDLow()); + trans->Append(stmt); + + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSE_PHASES); + stmt->setUInt32(0, GetGUIDLow()); + trans->Append(stmt); } else { // all corpses (not bones) stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_CORPSES); stmt->setUInt32(0, GetOwnerGUID().GetCounter()); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_CORPSES_PHASES); + stmt->setUInt32(0, GetOwnerGUID().GetCounter()); + trans->Append(stmt); } - trans->Append(stmt); + } bool Corpse::LoadCorpseFromDB(uint32 guid, Field* fields) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 83e05111af2..542799a80c9 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6928,8 +6928,9 @@ void ObjectMgr::LoadCorpses() std::unordered_map> phases; - // 0 1 - QueryResult phaseResult = WorldDatabase.Query("SELECT `Guid`, `PhaseId` FROM corpse_phases"); + // 0 1 + // SELECT Guid, PhaseId FROM corpse_phases + PreparedQueryResult phaseResult = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_CORPSE_PHASES)); if (phaseResult) { do diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 3e359445742..22a5e138d1f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1384,6 +1384,10 @@ void World::SetInitialWorldSettings() stmt->setUInt32(0, 3 * DAY); CharacterDatabase.Execute(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_OLD_CORPSE_PHASES); + stmt->setUInt32(0, 3 * DAY); + CharacterDatabase.Execute(stmt); + ///- Load the DBC files TC_LOG_INFO("server.loading", "Initialize data stores..."); LoadDBCStores(m_dataPath); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 7c1509a1418..87808975693 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -337,6 +337,11 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE corpseGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PLAYER_CORPSES, "DELETE FROM corpse WHERE guid = ? AND corpseType <> 0", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CORPSE_PHASES, "SELECT Guid, PhaseId FROM corpse_phases", CONNECTION_SYNCH); + PrepareStatement(CHAR_DEL_CORPSE_PHASES, "DELETE FROM corpse_phases WHERE Guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_PLAYER_CORPSES_PHASES, "DELETE FROM corpse_phases WHERE Guid = ? AND CorpseType <> 0", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_OLD_CORPSE_PHASES, "DELETE FROM corpse_phases WHERE CorpseType = 0 OR Time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CORPSE_PHASES, "INSERT INTO corpse_phases (Guid, PhaseId, Time, CorpseType) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); // Creature respawn PrepareStatement(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 18eb2e09c5d..d878f5c509b 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -297,6 +297,11 @@ enum CharacterDatabaseStatements CHAR_DEL_CORPSE, CHAR_DEL_PLAYER_CORPSES, CHAR_DEL_OLD_CORPSES, + CHAR_SEL_CORPSE_PHASES, + CHAR_DEL_CORPSE_PHASES, + CHAR_DEL_PLAYER_CORPSES_PHASES, + CHAR_DEL_OLD_CORPSE_PHASES, + CHAR_INS_CORPSE_PHASES, CHAR_SEL_CREATURE_RESPAWNS, CHAR_REP_CREATURE_RESPAWN,