Created
May 16, 2013 17:48
-
-
Save SymbolixDEV/5593614 to your computer and use it in GitHub Desktop.
Armory patch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 2ee283b9f881773bdc34ced971c95b353c993a4f Mon Sep 17 00:00:00 2001 | |
From: takenbacon <[email protected]> | |
Date: Sat, 30 Mar 2013 13:23:12 -0700 | |
Subject: [PATCH] Updated Armory Patch | |
--- | |
src/server/game/Achievements/AchievementMgr.cpp | 1 + | |
src/server/game/Battlegrounds/Battleground.cpp | 47 +++++++++++++ | |
src/server/game/Battlegrounds/Battleground.h | 10 ++- | |
src/server/game/Entities/Item/Item.cpp | 7 ++ | |
src/server/game/Entities/Player/Player.cpp | 81 ++++++++++++++++++++++ | |
src/server/game/Entities/Player/Player.h | 24 +++++++ | |
src/server/game/Entities/Unit/Unit.cpp | 15 ++++ | |
.../Database/Implementation/CharacterDatabase.cpp | 2 + | |
.../Database/Implementation/CharacterDatabase.h | 2 + | |
9 files changed, 188 insertions(+), 1 deletion(-) | |
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp | |
index 1de9c78..3738af7 100644 | |
--- a/src/server/game/Achievements/AchievementMgr.cpp | |
+++ b/src/server/game/Achievements/AchievementMgr.cpp | |
@@ -2043,6 +2043,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) | |
achievement->ID, m_player->GetName().c_str(), m_player->GetGUIDLow()); | |
SendAchievementEarned(achievement); | |
+ GetPlayer()->CreateWowarmoryFeed(1, achievement->ID, 0, 0); | |
CompletedAchievementData& ca = m_completedAchievements[achievement->ID]; | |
ca.date = time(NULL); | |
ca.changed = true; | |
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp | |
index 264c2c3..088e502 100644 | |
--- a/src/server/game/Battlegrounds/Battleground.cpp | |
+++ b/src/server/game/Battlegrounds/Battleground.cpp | |
@@ -792,6 +792,45 @@ void Battleground::EndBattleground(uint32 winner) | |
SetArenaMatchmakerRating(GetOtherTeam(winner), loserMatchmakerRating + loserMatchmakerChange); | |
SetArenaTeamRatingChangeForTeam(winner, winnerChange); | |
SetArenaTeamRatingChangeForTeam(GetOtherTeam(winner), loserChange); | |
+ /** World of Warcraft Armory **/ | |
+ uint32 maxChartID; | |
+ QueryResult result = CharacterDatabase.PQuery("SELECT MAX(gameid) FROM armory_game_chart"); | |
+ if (!result) | |
+ maxChartID = 0; | |
+ else | |
+ maxChartID = (*result)[0].GetUInt32(); | |
+ | |
+ uint32 gameID = maxChartID+1; | |
+ for (BattlegroundScoreMap::const_iterator itr = PlayerScores.begin(); itr != PlayerScores.end(); ++itr) | |
+ { | |
+ Player *plr = ObjectAccessor::FindPlayer(itr->first); | |
+ if (!plr) | |
+ continue; | |
+ uint32 plTeamID = plr->GetArenaTeamId(winnerArenaTeam->GetSlot()); | |
+ int changeType; | |
+ uint32 resultRating; | |
+ uint32 resultTeamID; | |
+ int32 ratingChange; | |
+ if (plTeamID == winnerArenaTeam->GetId()) | |
+ { | |
+ changeType = 1; //win | |
+ resultRating = winnerTeamRating; | |
+ resultTeamID = plTeamID; | |
+ ratingChange = winnerChange; | |
+ } | |
+ else | |
+ { | |
+ changeType = 2; //lose | |
+ resultRating = loserTeamRating; | |
+ resultTeamID = loserArenaTeam->GetId(); | |
+ ratingChange = loserChange; | |
+ } | |
+ std::ostringstream sql_query; | |
+ // gameid, teamid, guid, changeType, ratingChange, teamRating, damageDone, deaths, healingDone, damageTaken,, healingTaken, killingBlows, mapId, start, end | |
+ sql_query << "INSERT INTO armory_game_chart VALUES ('" << gameID << "', '" << resultTeamID << "', '" << plr->GetGUID() << "', '" << changeType << "', '" << ratingChange << "', '" << resultRating << "', '" << itr->second->DamageDone << "', '" << itr->second->Deaths << "', '" << itr->second->HealingDone << "', '" << itr->second->DamageTaken << "', '" << itr->second->HealingTaken << "', '" << itr->second->KillingBlows << "', '" << m_MapId << "', '" << m_StartTime << "', '" << m_EndTime << "')"; | |
+ CharacterDatabase.Execute(sql_query.str().c_str()); | |
+ } | |
+ /** World of Warcraft Armory **/ | |
sLog->outDebug(LOG_FILTER_ARENAS, "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", m_ArenaType, m_ArenaTeamIds[TEAM_ALLIANCE], m_ArenaTeamIds[TEAM_HORDE], winnerArenaTeam->GetId(), winnerChange, loserChange); | |
if (sWorld->getBoolConfig(CONFIG_ARENA_LOG_EXTENDED_INFO)) | |
for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr) | |
@@ -1390,6 +1429,14 @@ void Battleground::UpdatePlayerScore(Player* Source, uint32 type, uint32 value, | |
case SCORE_HEALING_DONE: // Healing Done | |
itr->second->HealingDone += value; | |
break; | |
+ /** World of Warcraft Armory **/ | |
+ case SCORE_DAMAGE_TAKEN: | |
+ itr->second->DamageTaken += value; // Damage Taken | |
+ break; | |
+ case SCORE_HEALING_TAKEN: | |
+ itr->second->HealingTaken += value; // Healing Taken | |
+ break; | |
+ /** World of Warcraft Armory **/ | |
default: | |
sLog->outError(LOG_FILTER_BATTLEGROUND, "Battleground::UpdatePlayerScore: unknown score type (%u) for BG (map: %u, instance id: %u)!", | |
type, m_MapId, m_InstanceID); | |
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h | |
index 8aba0ae..1b29cb3 100644 | |
--- a/src/server/game/Battlegrounds/Battleground.h | |
+++ b/src/server/game/Battlegrounds/Battleground.h | |
@@ -193,7 +193,11 @@ enum ScoreType | |
SCORE_SECONDARY_OBJECTIVES = 17, | |
//SOTA | |
SCORE_DESTROYED_DEMOLISHER = 18, | |
- SCORE_DESTROYED_WALL = 19 | |
+ SCORE_DESTROYED_WALL = 19, | |
+ /** World of Warcraft Armory **/ | |
+ SCORE_DAMAGE_TAKEN = 20, | |
+ SCORE_HEALING_TAKEN = 21 | |
+ /** World of Warcraft Armory **/ | |
}; | |
enum ArenaType | |
@@ -250,6 +254,10 @@ struct BattlegroundScore | |
uint32 BonusHonor; | |
uint32 DamageDone; | |
uint32 HealingDone; | |
+ /** World of Warcraft Armory **/ | |
+ uint32 DamageTaken; | |
+ uint32 HealingTaken; | |
+ /** World of Warcraft Armory **/ | |
}; | |
enum BGHonorMode | |
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp | |
index 5dd7260..a028dcd 100644 | |
--- a/src/server/game/Entities/Item/Item.cpp | |
+++ b/src/server/game/Entities/Item/Item.cpp | |
@@ -278,6 +278,13 @@ bool Item::Create(uint32 guidlow, uint32 itemid, Player const* owner) | |
SetUInt32Value(ITEM_FIELD_DURATION, itemProto->Duration); | |
SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, 0); | |
+ | |
+ if (itemProto->Quality > 2 && itemProto->Flags != 2048 && (itemProto->Class == ITEM_CLASS_WEAPON || itemProto->Class == ITEM_CLASS_ARMOR)) | |
+ { | |
+ if (!GetOwner()) | |
+ return true; | |
+ GetOwner()->CreateWowarmoryFeed(2, itemid, guidlow, itemProto->Quality); | |
+ } | |
return true; | |
} | |
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp | |
index c7c88ae..c8df361 100644 | |
--- a/src/server/game/Entities/Player/Player.cpp | |
+++ b/src/server/game/Entities/Player/Player.cpp | |
@@ -4954,6 +4954,14 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC | |
stmt->setUInt32(0, guid); | |
trans->Append(stmt); | |
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ARMORY_STATS); | |
+ stmt->setUInt32(0, guid); | |
+ trans->Append(stmt); | |
+ | |
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_FEED_LOG); | |
+ stmt->setUInt32(0, guid); | |
+ trans->Append(stmt); | |
+ | |
CharacterDatabase.CommitTransaction(trans); | |
break; | |
} | |
@@ -16783,6 +16791,9 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) | |
return false; | |
} | |
+ // Cleanup old Wowarmory feeds | |
+ InitWowarmoryFeeds(); | |
+ | |
// overwrite possible wrong/corrupted guid | |
SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER)); | |
@@ -18963,6 +18974,35 @@ void Player::SaveToDB(bool create /*=false*/) | |
CharacterDatabase.CommitTransaction(trans); | |
+ /* World of Warcraft Armory */ | |
+ // Place this code AFTER CharacterDatabase.CommitTransaction(); to avoid some character saving errors. | |
+ // Wowarmory feeds | |
+ if (!m_wowarmory_feeds.empty()) | |
+ { | |
+ std::ostringstream sWowarmory; | |
+ sWowarmory << "INSERT IGNORE INTO character_feed_log (guid,type,data,date,counter,difficulty,item_guid,item_quality) VALUES "; | |
+ for (WowarmoryFeeds::iterator iter = m_wowarmory_feeds.begin(); iter < m_wowarmory_feeds.end(); ++iter) | |
+ { | |
+ // guid type data date counter difficulty item_guid item_quality | |
+ sWowarmory << "(" << (*iter).guid << ", " << (*iter).type << ", " << (*iter).data << ", " << uint64((*iter).date) << ", " << (*iter).counter << ", " << uint32((*iter).difficulty) << ", " << (*iter).item_guid << ", " << (*iter).item_quality << ")"; | |
+ if (iter != m_wowarmory_feeds.end()-1) | |
+ sWowarmory << ","; | |
+ } | |
+ CharacterDatabase.PExecute(sWowarmory.str().c_str()); | |
+ // Clear old saved feeds from storage - they are not required for server core. | |
+ InitWowarmoryFeeds(); | |
+ } | |
+ // Character stats | |
+ std::ostringstream ps; | |
+ time_t t = time(NULL); | |
+ CharacterDatabase.PExecute("DELETE FROM armory_character_stats WHERE guid = %u", GetGUIDLow()); | |
+ ps << "INSERT INTO armory_character_stats (guid, data, save_date) VALUES (" << GetGUIDLow() << ", '"; | |
+ for (uint16 i = 0; i < m_valuesCount; ++i) | |
+ ps << GetUInt32Value(i) << " "; | |
+ ps << "', " << uint64(t) << ");"; | |
+ CharacterDatabase.PExecute(ps.str().c_str()); | |
+ /* World of Warcraft Armory */ | |
+ | |
// save pet (hunter pet level and experience and all type pets health/mana). | |
if (Pet* pet = GetPet()) | |
pet->SavePetToDB(PET_SAVE_AS_CURRENT); | |
@@ -25858,3 +25898,44 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy | |
return pet; | |
} | |
+ | |
+void Player::InitWowarmoryFeeds() | |
+{ | |
+ // Clear feeds | |
+ m_wowarmory_feeds.clear(); | |
+} | |
+ | |
+void Player::CreateWowarmoryFeed(uint32 type, uint32 data, uint32 item_guid, uint32 item_quality) | |
+{ | |
+ /* | |
+ 1 - TYPE_ACHIEVEMENT_FEED | |
+ 2 - TYPE_ITEM_FEED | |
+ 3 - TYPE_BOSS_FEED | |
+ */ | |
+ if (GetGUIDLow() == 0) | |
+ { | |
+ sLog->outError(LOG_FILTER_GENERAL, "[Wowarmory]: player is not initialized, unable to create log entry!"); | |
+ return; | |
+ } | |
+ if (type <= 0 || type > 3) | |
+ { | |
+ sLog->outError(LOG_FILTER_GENERAL, "[Wowarmory]: unknown feed type: %d, ignore.", type); | |
+ return; | |
+ } | |
+ if (data == 0) | |
+ { | |
+ sLog->outError(LOG_FILTER_GENERAL, "[Wowarmory]: empty data (GUID: %u), ignore.", GetGUIDLow()); | |
+ return; | |
+ } | |
+ WowarmoryFeedEntry feed; | |
+ feed.guid = GetGUIDLow(); | |
+ feed.type = type; | |
+ feed.data = data; | |
+ feed.difficulty = type == 3 ? GetMap()->GetDifficulty() : 0; | |
+ feed.item_guid = item_guid; | |
+ feed.item_quality = item_quality; | |
+ feed.counter = 0; | |
+ feed.date = time(NULL); | |
+ sLog->outDebug(LOG_FILTER_GENERAL, "[Wowarmory]: create wowarmory feed (GUID: %u, type: %d, data: %u).", feed.guid, feed.type, feed.data); | |
+ m_wowarmory_feeds.push_back(feed); | |
+} | |
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h | |
index 362b6ac..10fd36b 100644 | |
--- a/src/server/game/Entities/Player/Player.h | |
+++ b/src/server/game/Entities/Player/Player.h | |
@@ -1057,6 +1057,22 @@ private: | |
bool _isPvP; | |
}; | |
+/* World of Warcraft Armory */ | |
+struct WowarmoryFeedEntry | |
+{ | |
+ uint32 guid; // Player GUID | |
+ time_t date; // Log date | |
+ uint32 type; // TYPE_ACHIEVEMENT_FEED, TYPE_ITEM_FEED, TYPE_BOSS_FEED | |
+ uint32 data; // TYPE_ITEM_FEED: item_entry, TYPE_BOSS_FEED: creature_entry | |
+ uint32 item_guid; // Can be 0 | |
+ uint32 item_quality; // Can be 0 | |
+ uint8 difficulty; // Can be 0 | |
+ int counter; // Can be 0 | |
+}; | |
+ | |
+typedef std::vector<WowarmoryFeedEntry> WowarmoryFeeds; | |
+/* World of Warcraft Armory */ | |
+ | |
class Player : public Unit, public GridObject<Player> | |
{ | |
friend class WorldSession; | |
@@ -2372,6 +2388,11 @@ class Player : public Unit, public GridObject<Player> | |
void SendCinematicStart(uint32 CinematicSequenceId); | |
void SendMovieStart(uint32 MovieId); | |
+ /* World of Warcraft Armory */ | |
+ void CreateWowarmoryFeed(uint32 type, uint32 data, uint32 item_guid, uint32 item_quality); | |
+ void InitWowarmoryFeeds(); | |
+ /* World of Warcraft Armory */ | |
+ | |
/*********************************************************/ | |
/*** INSTANCE SYSTEM ***/ | |
/*********************************************************/ | |
@@ -2870,6 +2891,9 @@ class Player : public Unit, public GridObject<Player> | |
uint32 m_timeSyncClient; | |
uint32 m_timeSyncServer; | |
+ // World of Warcraft Armory Feeds | |
+ WowarmoryFeeds m_wowarmory_feeds; | |
+ | |
InstanceTimeMap _instanceResetTimes; | |
uint32 _pendingBindId; | |
uint32 _pendingBindTimer; | |
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp | |
index fa7ef51..ed8e845 100644 | |
--- a/src/server/game/Entities/Unit/Unit.cpp | |
+++ b/src/server/game/Entities/Unit/Unit.cpp | |
@@ -685,8 +685,16 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam | |
// in bg, count dmg if victim is also a player | |
if (victim->GetTypeId() == TYPEID_PLAYER) | |
+ { | |
if (Battleground* bg = killer->GetBattleground()) | |
+ { | |
bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage); | |
+ /** World of Warcraft Armory **/ | |
+ if (Battleground *bgV = ((Player*)victim)->GetBattleground()) | |
+ bgV->UpdatePlayerScore(((Player*)victim), SCORE_DAMAGE_TAKEN, damage); | |
+ /** World of Warcraft Armory **/ | |
+ } | |
+ } | |
killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); | |
killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); | |
@@ -9490,6 +9498,10 @@ int32 Unit::DealHeal(Unit* victim, uint32 addhealth) | |
{ | |
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); | |
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); | |
+ /** World of Warcraft Armory **/ | |
+ if (Battleground *bgV = victim->ToPlayer()->GetBattleground()) | |
+ bgV->UpdatePlayerScore((Player*)victim, SCORE_HEALING_TAKEN, gain); | |
+ /** World of Warcraft Armory **/ | |
} | |
return gain; | |
@@ -15143,7 +15155,10 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) | |
if (instanceMap->IsRaidOrHeroicDungeon()) | |
{ | |
if (creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) | |
+ { | |
((InstanceMap*)instanceMap)->PermBindAllPlayers(creditedPlayer); | |
+ creditedPlayer->CreateWowarmoryFeed(3, creature->GetCreatureTemplate()->Entry, 0, 0); | |
+ } | |
} | |
else | |
{ | |
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp | |
index f4da15a..aaa57f2 100644 | |
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp | |
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp | |
@@ -503,6 +503,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() | |
PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_DAILY, "DELETE FROM character_queststatus_daily WHERE guid = ?", CONNECTION_ASYNC); | |
PrepareStatement(CHAR_DEL_CHAR_TALENT, "DELETE FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); | |
PrepareStatement(CHAR_DEL_CHAR_SKILLS, "DELETE FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); | |
+ PrepareStatement(CHAR_DEL_ARMORY_STATS, "DELETE FROM armory_character_stats WHERE guid = ?", CONNECTION_ASYNC); | |
+ PrepareStatement(CHAR_DEL_FEED_LOG, "DELETE FROM character_feed_log WHERE guid = ?", CONNECTION_ASYNC); | |
PrepareStatement(CHAR_UDP_CHAR_HONOR_POINTS, "UPDATE characters SET totalHonorPoints = ? WHERE guid = ?", CONNECTION_ASYNC); | |
PrepareStatement(CHAR_UDP_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = ? WHERE guid = ?", CONNECTION_ASYNC); | |
PrepareStatement(CHAR_UDP_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC); | |
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h | |
index 4c5f5d2..38706c1 100644 | |
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h | |
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h | |
@@ -443,6 +443,8 @@ enum CharacterDatabaseStatements | |
CHAR_DEL_CHAR_QUESTSTATUS_DAILY, | |
CHAR_DEL_CHAR_TALENT, | |
CHAR_DEL_CHAR_SKILLS, | |
+ CHAR_DEL_ARMORY_STATS, | |
+ CHAR_DEL_FEED_LOG, | |
CHAR_UDP_CHAR_HONOR_POINTS, | |
CHAR_UDP_CHAR_ARENA_POINTS, | |
CHAR_UDP_CHAR_MONEY, | |
-- | |
1.8.1.msysgit.1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment