diff --git a/modules/azerothshard/src/server/game/AzthGroupMgr.cpp b/modules/azerothshard/src/server/game/AzthGroupMgr.cpp index 3776c23cca..af774898b8 100644 --- a/modules/azerothshard/src/server/game/AzthGroupMgr.cpp +++ b/modules/azerothshard/src/server/game/AzthGroupMgr.cpp @@ -3,7 +3,7 @@ AzthGroupMgr::AzthGroupMgr(Group* group) { this->group = group; - this->levelMaxGroup; + this->levelMaxGroup = 0; } void AzthGroupMgr::saveToDb() { diff --git a/modules/azerothshard/src/server/plugins/AzthPlayerPlg.cpp b/modules/azerothshard/src/server/plugins/AzthPlayerPlg.cpp index 55b73b1cc8..e4433bd6db 100644 --- a/modules/azerothshard/src/server/plugins/AzthPlayerPlg.cpp +++ b/modules/azerothshard/src/server/plugins/AzthPlayerPlg.cpp @@ -11,6 +11,11 @@ #include "AchievementMgr.h" #include "AzthGroupMgr.h" +enum achievementStatsType { + ACHIEVEMENT_TYPE, + CRITERIA_TYPE +}; + class AzthPlayerPlg : public PlayerScript{ public: @@ -20,21 +25,19 @@ public: uint16 tmpLevelPg; uint8 groupLevel; - struct CompletedAchievementData + struct AzthAchiData { uint8 level; uint8 levelParty; }; - typedef UNORDERED_MAP CompletedAchievementMap; + typedef UNORDERED_MAP CompletedAchievementMap; CompletedAchievementMap m_completed_achievement_map; + + typedef UNORDERED_MAP CompletedCriteriaMap; + CompletedCriteriaMap m_completed_criteria_map; + uint32 instanceID; - - // Fixa sta pircheria - void GetPartyLevel(Group* group, Player* player, AchievementMgr* achievement ) { - - - } void OnLevelChanged(Player* player, uint8 oldLevel) override { @@ -75,44 +78,72 @@ public: } } + // Following 2 functions store levels in a temporary map void OnAchiComplete(Player *player, AchievementEntry const* achievement) override { + AzthAchiData& it = m_completed_achievement_map[achievement->ID]; + it.level = player->getLevel(); + it.levelParty = getGroupLevel(player); + } - Group* group = NULL; - uint64 leaderGUID = 0; - uint16 levelPlayer = player->getLevel(); + void OnCriteriaProgress(Player *player, AchievementCriteriaEntry const* criteria) override { + AzthAchiData& it = m_completed_criteria_map[criteria->ID]; + it.level = player->getLevel(); + it.levelParty = getGroupLevel(player); + } + // Following 2 functions save our temporary maps inside the db + void OnAchiSave(SQLTransaction& trans, Player *player, uint16 achId, CompletedAchievementData achiData) override { + + AzthAchiData& it = m_completed_achievement_map[achId]; + uint32 index = 0; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVESTATS); + stmt->setUInt32(index++, player->GetGUID()); + stmt->setUInt32(index++, achId); + stmt->setUInt32(index++, ACHIEVEMENT_TYPE); + stmt->setUInt32(index++, it.level); + stmt->setUInt32(index++, it.levelParty); + stmt->setUInt32(index++, achiData.date); + trans->Append(stmt); + + m_completed_achievement_map.erase(achId); + } + + void OnCriteriaSave(SQLTransaction& trans, Player* player, uint16 critId, CriteriaProgress criteriaData) override { + + AzthAchiData& it = m_completed_criteria_map[critId]; + uint32 index = 0; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVESTATS); + stmt->setUInt32(index++, player->GetGUID()); + stmt->setUInt32(index++, critId); + stmt->setUInt32(index++, CRITERIA_TYPE); + stmt->setUInt32(index++, it.level); + stmt->setUInt32(index++, it.levelParty); + stmt->setUInt32(index++, criteriaData.date); + trans->Append(stmt); + + m_completed_criteria_map.erase(critId); + } + +private: + uint8 getGroupLevel(Player *player) { + uint8 groupLevel = 0; + + Group *group = player->GetGroup(); Map* map = player->FindMap(); - if (map->IsDungeon()) { - InstanceSave* is = sInstanceSaveMgr->PlayerGetInstanceSave(GUID_LOPART(player->GetGUID()), map->GetId(), player->GetDifficulty((map->IsRaid()))); - if (is->azthInstMgr->levelMax!=0) { - levelPlayer = is->azthInstMgr->levelMax; + if (group) { + if (map->IsDungeon()) { + // caso party instance + InstanceSave* is = sInstanceSaveMgr->PlayerGetInstanceSave(GUID_LOPART(player->GetGUID()), map->GetId(), player->GetDifficulty((map->IsRaid()))); + groupLevel = is->azthInstMgr->levelMax; + } else { + // caso party esterno + groupLevel = group->azthGroupMgr->levelMaxGroup; } } - CompletedAchievementData& it = m_completed_achievement_map[achievement->ID]; - it.level = levelPlayer; - if(player->GetGroup()->isRaidGroup()) - it.levelParty = group->azthGroupMgr->levelMaxGroup; - - - // Da spostare nella SaveToDb - /* PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVESTATS); - // playerGuid, achievement, type, level, levelParty, date - stmt->setUInt32(0, player->GetGUID()); - stmt->setUInt32(1, achievement->ID); - stmt->setUInt32(2, 0); - stmt->setUInt32(3, levelPlayer); - stmt->setUInt32(4, ); - stmt->setUInt32(5, ); - CharacterDatabase.Execute(stmt);*/ - } - - void OnAchiSave(Player *player, uint16 achId) override { - - CompletedAchievementData& it = m_completed_achievement_map[achId]; - - CharacterDatabase.PExecute("UPDATE character_achievement SET levelPg = %u WHERE achievement = %u", it.level, achId); - m_completed_achievement_map.erase(achId); + return groupLevel; } }; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 8430ed0273..7867d9288a 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -546,7 +546,7 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) stmt->setUInt16(0, iter->first); stmt->setUInt32(1, GetPlayer()->GetGUID()); trans->Append(stmt); - + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT); stmt->setUInt32(0, GetPlayer()->GetGUID()); stmt->setUInt16(1, iter->first); @@ -554,7 +554,12 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) trans->Append(stmt); iter->second.changed = false; + + // [AZTH] + sScriptMgr->OnAchievementSave(trans, GetPlayer(), iter->first, iter->second); } + + } if (!m_criteriaProgress.empty()) @@ -581,6 +586,9 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) } iter->second.changed = false; + + //[AZTH] + sScriptMgr->OnCriteriaSave(trans, GetPlayer(), iter->first, iter->second); } } } @@ -2041,6 +2049,8 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, } SendCriteriaUpdate(entry, progress, timeElapsed, timedCompleted); + + sScriptMgr->OnCriteriaProgress(GetPlayer(), entry); } void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry* entry) @@ -2138,6 +2148,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) ca.date = time(NULL); ca.changed = true; + sScriptMgr->OnAchievementComplete(GetPlayer(), achievement); + // pussywizard: set all progress counters to 0, so progress will be deleted from db during save { bool allRefsCompleted = true; diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index c821f35f4e..e55098449a 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -248,9 +248,6 @@ struct CompletedAchievementData { time_t date; bool changed; - //[AZTH] - uint16 levelPlayer; - uint8 groupLevel; }; typedef UNORDERED_MAP CriteriaProgressMap; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index d7769c93ad..c0fc914ba4 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -158,7 +158,6 @@ bool Group::Create(Player* leader) stmt->setUInt32(index++, GUID_LOPART(m_masterLooterGuid)); //[/AZTH] stmt->setUInt32(index++, uint8(leader->getLevel())); - azthGroupMgr->levelMaxGroup = 0; // [/AZTH] CharacterDatabase.Execute(stmt); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 1def3f7ba4..6c372267ad 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1199,9 +1199,19 @@ void ScriptMgr::OnAchievementComplete(Player* player, AchievementEntry const* ac FOREACH_SCRIPT(PlayerScript)->OnAchiComplete(player, achievement); } -void ScriptMgr::OnAchievementSave(Player* player, uint16 achId) +void ScriptMgr::OnCriteriaProgress(Player* player, AchievementCriteriaEntry const* criteria) { - FOREACH_SCRIPT(PlayerScript)->OnAchiSave(player, achId); + FOREACH_SCRIPT(PlayerScript)->OnCriteriaProgress(player, criteria); +} + +void ScriptMgr::OnAchievementSave(SQLTransaction& trans, Player* player, uint16 achiId, CompletedAchievementData achiData) +{ + FOREACH_SCRIPT(PlayerScript)->OnAchiSave(trans, player, achiId, achiData); +} + +void ScriptMgr::OnCriteriaSave(SQLTransaction& trans, Player* player, uint16 critId, CriteriaProgress criteriaData) +{ + FOREACH_SCRIPT(PlayerScript)->OnCriteriaSave(trans, player, critId, criteriaData); } //[/AZTH] diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 04fc8b487d..b3dee66a22 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -30,6 +30,10 @@ #include "World.h" #include "Weather.h" +//[AZTH] +#include "AchievementMgr.h" +//[/AZTH] + class AuctionHouseObject; class AuraScript; class Battleground; @@ -719,7 +723,11 @@ class PlayerScript : public ScriptObject virtual void OnAchiComplete(Player* /*player*/, AchievementEntry const* /*achievement*/) { } - virtual void OnAchiSave(Player* /*player*/, uint16 /*achId*/) { } + virtual void OnCriteriaProgress(Player* /*player*/, AchievementCriteriaEntry const* /*criteria*/) { } + + virtual void OnAchiSave(SQLTransaction& /*trans*/, Player* /*player*/, uint16 /*achId*/, CompletedAchievementData /*achiData*/) { } + + virtual void OnCriteriaSave(SQLTransaction& /*trans*/, Player* /*player*/, uint16 /*achId*/, CriteriaProgress /*criteriaData*/) { } //[/AZTH] }; @@ -992,7 +1000,9 @@ class ScriptMgr // [AZTH] all custom PlayerScript functions void OnPlayerRemoveFromBattleground(Player* player, Battleground* bg); void OnAchievementComplete(Player *player, AchievementEntry const* achievement); - void OnAchievementSave(Player *player, uint16 achId); + void OnCriteriaProgress(Player *player, AchievementCriteriaEntry const* criteria); + void OnAchievementSave(SQLTransaction& trans, Player* player, uint16 achiId, CompletedAchievementData achiData); + void OnCriteriaSave(SQLTransaction& trans, Player* player, uint16 critId, CriteriaProgress criteriaData); // [/AZTH] public: /* GuildScript */