From 20601740773b810b706799a55001064df5d51b4c Mon Sep 17 00:00:00 2001 From: VvV Date: Sun, 12 Apr 2015 23:25:57 +0400 Subject: [PATCH 1/7] Presistant morph + only GM can morph target --- src/server/game/CMakeLists.txt | 4 +++ src/server/game/Entities/Player/Player.cpp | 23 +++++++++++---- src/server/game/Entities/Player/Player.h | 12 ++++++++ src/server/game/Entities/Player/rpplayer.cpp | 28 +++++++++++++++++++ src/server/game/Handlers/CharacterHandler.cpp | 7 +++++ src/server/scripts/Commands/cs_modify.cpp | 2 +- .../Implementation/CharacterDatabase.cpp | 6 ++++ .../Implementation/CharacterDatabase.h | 7 +++++ 8 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 src/server/game/Entities/Player/rpplayer.cpp diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index 91380b085eabb..d9028e3c40284 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -50,6 +50,10 @@ file(GLOB_RECURSE sources_Warden Warden/*.cpp Warden/*.h) file(GLOB_RECURSE sources_Weather Weather/*.cpp Weather/*.h) file(GLOB_RECURSE sources_World World/*.cpp World/*.h) +########## + +########## + # Create game-libary if (USE_COREPCH) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9e92492d46bef..2f8e6e0513d4a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -79,6 +79,10 @@ #include "WorldSession.h" #include "GameObjectAI.h" +//########################## TrinityRP +#include "RPPlayer.h" +//########################## TrinityRP + #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) #define PLAYER_SKILL_INDEX(x) (PLAYER_SKILL_INFO_1_1 + ((x)*3)) @@ -17193,15 +17197,15 @@ bool Player::IsLoading() const bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { - //// 0 1 2 3 4 5 6 7 8 9 10 11 + /// 0 1 2 3 4 5 6 7 8 9 10 11 //QueryResult* result = CharacterDatabase.PQuery("SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, " - // 12 13 14 15 16 17 18 19 20 21 22 23 24 + /// 12 13 14 15 16 17 18 19 20 21 22 23 24 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " - // 25 26 27 28 29 30 31 32 33 34 35 36 37 38 + /// 25 26 27 28 29 30 31 32 33 34 35 36 37 38 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " - // 39 40 41 42 43 44 45 46 47 48 49 + /// 39 40 41 42 43 44 45 46 47 48 49 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 + /// 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); if (!result) @@ -17863,6 +17867,11 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) _LoadEquipmentSets(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS)); + //########################## TrinityRP + // DisplayID (morph) load + _LoadDisplayId(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_DISPLAYID)); + //########################## TrinityRP + return true; } @@ -19492,6 +19501,10 @@ void Player::SaveToDB(bool create /*=false*/) GetSession()->SaveTutorialsData(trans); // changed only while character in game _SaveGlyphs(trans); _SaveInstanceTimeRestrictions(trans); + //########################## TrinityRP + // DisplayID (morph) save + _SaveDisplayId (trans); + //########################## TrinityRP // check if stats should only be saved on logout // save stats can be out of transaction diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 1e928c80f3cf9..e8d6be96d81ed 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -827,6 +827,10 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES = 30, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS = 31, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS = 32, + //########################## TrinityRP + // DisplayID (morph) load + PLAYER_LOGIN_QUERY_LOAD_DISPLAYID = 33, + //########################## TrinityRP MAX_PLAYER_LOGIN_QUERY }; @@ -2415,6 +2419,10 @@ class Player : public Unit, public GridObject void _LoadGlyphs(PreparedQueryResult result); void _LoadTalents(PreparedQueryResult result); void _LoadInstanceTimeRestrictions(PreparedQueryResult result); + //########################## TrinityRP + // DisplayID (morph) load + void _LoadDisplayId(PreparedQueryResult result); + //########################## TrinityRP /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -2437,6 +2445,10 @@ class Player : public Unit, public GridObject void _SaveTalents(SQLTransaction& trans); void _SaveStats(SQLTransaction& trans); void _SaveInstanceTimeRestrictions(SQLTransaction& trans); + //########################## TrinityRP + // DisplayID (morph) save + void _SaveDisplayId(SQLTransaction& trans); + //########################## TrinityRP /*********************************************************/ /*** ENVIRONMENTAL SYSTEM ***/ diff --git a/src/server/game/Entities/Player/rpplayer.cpp b/src/server/game/Entities/Player/rpplayer.cpp new file mode 100644 index 0000000000000..088031fa5b0e8 --- /dev/null +++ b/src/server/game/Entities/Player/rpplayer.cpp @@ -0,0 +1,28 @@ +//########################## TrinityRP +#include "Player.h" + +// DisplayID (morph) +void Player::_SaveDisplayId(SQLTransaction& trans) +{ + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DISPLAYID); + stmt->setUInt32 (0 , GetDisplayId ()); + stmt->setUInt32(1, GetGUIDLow()); + trans->Append(stmt); +} + +void Player::_LoadDisplayId(PreparedQueryResult result) +{ + m_monthlyquests.clear(); + + if (result) + { + Field* fields = result->Fetch(); + uint32 displayid = fields[0].GetUInt32(); + SetDisplayId (displayid); + TC_LOG_DEBUG("entities.player.loading", "Display ID {%u} for player (GUID: %u)", displayid, GetGUIDLow()); + } + + m_MonthlyQuestChanged = false; +} + +//########################## TrinityRP diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index f103537710f3a..784970268b295 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -203,6 +203,13 @@ bool LoginQueryHolder::Initialize() stmt->setUInt32(0, m_accountId); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, stmt); + //########################## TrinityRP + // DisplayID (morph) load + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_DISPLAYID); + stmt->setUInt32(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_DISPLAYID, stmt); + //########################## TrinityRP + return res; } diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 4667b7c2767c7..c7cc2f1aa54a8 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1252,7 +1252,7 @@ class modify_commandscript : public CommandScript uint16 display_id = (uint16)atoi((char*)args); Unit* target = handler->getSelectedUnit(); - if (!target) + if (!target || !(handler->GetSession ()->GetPlayer ()->IsGameMaster ())) //########################## TrinityRP // DisplayID (morph) target = handler->GetSession()->GetPlayer(); // check online security diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index c8632b8a3c2ad..3791ca6cff479 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -610,4 +610,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_QUEST_TRACK_GM_COMPLETE, "UPDATE quest_tracker SET completed_by_gm = 1 WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, "UPDATE quest_tracker SET quest_complete_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_QUEST_TRACK_ABANDON_TIME, "UPDATE quest_tracker SET quest_abandon_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); + + //########################## TrinityRP + // DisplayID (morph) + PrepareStatement(CHAR_UPD_DISPLAYID, "UPDATE character_displayid SET displayid = ? WHERE guid = ?", CONNECTION_ASYNC); //save + PrepareStatement(CHAR_SEL_DISPLAYID, "SELECT displaid FROM character_displayid WHERE guid = ?", CONNECTION_ASYNC); //load + //########################## TrinityRP } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index e56a24d68652b..336333ba13be3 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -543,6 +543,13 @@ enum CharacterDatabaseStatements CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CHAR_UPD_QUEST_TRACK_ABANDON_TIME, + //########################## TrinityRP + // DisplayID (morph) + CHAR_UPD_DISPLAYID, //save + CHAR_SEL_DISPLAYID, //load + //########################## TrinityRP + + MAX_CHARACTERDATABASE_STATEMENTS }; From 19b2b4adf062257afee3b3ba0ad7cded90ac28e7 Mon Sep 17 00:00:00 2001 From: OwnageIsMagic Date: Tue, 14 Apr 2015 19:28:23 +0300 Subject: [PATCH 2/7] Rename rpplayer.cpp to RPPlayer.cpp --- src/server/game/Entities/Player/{rpplayer.cpp => RPPlayer.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/server/game/Entities/Player/{rpplayer.cpp => RPPlayer.cpp} (100%) diff --git a/src/server/game/Entities/Player/rpplayer.cpp b/src/server/game/Entities/Player/RPPlayer.cpp similarity index 100% rename from src/server/game/Entities/Player/rpplayer.cpp rename to src/server/game/Entities/Player/RPPlayer.cpp From d6a7cbb9259fe555dd5312ab28cf6fe885c45689 Mon Sep 17 00:00:00 2001 From: OwnageIsMagic Date: Tue, 14 Apr 2015 19:31:22 +0300 Subject: [PATCH 3/7] Created missing RPPlayer.h --- src/server/game/Entities/Player/RPPlayer.h | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/server/game/Entities/Player/RPPlayer.h diff --git a/src/server/game/Entities/Player/RPPlayer.h b/src/server/game/Entities/Player/RPPlayer.h new file mode 100644 index 0000000000000..9fd84996e2307 --- /dev/null +++ b/src/server/game/Entities/Player/RPPlayer.h @@ -0,0 +1,8 @@ +//########################## TrinityRP +#ifndef RPPLAYER +#define RPPLAYER + + + +#endif // RPPLAYER +//########################## TrinityRP From 284d4e0455ee47fbaceaf3970f8163c331670bb7 Mon Sep 17 00:00:00 2001 From: OwnageIsMagic Date: Tue, 14 Apr 2015 20:22:29 +0300 Subject: [PATCH 4/7] Fix typo --- src/server/shared/Database/Implementation/CharacterDatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 3791ca6cff479..d41d2cd023a98 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -614,6 +614,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() //########################## TrinityRP // DisplayID (morph) PrepareStatement(CHAR_UPD_DISPLAYID, "UPDATE character_displayid SET displayid = ? WHERE guid = ?", CONNECTION_ASYNC); //save - PrepareStatement(CHAR_SEL_DISPLAYID, "SELECT displaid FROM character_displayid WHERE guid = ?", CONNECTION_ASYNC); //load + PrepareStatement(CHAR_SEL_DISPLAYID, "SELECT displayid FROM character_displayid WHERE guid = ?", CONNECTION_ASYNC); //load //########################## TrinityRP } From f269041605d6a51200260aed86f9a56c9e57b080 Mon Sep 17 00:00:00 2001 From: VvV Date: Tue, 14 Apr 2015 22:42:58 +0400 Subject: [PATCH 5/7] Added sql table for morph --- .gitignore | 1 + sql/custom/characters/.gitignore | 2 +- sql/custom/characters/characters_displayid.sql | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 sql/custom/characters/characters_displayid.sql diff --git a/.gitignore b/.gitignore index 7dbed8f3ea293..37f00c802473a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ CMakeLists.txt.user *.BACKUP.* *.BASE.* *.LOCAL.* +*.cppcheck diff --git a/sql/custom/characters/.gitignore b/sql/custom/characters/.gitignore index d1b811b7de598..a29249863a8b1 100644 --- a/sql/custom/characters/.gitignore +++ b/sql/custom/characters/.gitignore @@ -1 +1 @@ -*.sql +LOCAL*.sql diff --git a/sql/custom/characters/characters_displayid.sql b/sql/custom/characters/characters_displayid.sql new file mode 100644 index 0000000000000..c39e5e1a3f0fb --- /dev/null +++ b/sql/custom/characters/characters_displayid.sql @@ -0,0 +1,9 @@ +CREATE TABLE `character_displayid` ( + `guid` INT UNSIGNED NOT NULL, + `displayid` INT UNSIGNED NULL, + PRIMARY KEY (`guid`) +) +COMMENT='Character display ID (morph)' +COLLATE='utf8_general_ci' +ENGINE=InnoDB +; From 02e8499502261379535a2ebb3a9700c60abeb594 Mon Sep 17 00:00:00 2001 From: VvV Date: Wed, 15 Apr 2015 21:06:59 +0400 Subject: [PATCH 6/7] Morph permission for players+GM only demorph target --- sql/custom/auth/.gitignore | 2 +- sql/custom/auth/RBACmorp2players.sql | 2 ++ sql/custom/world/.gitignore | 2 +- src/server/scripts/Commands/cs_modify.cpp | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 sql/custom/auth/RBACmorp2players.sql diff --git a/sql/custom/auth/.gitignore b/sql/custom/auth/.gitignore index d1b811b7de598..a29249863a8b1 100644 --- a/sql/custom/auth/.gitignore +++ b/sql/custom/auth/.gitignore @@ -1 +1 @@ -*.sql +LOCAL*.sql diff --git a/sql/custom/auth/RBACmorp2players.sql b/sql/custom/auth/RBACmorp2players.sql new file mode 100644 index 0000000000000..83a009a05c0bd --- /dev/null +++ b/sql/custom/auth/RBACmorp2players.sql @@ -0,0 +1,2 @@ +INSERT INTO `auth`.`rbac_linked_permissions` (`id`, `linkedId`) VALUES (199, 543); +INSERT INTO `auth`.`rbac_linked_permissions` (`id`, `linkedId`) VALUES (199, 542); \ No newline at end of file diff --git a/sql/custom/world/.gitignore b/sql/custom/world/.gitignore index d1b811b7de598..a29249863a8b1 100644 --- a/sql/custom/world/.gitignore +++ b/sql/custom/world/.gitignore @@ -1 +1 @@ -*.sql +LOCAL*.sql diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index c7cc2f1aa54a8..b71a71ba2b156 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -1383,7 +1383,7 @@ class modify_commandscript : public CommandScript static bool HandleDeMorphCommand(ChatHandler* handler, const char* /*args*/) { Unit* target = handler->getSelectedUnit(); - if (!target) + if (!target || !(handler->GetSession ()->GetPlayer ()->IsGameMaster ())) //########################## TrinityRP // DisplayID (morph) target = handler->GetSession()->GetPlayer(); // check online security From 60a794516d1a2f3e08f59c1a500b45d304e48304 Mon Sep 17 00:00:00 2001 From: VvV Date: Thu, 16 Apr 2015 00:17:42 +0400 Subject: [PATCH 7/7] Fixed morph save --- src/server/game/Entities/Player/RPPlayer.cpp | 5 +++-- .../shared/Database/Implementation/CharacterDatabase.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Player/RPPlayer.cpp b/src/server/game/Entities/Player/RPPlayer.cpp index 088031fa5b0e8..8c7ece39033f3 100644 --- a/src/server/game/Entities/Player/RPPlayer.cpp +++ b/src/server/game/Entities/Player/RPPlayer.cpp @@ -5,8 +5,9 @@ void Player::_SaveDisplayId(SQLTransaction& trans) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DISPLAYID); - stmt->setUInt32 (0 , GetDisplayId ()); - stmt->setUInt32(1, GetGUIDLow()); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt32 (1 , GetDisplayId ()); + stmt->setUInt32(2, GetDisplayId ()); trans->Append(stmt); } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index d41d2cd023a98..001bbc5517bc2 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -612,8 +612,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_QUEST_TRACK_ABANDON_TIME, "UPDATE quest_tracker SET quest_abandon_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); //########################## TrinityRP - // DisplayID (morph) - PrepareStatement(CHAR_UPD_DISPLAYID, "UPDATE character_displayid SET displayid = ? WHERE guid = ?", CONNECTION_ASYNC); //save + // DisplayID (morph) "UPDATE character_displayid SET displayid = ? WHERE guid = ?" + PrepareStatement(CHAR_UPD_DISPLAYID, "INSERT INTO character_displayid (guid, displayid) VALUES (?, ?) ON DUPLICATE KEY UPDATE displayid = ?;", CONNECTION_ASYNC); //save PrepareStatement(CHAR_SEL_DISPLAYID, "SELECT displayid FROM character_displayid WHERE guid = ?", CONNECTION_ASYNC); //load //########################## TrinityRP }