Advertisement
Guest User

Untitled

a guest
Oct 8th, 2012
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.09 KB | None | 0 0
  1. diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
  2. index f3de237..1740d66 100755
  3. --- a/src/server/game/Achievements/AchievementMgr.cpp
  4. +++ b/src/server/game/Achievements/AchievementMgr.cpp
  5. @@ -1951,6 +1951,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement, b
  6.          return;
  7.  
  8.      SendAchievementEarned(achievement);
  9. +    GetPlayer()->CreateWowarmoryFeed(1, achievement->ID, 0, 0);
  10.      CompletedAchievementData& ca = m_completedAchievements[achievement->ID];
  11.      ca.date = time(NULL);
  12.      ca.changed = true;
  13. diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
  14. index 29dff32..e29ee93 100755
  15. --- a/src/server/game/Entities/Item/Item.cpp
  16. +++ b/src/server/game/Entities/Item/Item.cpp
  17. @@ -278,6 +278,13 @@ bool Item::Create(uint32 guidlow, uint32 itemid, Player const* owner)
  18.  
  19.      SetUInt32Value(ITEM_FIELD_DURATION, abs(itemProto->Duration));
  20.      SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, 0);
  21. +
  22. +    if (itemProto->Quality > 2 && itemProto->Flags != 2048 && (itemProto->Class == ITEM_CLASS_WEAPON || itemProto->Class == ITEM_CLASS_ARMOR))
  23. +    {
  24. +        if (!GetOwner())
  25. +            return true;
  26. +        GetOwner()->CreateWowarmoryFeed(2, itemid, guidlow, itemProto->Quality);
  27. +    }
  28.      return true;
  29.  }
  30.  
  31. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  32. index 8f27455..def9773 100755
  33. --- a/src/server/game/Entities/Player/Player.cpp
  34. +++ b/src/server/game/Entities/Player/Player.cpp
  35. @@ -4951,7 +4951,15 @@
  36.              stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
  37.              stmt->setUInt32(0, guid);
  38.              trans->Append(stmt);
  39.  
  40. +            stmt = CharacterDatabase.GetPreparedStatement(ARMORY_CHAR_STATS);
  41. +            stmt->setUInt32(0, guid);
  42. +            trans->Append(stmt);
  43. +
  44. +            stmt = CharacterDatabase.GetPreparedStatement(ARMORY_CHAR_FEED);
  45. +            stmt->setUInt32(0, guid);
  46. +            trans->Append(stmt);
  47. +
  48.              CharacterDatabase.CommitTransaction(trans);
  49.              break;
  50.          }
  51. @@ -16435,6 +16437,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder)
  52.          CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid ='%u'", uint32(AT_LOGIN_RENAME),guid);
  53.          return false;
  54.      }
  55. +    // Cleanup old Wowarmory feeds
  56. +    InitWowarmoryFeeds();
  57.  
  58.      // overwrite possible wrong/corrupted guid
  59.      SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
  60. @@ -18365,6 +18369,30 @@ void Player::SaveToDB()
  61.  
  62.      CharacterDatabase.CommitTransaction(trans);
  63.  
  64. +    /* World of Warcraft Armory */
  65. +    // Place this code AFTER CharacterDatabase.CommitTransaction(); to avoid some character saving errors.
  66. +    // Wowarmory feeds
  67. +    std::ostringstream sWowarmory;
  68. +    for (WowarmoryFeeds::iterator iter = m_wowarmory_feeds.begin(); iter < m_wowarmory_feeds.end(); ++iter) {
  69. +        sWowarmory << "INSERT IGNORE INTO character_feed_log (guid,type,data,date,counter,difficulty,item_guid,item_quality) VALUES ";
  70. +        //                      guid                    type                        data                    date                            counter                   difficulty                        item_guid                      item_quality
  71. +        sWowarmory << "(" << (*iter).guid << ", " << (*iter).type << ", " << (*iter).data << ", " << uint64((*iter).date) << ", " << (*iter).counter << ", " << uint32((*iter).difficulty) << ", " << (*iter).item_guid << ", " << (*iter).item_quality <<  ");";
  72. +        CharacterDatabase.PExecute(sWowarmory.str().c_str());
  73. +        sWowarmory.str("");
  74. +    }
  75. +    // Clear old saved feeds from storage - they are not required for server core.
  76. +    InitWowarmoryFeeds();
  77. +    // Character stats
  78. +    std::ostringstream ps;
  79. +    time_t t = time(NULL);
  80. +    CharacterDatabase.PExecute("DELETE FROM armory_character_stats WHERE guid = %u", GetGUIDLow());
  81. +    ps << "INSERT INTO armory_character_stats (guid, data, save_date) VALUES (" << GetGUIDLow() << ", '";
  82. +    for (uint16 i = 0; i < m_valuesCount; ++i)
  83. +        ps << GetUInt32Value(i) << " ";
  84. +    ps << "', " << uint64(t) << ");";
  85. +    CharacterDatabase.PExecute(ps.str().c_str());
  86. +    /* World of Warcraft Armory */
  87. +
  88.      // save pet (hunter pet level and experience and all type pets health/mana).
  89.      if (Pet* pet = GetPet())
  90.          pet->SavePetToDB(PET_SAVE_AS_CURRENT);
  91. @@ -24641,3 +24669,42 @@ void Player::_SaveInstanceTimeRestrictions(SQLTransaction& trans)
  92.          trans->Append(stmt);
  93.      }
  94.  }
  95. +
  96. +void Player::InitWowarmoryFeeds() {
  97. +    // Clear feeds
  98. +    m_wowarmory_feeds.clear();
  99. +}
  100. +
  101. +void Player::CreateWowarmoryFeed(uint32 type, uint32 data, uint32 item_guid, uint32 item_quality) {
  102. +    /*
  103. +        1 - TYPE_ACHIEVEMENT_FEED
  104. +        2 - TYPE_ITEM_FEED
  105. +        3 - TYPE_BOSS_FEED
  106. +    */
  107. +    if (GetGUIDLow() == 0)
  108. +    {
  109. +        sLog->outError(LOG_FILTER_PLAYER, "[Wowarmory]: player is not initialized, unable to create log entry!");
  110. +        return;
  111. +    }
  112. +    if (type <= 0 || type > 3)
  113. +    {
  114. +        sLog->outError(LOG_FILTER_PLAYER, "[Wowarmory]: unknown feed type: %d, ignore.", type);
  115. +        return;
  116. +    }
  117. +    if (data == 0)
  118. +    {
  119. +        sLog->outError(LOG_FILTER_PLAYER, "[Wowarmory]: empty data (GUID: %u), ignore.", GetGUIDLow());
  120. +        return;
  121. +    }
  122. +    WowarmoryFeedEntry feed;
  123. +    feed.guid = GetGUIDLow();
  124. +    feed.type = type;
  125. +    feed.data = data;
  126. +    feed.difficulty = type == 3 ? GetMap()->GetDifficulty() : 0;
  127. +    feed.item_guid  = item_guid;
  128. +    feed.item_quality = item_quality;
  129. +    feed.counter = 0;
  130. +    feed.date = time(NULL);
  131. +    sLog->outDebug(LOG_FILTER_UNITS, "[Wowarmory]: create wowarmory feed (GUID: %u, type: %d, data: %u).", feed.guid, feed.type, feed.data);
  132. +    m_wowarmory_feeds.push_back(feed);
  133. +}
  134. \ No newline at end of file
  135. diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
  136. index d22054f..129c2a2 100755
  137. --- a/src/server/game/Entities/Player/Player.h
  138. +++ b/src/server/game/Entities/Player/Player.h
  139. @@ -1028,6 +1028,21 @@ private:
  140.      uint32 _xp;
  141.  };
  142.  
  143. +/* World of Warcraft Armory */
  144. +struct WowarmoryFeedEntry {
  145. +    uint32 guid;         // Player GUID
  146. +    time_t date;         // Log date
  147. +    uint32 type;         // TYPE_ACHIEVEMENT_FEED, TYPE_ITEM_FEED, TYPE_BOSS_FEED
  148. +    uint32 data;         // TYPE_ITEM_FEED: item_entry, TYPE_BOSS_FEED: creature_entry
  149. +    uint32 item_guid;    // Can be 0
  150. +    uint32 item_quality; // Can be 0
  151. +    uint8  difficulty;   // Can be 0
  152. +    int    counter;      // Can be 0
  153. +};
  154. +
  155. +typedef std::vector<WowarmoryFeedEntry> WowarmoryFeeds;
  156. +/* World of Warcraft Armory */
  157. +
  158.  class Player : public Unit, public GridObject<Player>
  159.  {
  160.      friend class WorldSession;
  161. @@ -2316,6 +2331,12 @@ class Player : public Unit, public GridObject<Player>
  162.          void SendCinematicStart(uint32 CinematicSequenceId);
  163.          void SendMovieStart(uint32 MovieId);
  164.  
  165. +        /* World of Warcraft Armory */
  166. +        void CreateWowarmoryFeed(uint32 type, uint32 data, uint32 item_guid, uint32 item_quality);
  167. +        void InitWowarmoryFeeds();
  168. +        /* World of Warcraft Armory */
  169. +
  170. +
  171.          /*********************************************************/
  172.          /***                 INSTANCE SYSTEM                   ***/
  173.          /*********************************************************/
  174. @@ -2755,6 +2776,8 @@ class Player : public Unit, public GridObject<Player>
  175.          uint32 m_timeSyncTimer;
  176.          uint32 m_timeSyncClient;
  177.          uint32 m_timeSyncServer;
  178. +        // World of Warcraft Armory Feeds
  179. +        WowarmoryFeeds m_wowarmory_feeds;
  180.  
  181.          InstanceTimeMap _instanceResetTimes;
  182.          InstanceSave* _pendingBind;
  183. diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
  184. index de68aef..96960f0 100755
  185. --- a/src/server/game/Entities/Unit/Unit.cpp
  186. +++ b/src/server/game/Entities/Unit/Unit.cpp
  187. @@ -15611,7 +15622,10 @@
  188.                  if (instanceMap->IsRaidOrHeroicDungeon())
  189.                  {
  190.                      if (creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND)
  191. +                    {
  192.                          ((InstanceMap*)instanceMap)->PermBindAllPlayers(creditedPlayer);
  193. +                        creditedPlayer->CreateWowarmoryFeed(3, creature->GetCreatureTemplate()->Entry, 0, 0);
  194. +                    }
  195.                  }
  196.                  else
  197.                  {
  198. diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
  199. index 8f27455..def9773 100755
  200. --- a/src/server/shared/Database/Implementation/CharacterDatabase.h
  201. +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
  202. @@ -513,6 +513,8 @@
  203.      CHAR_INS_CHAR_TALENT,
  204.      CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC,
  205.      CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT,
  206. +    ARMORY_CHAR_STATS,
  207. +    ARMORY_CHAR_FEED,
  208.  
  209.      MAX_CHARACTERDATABASE_STATEMENTS,
  210.  };
  211. diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  212. index 8f27455..def9773 100755
  213. --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  214. +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
  215. @@ -551,4 +551,6 @@
  216.      PREPARE_STATEMENT(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC);
  217.      PREPARE_STATEMENT(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND slot = ?", CONNECTION_SYNCH);
  218. +    PREPARE_STATEMENT(ARMORY_CHAR_STATS, "DELETE FROM armory_character_stats WHERE guid = ?", CONNECTION_ASYNC);
  219. +    PREPARE_STATEMENT(ARMORY_CHAR_FEED, "DELETE FROM character_feed_log WHERE guid = ?", CONNECTION_ASYNC);
  220.  }
  221. \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement