Added difficulty to death stats

This commit is contained in:
2024-11-22 19:12:08 -05:00
parent f3230a6559
commit baf0d8e6e7
5 changed files with 55 additions and 15 deletions

View File

@@ -27,11 +27,10 @@ DROP TABLE IF EXISTS mp_player_death_stats;
CREATE TABLE mp_player_death_stats(
guid INT UNSIGNED NOT NULL DEFAULT '0',
creatureEntry INT UNSIGNED NOT NULL,
difficulty TINYINT UNSIGNED NOT NULL DEFAULT '0'
numDeaths INT UNSIGNED NOT NULL DEFAULT '0',
lastUpdated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (guid),
INDEX idx_creature (creatureEntry)
PRIMARY KEY (guid, creatureEntry, difficulty)
);
--- Used for tracking player runs in mythic dungeons

View File

@@ -116,11 +116,13 @@ public:
if (!sMythicPlus->IsMapEligible(map)) {
return;
}
// Removes currenct GroupData Instance Data and removes from database storage
sMpDataStore->RemoveInstanceData(map->GetId(), map->GetInstanceId());
// If there is player data for this map reset it to default values
// remove group instance and group instance data from database during a reset
sMpDataStore->DBRemovePlayerInstanceData(map->GetInstanceId());
sMpDataStore->DBRemoveGroupInstanceData(map->GetInstanceId());
}
};

View File

@@ -339,7 +339,6 @@ void MpDataStore::DBAddPlayerDeath(Player* player) {
MpLogger::error("DBAddPlayerDeath called with invalid player");
return;
}
CharacterDatabase.Execute("UPDATE mp_player_instance_data SET deaths = deaths + 1 WHERE guid = {} and mapId = {} and instanceId = {}",
player->GetGUID().GetCounter(),
player->GetMapId(),
@@ -348,7 +347,7 @@ void MpDataStore::DBAddPlayerDeath(Player* player) {
}
// Logs death for player that occurs by a creature directly.
void MpDataStore::DBAddPlayerDeath(Player* player, Creature* creature) {
void MpDataStore::DBAddPlayerDeath(Player* player, Creature* creature, MpDifficulty difficulty) {
if (!player) {
MpLogger::error("DBAddPlayerDeath called with invalid player");
return;
@@ -360,13 +359,14 @@ void MpDataStore::DBAddPlayerDeath(Player* player, Creature* creature) {
player->GetInstanceId()
);
CharacterDatabase.Execute("REPLACE INTO mp_player_death_stats (guid, mapId, instanceId, creatureId) VALUES ({},{},{},{}) ",
CharacterDatabase.Execute(
"INSERT INTO mp_player_death_stats (guid, creatureEntry, difficulty, numDeaths, lastUpdated) "
"VALUES ({}, {}, {}, 1, CURRENT_TIMESTAMP) "
"ON DUPLICATE KEY UPDATE numDeaths = numDeaths + 1, lastUpdated = CURRENT_TIMESTAMP",
player->GetGUID().GetCounter(),
player->GetMapId(),
player->GetInstanceId(),
creature->GetEntry()
creature->GetEntry(),
difficulty
);
}
void MpDataStore::DBUpdateGroupData(ObjectGuid groupGuid, MpDifficulty difficulty, uint32 mapId, uint32 instanceId, uint32 deaths) {
@@ -399,7 +399,7 @@ void MpDataStore::DBAddGroupDeath(Group* group, uint32 mapId, uint32 instanceId,
return;
}
CharacterDatabase.Execute("UPDATE mp_group_data SET deaths = deaths + 1 WHERE guid = {} and mapId = {} and instanceId = {} and difficulty = {}",
CharacterDatabase.Execute("UPDATE mp_group_data SET deaths = deaths + 1 WHERE groupId = {} and mapId = {} and instanceId = {} and difficulty = {}",
group->GetGUID().GetCounter(),
mapId,
instanceId,
@@ -416,6 +416,15 @@ void MpDataStore::DBRemovePlayerData(ObjectGuid playerGuid) {
CharacterDatabase.Execute("DELETE FROM mp_player_instance_data WHERE guid = {} ", playerGuid.GetCounter());
}
void MpDataStore::DBRemovePlayerInstanceData(uint32 instanceId) {
if (!instanceId) {
MpLogger::error("DBRemovePlayerInstanceData: missing instanceId to remove player instance ");
return;
}
CharacterDatabase.Execute("DELETE FROM mp_player_instance_data WHERE guid = {} ", instanceId);
}
void MpDataStore::DBUpdateGroupTimerDeaths(ObjectGuid groupGuid, uint32 mapId, uint32 instanceId, uint32 timer, uint32 deaths) {
if (!groupGuid) {
@@ -440,3 +449,14 @@ void MpDataStore::DBRemoveGroupData(ObjectGuid groupGuid) {
CharacterDatabase.Execute("DELETE FROM mp_group_data WHERE guid = {} ", groupGuid.GetCounter());
}
// Remove instance data using the instanceId
void MpDataStore::DBRemoveGroupInstanceData(uint32 instanceId) {
if (!instanceId) {
MpLogger::error("DBRemoveGroupData called with invalid groupGuid");
return;
}
CharacterDatabase.Execute("DELETE FROM mp_group_data WHERE instanceId = {} ", instanceId);
}

View File

@@ -385,14 +385,17 @@ public:
void DBUpdatePlayerInstanceData(ObjectGuid playerGuid, MpDifficulty difficulty, uint32 mapId = 0, uint32 instanceId = 0, uint32 deaths = 0);
void DBResetPlayerDeaths(Player* player);
void DBAddPlayerDeath(Player* player, Creature* killer);
void DBAddPlayerDeath(Player* player, Creature* killer, MpDifficulty difficulty);
void DBAddPlayerDeath(Player* player);
void DBRemovePlayerData(ObjectGuid playerGuid);
void DBRemovePlayerInstanceData(uint32 instanceId);
void DBRemoveGroupInstanceData(uint32 instanceId);
void DBUpdateGroupData(ObjectGuid groupGuid, MpDifficulty difficulty, uint32 mapId, uint32 instanceId, uint32 deaths);
void DBUpdateGroupTimerDeaths(ObjectGuid groupGuid, uint32 mapId, uint32 instanceId, uint32 timer, uint32 deaths);
void DBRemoveGroupData(ObjectGuid groupGuid);
void DBAddGroupDeath(Group* group, uint32 mapId, uint32 instanceId, MpDifficulty difficulty);
//SavePlayerDungeonStats(Group* group, MpGroupData const* groupData);
static MpDataStore* instance() {

View File

@@ -23,17 +23,33 @@ public:
return;
}
Group* group = player->GetGroup();
if(!group) {
MpLogger::warn("Missing group data for player {}", player->GetName());
return;
}
MpGroupData *data = sMpDataStore->GetGroupData(player->GetGroup());
if (!data) {
MpLogger::warn("Missin group data for player {}", player->GetName());
return;
}
MpPlayerData *playerData = sMpDataStore->GetPlayerData(player->GetGUID());
if (!playerData) {
MpLogger::warn("Missin player data for player {}", player->GetName());
return;
}
playerData->AddDeath(map->GetId(), map->GetInstanceId());
if(killer) {
sMpDataStore->DBAddPlayerDeath(player, killer, data->difficulty);
} else {
sMpDataStore->DBAddPlayerDeath(player);
}
sMpDataStore->DBAddGroupDeath(group, player->GetMapId(), player->GetInstanceId(), data->difficulty);
}
void OnSave(Player* player) {