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 */