diff options
-rw-r--r-- | sql/base/characters_database.sql | 62 | ||||
-rw-r--r-- | sql/updates/characters/2014_08_28_00_characters_pvpstats.sql | 28 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 59 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundScore.h | 13 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundAB.h | 3 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundAV.h | 6 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundEY.h | 2 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundIC.h | 3 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundSA.h | 3 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundWS.h | 3 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 1 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.cpp | 6 | ||||
-rw-r--r-- | src/server/shared/Database/Implementation/CharacterDatabase.h | 4 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 8 |
15 files changed, 201 insertions, 1 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index c7e1372e9a1..6e3ab43e4ac 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2379,6 +2379,66 @@ LOCK TABLES `pool_quest_save` WRITE; UNLOCK TABLES; -- +-- Table structure for table `pvpstats_battlegrounds` +-- + +DROP TABLE IF EXISTS `pvpstats_battlegrounds`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pvpstats_battlegrounds` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `winner_faction` tinyint(4) NOT NULL, + `bracket_id` tinyint(3) unsigned NOT NULL, + `type` tinyint(3) unsigned NOT NULL, + `date` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `pvpstats_battlegrounds` +-- + +LOCK TABLES `pvpstats_battlegrounds` WRITE; +/*!40000 ALTER TABLE `pvpstats_battlegrounds` DISABLE KEYS */; +/*!40000 ALTER TABLE `pvpstats_battlegrounds` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `pvpstats_players` +-- + +DROP TABLE IF EXISTS `pvpstats_players`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pvpstats_players` ( + `battleground_id` bigint(20) unsigned NOT NULL, + `character_guid` int(10) unsigned NOT NULL, + `score_killing_blows` mediumint(8) unsigned NOT NULL, + `score_deaths` mediumint(8) unsigned NOT NULL, + `score_honorable_kills` mediumint(8) unsigned NOT NULL, + `score_bonus_honor` mediumint(8) unsigned NOT NULL, + `score_damage_done` mediumint(8) unsigned NOT NULL, + `score_healing_done` mediumint(8) unsigned NOT NULL, + `attr_1` mediumint(8) unsigned NOT NULL DEFAULT '0', + `attr_2` mediumint(8) unsigned NOT NULL DEFAULT '0', + `attr_3` mediumint(8) unsigned NOT NULL DEFAULT '0', + `attr_4` mediumint(8) unsigned NOT NULL DEFAULT '0', + `attr_5` mediumint(8) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`battleground_id`,`character_guid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `pvpstats_players` +-- + +LOCK TABLES `pvpstats_players` WRITE; +/*!40000 ALTER TABLE `pvpstats_players` DISABLE KEYS */; +/*!40000 ALTER TABLE `pvpstats_players` ENABLE KEYS */; +UNLOCK TABLES; + +-- -- Table structure for table `reserved_name` -- @@ -2457,4 +2517,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2014-01-26 14:39:20 +-- Dump completed on 2014-08-28 15:30:47 diff --git a/sql/updates/characters/2014_08_28_00_characters_pvpstats.sql b/sql/updates/characters/2014_08_28_00_characters_pvpstats.sql new file mode 100644 index 00000000000..0e3c239f8e6 --- /dev/null +++ b/sql/updates/characters/2014_08_28_00_characters_pvpstats.sql @@ -0,0 +1,28 @@ +DROP TABLE IF EXISTS `pvpstats_battlegrounds`; +CREATE TABLE `pvpstats_battlegrounds` ( + `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + `winner_faction` TINYINT NOT NULL, + `bracket_id` TINYINT UNSIGNED NOT NULL, + `type` TINYINT UNSIGNED NOT NULL, + `date` DATETIME NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +DROP TABLE IF EXISTS `pvpstats_players`; +CREATE TABLE `pvpstats_players` ( + `battleground_id` BIGINT UNSIGNED NOT NULL, + `character_guid` INT UNSIGNED NOT NULL, + `score_killing_blows` MEDIUMINT UNSIGNED NOT NULL, + `score_deaths` MEDIUMINT UNSIGNED NOT NULL, + `score_honorable_kills` MEDIUMINT UNSIGNED NOT NULL, + `score_bonus_honor` MEDIUMINT UNSIGNED NOT NULL, + `score_damage_done` MEDIUMINT UNSIGNED NOT NULL, + `score_healing_done` MEDIUMINT UNSIGNED NOT NULL, + `attr_1` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, + `attr_2` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, + `attr_3` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, + `attr_4` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, + `attr_5` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`battleground_id`, `character_guid`) +) ENGINE=InnoDB; + diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 3a59ffa8cf9..c11ee7a39b7 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -712,6 +712,24 @@ void Battleground::EndBattleground(uint32 winner) int32 winmsg_id = 0; + PreparedStatement* stmt; + PreparedQueryResult result; + uint64 battleground_id = 1; + + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PVPSTATS_MAXID); + result = CharacterDatabase.Query(stmt); + + if (result) + { + Field* fields = result->Fetch(); + battleground_id = fields[0].GetInt64() + 1; + } + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVPSTATS_BATTLEGROUND); + } + if (winner == ALLIANCE) { winmsg_id = isBattleground() ? LANG_BG_A_WINS : LANG_ARENA_GOLD_WINS; @@ -719,6 +737,9 @@ void Battleground::EndBattleground(uint32 winner) PlaySoundToAll(SOUND_ALLIANCE_WINS); // alliance wins sound SetWinner(BG_TEAM_ALLIANCE); + + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) + stmt->setUInt8(1, BG_TEAM_ALLIANCE); } else if (winner == HORDE) { @@ -727,10 +748,24 @@ void Battleground::EndBattleground(uint32 winner) PlaySoundToAll(SOUND_HORDE_WINS); // horde wins sound SetWinner(BG_TEAM_HORDE); + + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) + stmt->setUInt8(1, BG_TEAM_HORDE); } else { SetWinner(BG_TEAM_NEUTRAL); + + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) + stmt->setUInt8(1, BG_TEAM_NEUTRAL); + } + + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) + { + stmt->setUInt64(0, battleground_id); + stmt->setUInt8(2, m_BracketId + 1); + stmt->setUInt8(3, GetTypeID()); + CharacterDatabase.Execute(stmt); } SetStatus(STATUS_WAIT_LEAVE); @@ -770,6 +805,30 @@ void Battleground::EndBattleground(uint32 winner) uint32 loser_kills = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_FIRST); uint32 winner_arena = player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_ARENA_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_ARENA_FIRST); + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE)) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVPSTATS_PLAYER); + BattlegroundScoreMap::const_iterator score = PlayerScores.find(player->GetGUIDLow()); + + // battleground_id, character_guid, score_killing_blows, score_deaths, score_honorable_kills, score_bonus_honor, score_damage_done, score_healing_done + + stmt->setUInt32(0, battleground_id); + stmt->setUInt32(1, player->GetGUIDLow()); + stmt->setUInt32(2, score->second->GetKillingBlows()); + stmt->setUInt32(3, score->second->GetDeaths()); + stmt->setUInt32(4, score->second->GetHonorableKills()); + stmt->setUInt32(5, score->second->GetBonusHonor()); + stmt->setUInt32(6, score->second->GetDamageDone()); + stmt->setUInt32(7, score->second->GetHealingDone()); + stmt->setUInt32(8, score->second->GetAttr1()); + stmt->setUInt32(9, score->second->GetAttr2()); + stmt->setUInt32(10, score->second->GetAttr3()); + stmt->setUInt32(11, score->second->GetAttr4()); + stmt->setUInt32(12, score->second->GetAttr5()); + + CharacterDatabase.Execute(stmt); + } + // Reward winner team if (team == winner) { diff --git a/src/server/game/Battlegrounds/BattlegroundScore.h b/src/server/game/Battlegrounds/BattlegroundScore.h index 81aca355be8..f91c2aae579 100644 --- a/src/server/game/Battlegrounds/BattlegroundScore.h +++ b/src/server/game/Battlegrounds/BattlegroundScore.h @@ -107,6 +107,19 @@ struct BattlegroundScore // For Logging purpose virtual std::string ToString() const { return ""; } + uint32 GetKillingBlows() const { return KillingBlows; } + uint32 GetDeaths() const { return Deaths; } + uint32 GetHonorableKills() const { return HonorableKills; } + uint32 GetBonusHonor() const { return BonusHonor; } + uint32 GetDamageDone() const { return DamageDone; } + uint32 GetHealingDone() const { return HealingDone; } + + virtual uint32 GetAttr1() const { return 0; } + virtual uint32 GetAttr2() const { return 0; } + virtual uint32 GetAttr3() const { return 0; } + virtual uint32 GetAttr4() const { return 0; } + virtual uint32 GetAttr5() const { return 0; } + uint64 PlayerGuid; // Default score, present in every type diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index 7655880117f..e44c2682094 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -267,6 +267,9 @@ struct BattlegroundABScore final : public BattlegroundScore data << uint32(BasesDefended); } + uint32 GetAttr1() const { return BasesAssaulted; } + uint32 GetAttr2() const { return BasesDefended; } + uint32 BasesAssaulted; uint32 BasesDefended; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index 882d729c1e8..ac8eebf8cfa 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1568,6 +1568,12 @@ struct BattlegroundAVScore final : public BattlegroundScore data << uint32(MinesCaptured); } + uint32 GetAttr1() const { return GraveyardsAssaulted; } + uint32 GetAttr2() const { return GraveyardsDefended; } + uint32 GetAttr3() const { return TowersAssaulted; } + uint32 GetAttr4() const { return TowersDefended; } + uint32 GetAttr5() const { return MinesCaptured; } + uint32 GraveyardsAssaulted; uint32 GraveyardsDefended; uint32 TowersAssaulted; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index 4a146a17917..7482973d45a 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -349,6 +349,8 @@ struct BattlegroundEYScore final : public BattlegroundScore data << uint32(FlagCaptures); } + uint32 GetAttr1() const { return FlagCaptures; } + uint32 FlagCaptures; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index 5a9b47ec9b5..9c09df64ba0 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -878,6 +878,9 @@ struct BattlegroundICScore final : public BattlegroundScore data << uint32(BasesDefended); } + uint32 GetAttr1() const { return BasesAssaulted; } + uint32 GetAttr2() const { return BasesDefended; } + uint32 BasesAssaulted; uint32 BasesDefended; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index 627c23850d2..bb53428c264 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -538,6 +538,9 @@ struct BattlegroundSAScore final : public BattlegroundScore data << uint32(GatesDestroyed); } + uint32 GetAttr1() const { return DemolishersDestroyed; } + uint32 GetAttr2() const { return GatesDestroyed; } + uint32 DemolishersDestroyed; uint32 GatesDestroyed; }; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index d29715c982b..78bbb071c6f 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -177,6 +177,9 @@ struct BattlegroundWGScore final : public BattlegroundScore data << uint32(FlagReturns); } + uint32 GetAttr1() const { return FlagCaptures; } + uint32 GetAttr2() const { return FlagReturns; } + uint32 FlagCaptures; uint32 FlagReturns; }; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 4de9cb34df6..184637b0a1d 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1021,6 +1021,7 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_BATTLEGROUND_CAST_DESERTER] = sConfigMgr->GetBoolDefault("Battleground.CastDeserter", true); m_bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetBoolDefault("Battleground.QueueAnnouncer.Enable", false); m_bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetBoolDefault("Battleground.QueueAnnouncer.PlayerOnly", false); + m_bool_configs[CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE] = sConfigMgr->GetBoolDefault("Battleground.StoreStatistics.Enable", false); m_int_configs[CONFIG_BATTLEGROUND_INVITATION_TYPE] = sConfigMgr->GetIntDefault ("Battleground.InvitationType", 0); m_int_configs[CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER] = sConfigMgr->GetIntDefault ("Battleground.PrematureFinishTimer", 5 * MINUTE * IN_MILLISECONDS); m_int_configs[CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH] = sConfigMgr->GetIntDefault ("Battleground.PremadeGroupWaitForMatch", 30 * MINUTE * IN_MILLISECONDS); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index cb87e1739c2..fd31099a5ea 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -121,6 +121,7 @@ enum WorldBoolConfigs CONFIG_BATTLEGROUND_CAST_DESERTER, CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE, CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY, + CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE, CONFIG_BG_XP_FOR_KILL, CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS, CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE, diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 24e61e7399a..0669d0b84f9 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -600,4 +600,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_CHAR_PET_SLOT_BY_ID, "UPDATE character_pet SET slot = ? WHERE owner = ? AND id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_PET_BY_ID, "DELETE FROM character_pet WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_PET_BY_SLOT, "DELETE FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?)", CONNECTION_ASYNC); + + // PvPstats + PrepareStatement(CHAR_SEL_PVPSTATS_MAXID, "SELECT MAX(id) FROM pvpstats_battlegrounds", CONNECTION_SYNCH); + PrepareStatement(CHAR_INS_PVPSTATS_BATTLEGROUND, "INSERT INTO pvpstats_battlegrounds (id, winner_faction, bracket_id, type, date) VALUES (?, ?, ?, ?, NOW())", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_PVPSTATS_PLAYER, "INSERT INTO pvpstats_players (battleground_id, character_guid, score_killing_blows, score_deaths, score_honorable_kills, score_bonus_honor, score_damage_done, score_healing_done, attr_1, attr_2, attr_3, attr_4, attr_5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index c73f0df8d00..19b5fef82eb 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -534,6 +534,10 @@ enum CharacterDatabaseStatements CHAR_DEL_ITEMCONTAINER_MONEY, CHAR_INS_ITEMCONTAINER_MONEY, + CHAR_SEL_PVPSTATS_MAXID, + CHAR_INS_PVPSTATS_BATTLEGROUND, + CHAR_INS_PVPSTATS_PLAYER, + MAX_CHARACTERDATABASE_STATEMENTS }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index d98a061b9f3..ee6def23c3e 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2060,6 +2060,14 @@ Battleground.QueueAnnouncer.Enable = 0 Battleground.QueueAnnouncer.PlayerOnly = 0 # +# Battleground.StoreStatistics.Enable +# Description: Store Battleground scores in the database. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Battleground.StoreStatistics.Enable = 0 + +# # Battleground.InvitationType # Description: Set Battleground invitation type. # Default: 0 - (Normal, Invite as much players to battlegrounds as queued, |