Skip to content

Instantly share code, notes, and snippets.

@SymbolixDEV
Created May 16, 2013 17:48
Show Gist options
  • Save SymbolixDEV/5593614 to your computer and use it in GitHub Desktop.
Save SymbolixDEV/5593614 to your computer and use it in GitHub Desktop.
Armory patch
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