From 6acf9c9d66bdc62a65bd7b4043e6d8181df9b206 Mon Sep 17 00:00:00 2001 From: stormrage-project Date: Wed, 2 Sep 2015 20:22:33 +0200 Subject: [PATCH] Honor flush and GetDateToday() method fix --- src/game/Object/ObjectMgr.cpp | 42 +++++++++++++-------- src/game/WorldHandlers/CharacterHandler.cpp | 2 +- src/game/WorldHandlers/World.h | 2 +- src/shared/revision.h | 4 +- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/game/Object/ObjectMgr.cpp b/src/game/Object/ObjectMgr.cpp index 6cf873ed..be589042 100644 --- a/src/game/Object/ObjectMgr.cpp +++ b/src/game/Object/ObjectMgr.cpp @@ -2638,7 +2638,7 @@ void ObjectMgr::LoadStandingList(uint32 dateBegin) Field* fields = NULL; QueryResult* result2 = NULL; // this query create an ordered standing list - QueryResult* result = CharacterDatabase.PQuery("SELECT guid,SUM(honor) as honor_sum FROM character_honor_cp WHERE TYPE = %u AND date BETWEEN %u AND %u GROUP BY guid ORDER BY honor_sum DESC", HONORABLE, dateBegin, dateBegin + 7); + QueryResult* result = CharacterDatabase.PQuery("SELECT guid,SUM(honor) as honor_sum FROM character_honor_cp WHERE TYPE = %u AND date BETWEEN %u AND %u AND used=0 GROUP BY guid ORDER BY honor_sum DESC", HONORABLE, dateBegin, dateBegin + 7); if (result) { BarGoLink bar(result->GetRowCount()); @@ -2651,7 +2651,7 @@ void ObjectMgr::LoadStandingList(uint32 dateBegin) kills = 0; // kills count with victim setted ( not zero value ) - result2 = CharacterDatabase.PQuery("SELECT COUNT(*) FROM character_honor_cp WHERE guid = %u AND victim>0 AND TYPE = %u AND date BETWEEN %u AND %u", guid, HONORABLE, dateBegin, dateBegin + 7); + result2 = CharacterDatabase.PQuery("SELECT COUNT(*) FROM character_honor_cp WHERE guid = %u AND victim>0 AND TYPE = %u AND date BETWEEN %u AND %u AND used=0", guid, HONORABLE, dateBegin, dateBegin + 7); if (result2) { kills = result2->Fetch()->GetUInt32(); } @@ -2695,11 +2695,10 @@ void ObjectMgr::LoadStandingList() sLog.outString(">> Loaded %lu Horde and %lu Ally honor standing definitions", HordeHonorStandingList.size(), AllyHonorStandingList.size()); } - void ObjectMgr::FlushRankPoints(uint32 dateTop) { // FLUSH CP - QueryResult* result = CharacterDatabase.PQuery("SELECT date FROM character_honor_cp WHERE TYPE = %u AND date <= %u GROUP BY date ORDER BY date DESC", HONORABLE, dateTop); + QueryResult* result = CharacterDatabase.PQuery("SELECT date FROM character_honor_cp WHERE TYPE = %u AND date <= %u AND used=0 GROUP BY date ORDER BY date DESC", HONORABLE, dateTop); if (result) { uint32 date; @@ -2721,21 +2720,25 @@ void ObjectMgr::FlushRankPoints(uint32 dateTop) { LoadStandingList(WeekBegin); - flush = WeekBegin < dateTop - 7; // flush only with date < lastweek + flush = WeekBegin <= dateTop - 7; // flush only with date < lastweek DistributeRankPoints(ALLIANCE, WeekBegin, flush); DistributeRankPoints(HORDE, WeekBegin, flush); WeekBegin += 7; } + + delete result; } // FLUSH KILLS - CharacterDatabase.BeginTransaction(); + static SqlStatementID updHonorable; + static SqlStatementID updDishonorable; // process only HK ( victim_type > 0 ) - result = CharacterDatabase.PQuery("SELECT guid,TYPE,COUNT(*) AS kills FROM character_honor_cp WHERE date <= %u AND victim_type>0 GROUP BY guid,type", dateTop - 7); + result = CharacterDatabase.PQuery("SELECT guid,TYPE,COUNT(*) AS kills FROM character_honor_cp WHERE date <= %u AND victim_type>0 AND used=0 GROUP BY guid,type", dateTop - 7); if (result) { + CharacterDatabase.BeginTransaction(); uint32 guid, kills; uint8 type; Field* fields = NULL; @@ -2747,21 +2750,28 @@ void ObjectMgr::FlushRankPoints(uint32 dateTop) kills = fields[2].GetUInt32(); if (type == HONORABLE) - { CharacterDatabase.PExecute("UPDATE characters SET stored_honorable_kills = stored_honorable_kills + %u WHERE guid = %u", kills, guid); } + { + SqlStatement stmt = CharacterDatabase.CreateStatement(updHonorable, "UPDATE characters SET stored_honorable_kills = stored_honorable_kills + %u WHERE guid = %u"); + stmt.PExecute(kills, guid); + } else if (type == DISHONORABLE) - { CharacterDatabase.PExecute("UPDATE characters SET stored_dishonorable_kills = stored_dishonorable_kills + %u WHERE guid = %u", kills, guid); } + { + SqlStatement stmt = CharacterDatabase.CreateStatement(updDishonorable, "UPDATE characters SET stored_dishonorable_kills = stored_dishonorable_kills + %u WHERE guid = %u"); + stmt.PExecute(kills, guid); + } } while (result->NextRow()); - } - // cleanin ALL cp before dateTop - CharacterDatabase.PExecute("DELETE FROM character_honor_cp WHERE date <= %u", dateTop - 7); - CharacterDatabase.CommitTransaction(); + // cleaning ALL cp before dateTop + CharacterDatabase.PExecute("DELETE FROM character_honor_cp WHERE date <= %u", dateTop - 7); + CharacterDatabase.CommitTransaction(); + delete result; + } + else + CharacterDatabase.PExecute("DELETE FROM character_honor_cp WHERE date <= %u AND used=1", dateTop - 7); sLog.outString(); sLog.outString(">> Flushed all ranking points"); - - delete result; } void ObjectMgr::DistributeRankPoints(uint32 team, uint32 dateBegin , bool flush /*false*/) @@ -2795,7 +2805,7 @@ void ObjectMgr::DistributeRankPoints(uint32 team, uint32 dateBegin , bool flush if (flush) { CharacterDatabase.BeginTransaction(); - CharacterDatabase.PExecute("DELETE FROM character_honor_cp WHERE guid = %u AND TYPE = %u AND date BETWEEN %u AND %u", itr->guid, HONORABLE, dateBegin, dateBegin + 7); + CharacterDatabase.PExecute("UPDATE character_honor_cp SET used=1 WHERE guid = %u AND TYPE = %u AND date BETWEEN %u AND %u", itr->guid, HONORABLE, dateBegin, dateBegin + 7); CharacterDatabase.PExecute("UPDATE characters SET stored_honor_rating = %f , stored_honorable_kills = %u WHERE guid = %u", finiteAlways(RP + itr->rpEarning), HK + itr->honorKills, itr->guid); CharacterDatabase.CommitTransaction(); } diff --git a/src/game/WorldHandlers/CharacterHandler.cpp b/src/game/WorldHandlers/CharacterHandler.cpp index 5bb2190b..b4c32895 100644 --- a/src/game/WorldHandlers/CharacterHandler.cpp +++ b/src/game/WorldHandlers/CharacterHandler.cpp @@ -110,7 +110,7 @@ bool LoginQueryHolder::Initialize() res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADAURAS, "SELECT caster_guid,item_guid,spell,stackcount,remaincharges,basepoints0,basepoints1,basepoints2,periodictime0,periodictime1,periodictime2,maxduration,remaintime,effIndexMask FROM character_aura WHERE guid = '%u'", m_guid.GetCounter()); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADSPELLS, "SELECT spell,active,disabled FROM character_spell WHERE guid = '%u'", m_guid.GetCounter()); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADQUESTSTATUS, "SELECT quest,status,rewarded,explored,timer,mobcount1,mobcount2,mobcount3,mobcount4,itemcount1,itemcount2,itemcount3,itemcount4 FROM character_queststatus WHERE guid = '%u'", m_guid.GetCounter()); - res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADHONORCP, "SELECT victim_type,victim,honor,date,type FROM character_honor_cp WHERE guid = '%u'", m_guid.GetCounter()); + res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADHONORCP, "SELECT victim_type,victim,honor,date,type FROM character_honor_cp WHERE used=0 AND guid = '%u'", m_guid.GetCounter()); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADREPUTATION, "SELECT faction,standing,flags FROM character_reputation WHERE guid = '%u'", m_guid.GetCounter()); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADINVENTORY, "SELECT data,bag,slot,item,item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '%u' ORDER BY bag,slot", m_guid.GetCounter()); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADITEMLOOT, "SELECT guid,itemid,amount,property FROM item_loot WHERE owner_guid = '%u'", m_guid.GetCounter()); diff --git a/src/game/WorldHandlers/World.h b/src/game/WorldHandlers/World.h index 47be27f3..a9257ae7 100644 --- a/src/game/WorldHandlers/World.h +++ b/src/game/WorldHandlers/World.h @@ -500,7 +500,7 @@ class World uint32 GetUptime() const { return uint32(m_gameTime - m_startTime); } tm* GetLocalTimeByTime(time_t now) const { return localtime(&now); } - uint32 GetDateByLocalTime(tm* now) const { return ((uint32)(now->tm_year << 16) | (uint32)(now->tm_yday)); } + uint32 GetDateByLocalTime(tm* now) const { return uint32(now->tm_year*365 + (now->tm_year-1)/4 + now->tm_yday); } uint32 GetDateToday() const { return GetDateByLocalTime(GetLocalTimeByTime(m_gameTime)); } uint32 GetDateThisWeekBegin() const { return GetDateToday() - GetLocalTimeByTime(m_gameTime)->tm_wday; } uint32 GetDateLastMaintenanceDay() const diff --git a/src/shared/revision.h b/src/shared/revision.h index 82be9b83..05b5ded5 100644 --- a/src/shared/revision.h +++ b/src/shared/revision.h @@ -32,9 +32,9 @@ #define REALMD_DB_UPDATE_DESCRIPTION "revision_refactor" #define CHAR_DB_VERSION_NR 21 - #define CHAR_DB_STRUCTURE_NR 1 + #define CHAR_DB_STRUCTURE_NR 2 #define CHAR_DB_CONTENT_NR 0 - #define CHAR_DB_UPDATE_DESCRIPTION "revision_refactor" + #define CHAR_DB_UPDATE_DESCRIPTION "honor_counting" #define WORLD_DB_VERSION_NR 21 #define WORLD_DB_STRUCTURE_NR 1