rendered paste bodyIndex: src/game/Player.h
===================================================================
--- src/game/Player.h (working copy)
+++ src/game/Player.h (working copy)
@@ -1131,26 +1131,16 @@
void ModifySkillBonus(uint32 skillid,int32 val);
/*********************************************************/
- /*** HONOR SYSTEM ***/
+ /*** PVP SYSTEM ***/
/*********************************************************/
- void UpdateHonor();
+ void UpdateArenaFields();
+ void UpdateHonorFields();
void CalculateHonor(Unit *pVictim);
- uint32 CalculateHonorRank(float honor) const;
- uint32 GetHonorRank() const;
- int CalculateTotalKills(Player *pVictim) const;
- //Acessors of total honor points
- void SetTotalHonor(float total_honor_points) { m_total_honor_points = total_honor_points; };
- float GetTotalHonor(void) const { return m_total_honor_points; };
- //Acessors of righest rank
- uint32 GetHonorHighestRank() const { return m_highest_rank; }
- void SetHonorHighestRank(uint32 hr) { m_highest_rank = hr; }
- //Acessors of rating
- float GetHonorRating() const { return m_rating; }
- void SetHonorRating(float rating) { m_rating = rating; }
- //Acessors of last week standing
- int32 GetHonorLastWeekStanding() const { return m_standing; }
- void SetHonorLastWeekStanding(int32 standing){ m_standing = standing; }
- //End of Honor System
+ uint32 GetHonorPoints() { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); }
+ uint32 GetArenaPoints() { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); }
+ void SetHonorPoints(uint32 val) { SetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY, val); }
+ void SetArenaPoints(uint32 val) { SetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY, val); }
+ //End of PvP System
void SetDrunkValue(uint16 newDrunkValue);
uint16 GetDrunkValue() const { return m_drunk; }
Index: src/game/Player.cpp
===================================================================
--- src/game/Player.cpp (working copy)
+++ src/game/Player.cpp (working copy)
@@ -4242,247 +4242,58 @@
// TODO: implement reputation spillover
}
-//Update honor fields
-void Player::UpdateHonor(void)
+void Player::UpdateArenaFields(void)
+{
+ /* arena calcs go here */
+}
+
+void Player::UpdateHonorFields()
{
- time_t rawtime;
- struct tm * now;
- uint32 today = 0;
- uint32 date = 0;
+ uint32 today = uint32(time(NULL) / DAY) * DAY;
+ uint32 yesterday = today - DAY;
- uint32 Yesterday = 0;
- uint32 ThisWeekBegin = 0;
- uint32 ThisWeekEnd = 0;
- uint32 LastWeekBegin = 0;
- uint32 LastWeekEnd = 0;
+ QueryResult *result = sDatabase.PQuery("SELECT sum(`honor`) FROM `character_kill` WHERE `guid`='%u' AND `date`<'%u'", GUID_LOPART(GetGUID()), today);
+ if(result && (*result)[0].GetFloat() != 0)
+ {
+ float honor=0.0, honor_yesterday=0.0;
+ uint32 kills_yesterday=0;
- uint32 lifetime_honorableKills = 0;
- uint32 lifetime_dishonorableKills = 0;
- uint32 today_honorableKills = 0;
- uint32 today_dishonorableKills = 0;
-
- uint32 yesterdayKills = 0;
- uint32 thisWeekKills = 0;
- uint32 lastWeekKills = 0;
-
- float total_honor = 0;
- float yesterdayHonor = 0;
- float thisWeekHonor = 0;
- float lastWeekHonor = 0;
-
- time( &rawtime );
- now = localtime( &rawtime );
-
- today = ((uint32)(now->tm_year << 16)|(uint32)(now->tm_yday));
-
- Yesterday = today - 1;
- ThisWeekBegin = today - now->tm_wday;
- ThisWeekEnd = ThisWeekBegin + 7;
- LastWeekBegin = ThisWeekBegin - 7;
- LastWeekEnd = LastWeekBegin + 7;
-
- sLog.outDetail("PLAYER: UpdateHonor");
-
- QueryResult *result = sDatabase.PQuery("SELECT `type`,`honor`,`date` FROM `character_kill` WHERE `guid` = '%u'", GetGUIDLow());
-
- if(result)
- {
- do
+ honor = (*result)[0].GetFloat();
+ delete result;
+ result = sDatabase.PQuery("SELECT sum(`honor`),count(`honor`) FROM `character_kill` WHERE `guid`='%u' AND `date`<'%u' AND `date`>='%u'", GUID_LOPART(GetGUID()), today, yesterday);
+ if(result)
{
- Field *fields = result->Fetch();
- date = fields[2].GetUInt32();
-
- if(fields[0].GetUInt32() == HONORABLE_KILL)
- {
- lifetime_honorableKills++;
- //total_honor += fields[1].GetFloat();
-
- if( date == today)
- {
- today_honorableKills++;
- }
- if( date == Yesterday)
- {
- yesterdayKills++;
- yesterdayHonor += fields[1].GetFloat();
- }
- if( (date >= ThisWeekBegin) && (date < ThisWeekEnd) )
- {
- thisWeekKills++;
- thisWeekHonor += fields[1].GetFloat();
- }
- if( (date >= LastWeekBegin) && (date < LastWeekEnd) )
- {
- lastWeekKills++;
- lastWeekHonor += fields[1].GetFloat();
- }
-
- //All honor points until last week
- if( date < LastWeekEnd )
- {
- total_honor += fields[1].GetFloat();
- }
-
- }
- else if(fields[0].GetUInt32() == DISHONORABLE_KILL)
- {
- lifetime_dishonorableKills++;
- //total_honor -= fields[1].GetFloat();
-
- if( date == today)
- {
- today_dishonorableKills++;
- }
-
- //All honor points until last week
- if( date < LastWeekEnd )
- {
- total_honor -= fields[1].GetFloat();
- }
- }
+ honor_yesterday = (*result)[0].GetFloat();
+ kills_yesterday = (*result)[1].GetUInt32();
+ delete result;
}
- while( result->NextRow() );
- delete result;
- }
+ SetHonorPoints(GetHonorPoints()+uint32(honor));
+ SetUInt32Value(PLAYER_FIELD_HONOR_TODAY, 0);
+ SetUInt32Value(PLAYER_FIELD_HONOR_YESTERDAY, (uint32)(honor_yesterday*10));
+ SetUInt32Value(PLAYER_FIELD_KILLS, (kills_yesterday<<16));
- //Store Total Honor points...
- SetTotalHonor(total_honor);
-
- //RIGHEST RANK
- //If the new rank is highest then the old one, then m_highest_rank is updated
- uint32 new_honor_rank = CalculateHonorRank(total_honor);
- if( new_honor_rank > GetHonorHighestRank() )
- {
- SetHonorHighestRank( new_honor_rank );
+ sDatabase.PQuery("DELETE FROM `character_kill` WHERE `date`<'%u'", today);
}
-
- //RATING
- SetHonorRating( MaNGOS::Honor::CalculeRating(this) );
-
- //STANDING
- SetHonorLastWeekStanding( MaNGOS::Honor::CalculeStanding(this) );
-
- //TODO Fix next rank bar... it is not working fine! For while it be set with the total honor points...
- //NEXT RANK BAR
- //PLAYER_FIELD_HONOR_BAR
- SetUInt32Value(PLAYER_FIELD_BYTES2, (uint32)( (total_honor < 0) ? 0: total_honor) );
-
- //RANK (Patent)
- if( CalculateHonorRank(total_honor) )
- SetUInt32Value(PLAYER_BYTES_3, (( CalculateHonorRank(total_honor) << 24) + 0x04000000) + (m_drunk & 0xFFFE) + getGender());
- else
- SetUInt32Value(PLAYER_BYTES_3, (m_drunk & 0xFFFE) + getGender());
-
- //TODAY
- SetUInt32Value(PLAYER_FIELD_SESSION_KILLS, (today_dishonorableKills << 16) + today_honorableKills );
- //YESTERDAY
- SetUInt32Value(PLAYER_FIELD_YESTERDAY_KILLS, yesterdayKills);
- SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, (uint32)yesterdayHonor);
- //THIS WEEK
- SetUInt32Value(PLAYER_FIELD_THIS_WEEK_KILLS, thisWeekKills);
- SetUInt32Value(PLAYER_FIELD_THIS_WEEK_CONTRIBUTION, (uint32)thisWeekHonor);
- //LAST WEEK
- SetUInt32Value(PLAYER_FIELD_LAST_WEEK_KILLS, lastWeekKills);
- SetUInt32Value(PLAYER_FIELD_LAST_WEEK_CONTRIBUTION, (uint32)lastWeekHonor);
- SetUInt32Value(PLAYER_FIELD_LAST_WEEK_RANK, GetHonorLastWeekStanding());
-
- //LIFE TIME
- SetUInt32Value(PLAYER_FIELD_SESSION_KILLS, (lifetime_dishonorableKills << 16) + lifetime_honorableKills );
- SetUInt32Value(PLAYER_FIELD_LIFETIME_DISHONORABLE_KILLS, lifetime_dishonorableKills);
- SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, lifetime_honorableKills);
- //TODO: Into what field we need to set it? Fix it!
- SetUInt32Value(PLAYER_FIELD_PVP_MEDALS/*???*/, (GetHonorHighestRank() != 0 ? ((GetHonorHighestRank() << 24) + 0x040F0001) : 0) );
}
-uint32 Player::GetHonorRank() const
-{
- return CalculateHonorRank(m_total_honor_points);
-}
-
-//What is Player's rank... private, scout...
-uint32 Player::CalculateHonorRank(float honor_points) const
-{
- uint32 rank = 0;
-
- if(honor_points <= 0.00)
- rank = 0;
- else if(honor_points < 2000.00)
- rank = 1;
- else if(honor_points > ((HONOR_RANK_COUNT-1)-1)*5000)
- rank = HONOR_RANK_COUNT-1;
- else
- rank = uint32(honor_points / 5000) + 1;
-
- return rank;
-}
-
-//How many times Player kill pVictim...
-int Player::CalculateTotalKills(Player *pVictim) const
-{
- int total_kills = 0;
-
- QueryResult *result = sDatabase.PQuery("SELECT count(*) as cnt FROM `character_kill` WHERE `guid` = '%u' AND `creature_template` = '%u'", GetGUIDLow(), pVictim->GetEntry());
-
- if(result)
- {
- Field *fields = result->Fetch();
- total_kills = fields[0].GetUInt32();
- delete result;
- }
- return total_kills;
-}
-
-//How much honor Player gains/loses killing uVictim
+//How much honor Player gains from uVictim
void Player::CalculateHonor(Unit *uVictim)
{
- float parcial_honor_points = 0;
- int kill_type = 0;
- bool savekill = false;
+ if(!uVictim || uVictim->GetTypeId() == TYPEID_UNIT)
+ return;
+ if(uVictim->GetAura(2479, 0))
+ return;
- sLog.outDetail("PLAYER: CalculateHonor");
+ UpdateHonorFields(); // to prevent CalcluateHonor() on a new day before old honor was UpdateHonorFields()
- if( !uVictim ) return;
- if( uVictim->GetAura(2479,0) ) return; // is honorless target
+ float honor = ((float)urand(1,80))/10; // honor between: 0.1 - 8.0
+ float approx_honor = honor * (((float)urand(8,12))/10); // approx honor: 80% - 120% of real honor
+ sDatabase.PExecute("INSERT INTO `character_kill` (`guid`,`creature_template`,`honor`,`date`) VALUES (%u, %u, %f, %u)", GUID_LOPART(GetGUID()), uVictim->GetEntry(), honor, time(0));
- if( uVictim->GetTypeId() == TYPEID_UNIT )
- {
- Creature *cVictim = (Creature *)uVictim;
- if( cVictim->isCivilian() )
- {
- parcial_honor_points = MaNGOS::Honor::DishonorableKillPoints( getLevel() );
- kill_type = DISHONORABLE_KILL;
- savekill = true;
- }
- }
- else
- if( uVictim->GetTypeId() == TYPEID_PLAYER )
- {
- Player *pVictim = (Player *)uVictim;
-
- if( GetTeam() == pVictim->GetTeam() ) return;
-
- if( getLevel() < (pVictim->getLevel()+5) )
- {
- parcial_honor_points = MaNGOS::Honor::HonorableKillPoints( this, pVictim );
- kill_type = HONORABLE_KILL;
- savekill = true;
- }
- }
-
- if (savekill)
- {
- time_t rawtime;
- struct tm * now;
- uint32 today = 0;
- time( &rawtime );
- now = localtime( &rawtime );
- today = ((uint32)(now->tm_year << 16)|(uint32)(now->tm_yday));
-
- sDatabase.PExecute("INSERT INTO `character_kill` (`guid`,`creature_template`,`honor`,`date`,`type`) VALUES (%u, %u, %f, %u, %u)", (uint32)GetGUIDLow(), (uint32)uVictim->GetEntry(), (float)parcial_honor_points, (uint32)today, (uint8)kill_type);
-
- UpdateHonor();
- }
+ ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true); // add 1 today_kill
+ ApplyModUInt32Value(PLAYER_FIELD_KILLS_LIFETIME, 1, true); // add 1 lifetime_kill
+ ApplyModUInt32Value(PLAYER_FIELD_HONOR_TODAY, (uint32)(approx_honor*10), true);
}
uint32 Player::GetGuildIdFromDB(uint64 guid)