PaDaS
Camatar de Trib
 Din: Bucuresti / Berceni
Inregistrat: acum 19 ani
Postari: 1501
|
|
asta e patchul nou de honor , e 3262 , acum pe server e ultima rev 3262.
Index: src/game/Formulas.h =================================================================== --- src/game/Formulas.h (revision 3262) +++ src/game/Formulas.h (working copy) @@ -72,19 +72,42 @@ // then when player save, save it!!! inline float HonorableKillPoints( Player *killer, Player *victim ) { - int total_kills = killer->CalculateTotalKills(victim); - //int k_rank = killer->CalculateHonorRank( killer->GetTotalHonor() ); - uint32 v_rank = victim->CalculateHonorRank( victim->GetTotalHonor() ); - uint32 k_level = killer->getLevel(); - //int v_level = victim->getLevel(); - float diff_honor = (victim->GetTotalHonor() /(killer->GetTotalHonor()+1))+1; - float diff_level = (victim->getLevel()*(1.0/( killer->getLevel() ))); + //New formulas by Zhivoi (Greetings from Russia) + int total_kills = killer->CalculateTotalKills(victim); + float f; + if(total_kills < 10) f = (10 - (float)total_kills)*0.1; + else f = 0.0; + + uint32 k_grey = 0; + uint32 k_level = killer->getLevel(); + uint32 v_level = victim->getLevel(); + + if(k_level <= 5) + k_grey = 0; + else if( k_level <= 39 ) + k_grey = k_level - 5 - k_level/10; + else + k_grey = k_level - 1 - k_level/5; + + float diff_level; + if((k_level - k_grey) != 0) + diff_level = ((float)(v_level - k_grey)) / ((float)(k_level - k_grey)); + else return 999; //Check, in character_kill we will see, if working incorrectly + + if(diff_level > 2.0) diff_level = 2.0; + if(diff_level <= 0.0) return 888; //For Debug + + int32 v_rank = (victim->GetHonorRank() - 4); //We cut all up to the first positive rank + if(v_rank < 0) v_rank = 0; + if(v_rank < 0) return 777;
- int f = (4 - total_kills) >= 0 ? (4 - total_kills) : 0; - int honor_points = int(((float)(f * 0.25)*(float)((k_level+(v_rank*5+1))*(1+0.05*diff_honor)*diff_level))); - return (honor_points <= 400 ? honor_points : 400); + float honor_points = f * diff_level * (190 + v_rank*10); + //float honor_points = f * diff_level * (190); + honor_points *= ((float)k_level) / 60.0; //factor of dependence on levels of the killer + + if(honor_points > 660) return 666; //For Debug + else return honor_points; } - }
namespace Combat Index: src/game/Level0.cpp =================================================================== --- src/game/Level0.cpp (revision 3262) +++ src/game/Level0.cpp (working copy) @@ -229,7 +229,7 @@ { uint32 dishonorable_kills = m_session->GetPlayer()->GetUInt32Value(PLAYER_FIELD_LIFETIME_DISHONORABLE_KILLS); uint32 honorable_kills = m_session->GetPlayer()->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS); - uint32 highest_rank = (m_session->GetPlayer()->GetHonorHighestRank() < 16)? m_session->GetPlayer()->GetHonorHighestRank() : 0; + uint32 highest_rank = (m_session->GetPlayer()->GetHonorHighestRank() > 4) ? m_session->GetPlayer()->GetHonorHighestRank() - 4 : 0; uint32 today_honorable_kills = (uint16)m_session->GetPlayer()->GetUInt32Value(PLAYER_FIELD_SESSION_KILLS); uint32 today_dishonorable_kills = (uint16)(m_session->GetPlayer()->GetUInt32Value(PLAYER_FIELD_SESSION_KILLS)>>16); uint32 yesterday_kills = m_session->GetPlayer()->GetUInt32Value(PLAYER_FIELD_YESTERDAY_KILLS); @@ -283,13 +283,17 @@
if ( m_session->GetPlayer()->GetTeam() == ALLIANCE ) { - rank_name = alliance_ranks[ m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() ) ]; + if (m_session->GetPlayer()->CalculateHonorRank(m_session->GetPlayer()->GetTotalHonor()) > 4) + rank_name = alliance_ranks[ m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() ) - 4 ]; + else rank_name = alliance_ranks[0]; hrank_name = alliance_ranks[ highest_rank ]; } else if ( m_session->GetPlayer()->GetTeam() == HORDE ) { - rank_name = horde_ranks[ m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() ) ]; + if (m_session->GetPlayer()->CalculateHonorRank(m_session->GetPlayer()->GetTotalHonor()) > 4) + rank_name = horde_ranks[ m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() ) - 4 ]; + else rank_name = horde_ranks[0]; hrank_name = horde_ranks[ highest_rank ]; } else @@ -297,7 +301,8 @@ rank_name = LANG_NO_RANK; }
- PSendSysMessage(LANG_RANK, rank_name.c_str(), m_session->GetPlayer()->GetName(), m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() )); + PSendSysMessage(LANG_RANK, rank_name.c_str(), m_session->GetPlayer()->GetName(), + (m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() ) > 4)?m_session->GetPlayer()->CalculateHonorRank( m_session->GetPlayer()->GetTotalHonor() ) - 4 : 0); PSendSysMessage(LANG_HONOR_TODAY, today_honorable_kills, today_dishonorable_kills); PSendSysMessage(LANG_HONOR_YESTERDAY, yesterday_kills, yesterday_honor); PSendSysMessage(LANG_HONOR_THIS_WEEK, this_week_kills, this_week_honor); Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 3262) +++ src/game/Player.cpp (working copy) @@ -4151,18 +4151,21 @@ uint32 thisWeekKills = 0; uint32 lastWeekKills = 0;
- float total_honor = 0; - float yesterdayHonor = 0; - float thisWeekHonor = 0; - float lastWeekHonor = 0; + float total_honor = 0.0; + float yesterdayHonor = 0.0; + float thisWeekHonor = 0.0; + float lastWeekHonor = 0.0; + float total_last_weekend_honor = 0.0; //Total honor (until last weekend)
+ time( &rawtime ); now = localtime( &rawtime );
today = ((uint32)(now->tm_year << 16)|(uint32)(now->tm_yday));
Yesterday = today - 1; - ThisWeekBegin = today - now->tm_wday; + ThisWeekBegin = today - (now->tm_wday - 3); + if(ThisWeekBegin > today) ThisWeekBegin -= 7; ThisWeekEnd = ThisWeekBegin + 7; LastWeekBegin = ThisWeekBegin - 7; LastWeekEnd = LastWeekBegin + 7; @@ -4181,7 +4184,7 @@ if(fields[0].GetUInt32() == HONORABLE_KILL) { lifetime_honorableKills++; - //total_honor += fields[1].GetFloat(); + total_honor += fields[1].GetFloat();
if( date == today) { @@ -4206,14 +4209,17 @@ //All honor points until last week if( date < LastWeekEnd ) { - total_honor += fields[1].GetFloat(); + total_last_weekend_honor += fields[1].GetFloat(); }
} else if(fields[0].GetUInt32() == DISHONORABLE_KILL) { lifetime_dishonorableKills++; - //total_honor -= fields[1].GetFloat(); + total_honor -= fields[1].GetFloat(); + + if(total_honor < -2500.0) total_honor = -2500.0; + if(total_honor > 64999.0) total_honor = 64999.0;
if( date == today) { @@ -4223,7 +4229,8 @@ //All honor points until last week if( date < LastWeekEnd ) { - total_honor -= fields[1].GetFloat(); + total_last_weekend_honor -= fields[1].GetFloat(); + if(total_last_weekend_honor < -2500.0) total_last_weekend_honor = -2500.0; } } } @@ -4232,14 +4239,15 @@ delete result; }
- //Store Total Honor points... + //Store Total Honor points... SetTotalHonor(total_honor); + SetWeekEndHonor(total_last_weekend_honor);
//RIGHEST RANK //If the new rank is highest then the old one, then m_highest_rank is updated - if( CalculateHonorRank(total_honor) > GetHonorHighestRank() ) + if( CalculateHonorRank(total_last_weekend_honor) > GetHonorHighestRank() ) { - SetHonorHighestRank( CalculateHonorRank(total_honor) ); + SetHonorHighestRank( CalculateHonorRank(total_last_weekend_honor) ); }
//RATING @@ -4248,16 +4256,28 @@ //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) ); +// 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()); + if( total_honor <= 0.00 ) + { + SetUInt32Value(PLAYER_FIELD_BYTES2, 0 ); + } + else + { + float honor_bar; + if( total_honor <= 2000 ) + honor_bar = total_honor * 0.1275; + else if( total_honor <= 5000 ) + honor_bar = (total_honor-2000) * 0.085; + else + honor_bar = ( (uint32)total_honor % 5000) * 0.051; + + SetUInt32Value(PLAYER_FIELD_BYTES2, (uint32)honor_bar ); + } + //RANK + SetUInt32Value(PLAYER_BYTES_3, (CalculateHonorRank(total_last_weekend_honor) << 24) + (m_drunk & 0xFFFE) + getGender());
//TODAY SetUInt32Value(PLAYER_FIELD_SESSION_KILLS, (today_dishonorableKills << 16) + today_honorableKills ); @@ -4273,7 +4293,6 @@ 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! @@ -4282,19 +4301,21 @@
uint32 Player::GetHonorRank() const { - return CalculateHonorRank(m_total_honor_points); + return CalculateHonorRank(m_honor_points_lastweek); }
-//What is Player's rank... private, scout... +//What is Player's rank uint32 Player::CalculateHonorRank(float honor_points) const { - int rank = 0; - - if(honor_points <= 0.00) rank = 0; else - if(honor_points < 2000.00) rank = 1; + uint32 rank = 0; + if (honor_points <= -2000.0) rank = 1; // Pariah (-4) + else if (honor_points <= -1000.0) rank = 2; // Outlaw (-3) + else if (honor_points <= -500.0) rank = 3; // Exiled (-2) + else if (honor_points < 0.0) rank = 4; // Dishonored (-1) + else if (honor_points == 0.0) rank = 0; // No rank (0) + else if (honor_points <= 2000.0) rank = 5; // First rank else - rank = ( (int)(honor_points / 5000) + 1); - + rank = ((int)(honor_points / 5000) + 6); return rank; }
@@ -4302,9 +4323,16 @@ 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()); - + + //Change GetEntry to GetGUIDLow for Victim & Added Today kills (from wowwiki) + time_t rawtime; + struct tm * now; + uint32 today = 0; + time( &rawtime ); + now = localtime( &rawtime ); + today = ((uint32)(now->tm_year << 16)|(uint32)(now->tm_yday)); + //QueryResult *result = sDatabase.PQuery("SELECT `honor` FROM `character_kill` WHERE `guid` = '%u' AND `creature_template` = '%u' AND `date` = '%u'", GetGUIDLow(), pVictim->GetGUIDLow(), (uint32)today); + QueryResult *result = sDatabase.PQuery("SELECT count(*) as cnt FROM `character_kill` WHERE `guid` = '%u' AND `creature_template` = '%u' AND `date` = '%u'", GetGUIDLow(), pVictim->GetGUIDLow(), (uint32)today); if(result) { Field *fields = result->Fetch(); @@ -4315,7 +4343,7 @@ }
//How much honor Player gains/loses killing uVictim -void Player::CalculateHonor(Unit *uVictim) +void Player::CalculateHonor(Unit *uVictim, float honor_mn) { float parcial_honor_points = 0; int kill_type = 0; @@ -4333,6 +4361,15 @@ { parcial_honor_points = MaNGOS::Honor: ishonorableKillPoints( getLevel() ); kill_type = DISHONORABLE_KILL; +///*******************************************ADDED For "Flying away DK" + WorldPacket data; + data.Initialize(SMSG_PVP_CREDIT); + data << (uint32) 0; // honor points + data << (uint64) cVictim->GetGUID(); // guid civilian victim + //uint32 v_rank = cVictim->GetHonorRank(); + //data << (uint32) (v_rank); + this->GetSession()->SendPacket(&data); +///*******************************************END savekill = true; } } @@ -4342,15 +4379,34 @@ Player *pVictim = (Player *)uVictim;
if( GetTeam() == pVictim->GetTeam() ) return; - - if( getLevel() < (pVictim->getLevel()+5) ) + //Gray Level + int32 pl_grey = 0; + int32 pl_level = getLevel(); + if( pl_level <= 5 ) + pl_grey = 0; + else if( pl_level <= 39 ) + pl_grey = pl_level - 5 - pl_level/10; + else + pl_grey = pl_level - 1 - pl_level/5; + if( pVictim->getLevel() > pl_grey ) { parcial_honor_points = MaNGOS::Honor::HonorableKillPoints( this, pVictim ); + parcial_honor_points *= honor_mn; kill_type = HONORABLE_KILL; +///*******************************************ADDED For "Flying away rank" + WorldPacket data; + data.Initialize(SMSG_PVP_CREDIT); + data << (uint32) parcial_honor_points; // honor points + // If guid=0, in combatlog: You have been awarded %u honor points. + // If guid != 0, in combatlog - player_name dies, honorable kill Rank: rank_name (Estimated Honor Points: %u) + data << (uint64) pVictim->GetGUID(); // guid victim + uint32 v_rank = pVictim->GetHonorRank(); + data << (uint32) (v_rank); + this->GetSession()->SendPacket(&data); +///*******************************************END savekill = true; } } - if (savekill) { time_t rawtime; @@ -4360,8 +4416,8 @@ 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); - + // Change GetEntry to GetGUIDLow for Victim + sDatabase.PExecute("INSERT INTO `character_kill` (`guid`,`creature_template`,`honor`,`date`,`type`) VALUES (%u, %u, %f, %u, %u)", (uint32)GetGUIDLow(), (uint32)uVictim->GetGUIDLow(), (float)parcial_honor_points, (uint32)today, (uint8)kill_type); UpdateHonor(); } } @@ -7093,7 +7149,7 @@ } if( pProto->RequiredSpell != 0 && !HasSpell( pProto->RequiredSpell ) ) return false; - if( GetHonorRank() < pProto->RequiredHonorRank ) + if( GetHonorHighestRank() < pProto->RequiredHonorRank ) //Change to Highest Rank ( Old GetHonorRank() ) return false; if( getLevel() < pProto->RequiredLevel ) return false; @@ -7125,7 +7181,7 @@ } if( pProto->RequiredSpell != 0 && !HasSpell( pProto->RequiredSpell ) ) return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; - if( GetHonorRank() < pProto->RequiredHonorRank ) + if( GetHonorHighestRank() < pProto->RequiredHonorRank ) //Change to Highest Rank ( Old GetHonorRank() ) return EQUIP_ITEM_RANK_NOT_ENOUGH; /*if( GetReputation() < pProto->RequiredReputation ) return EQUIP_ITEM_REPUTATION_NOT_ENOUGH; Index: src/game/Player.h =================================================================== --- src/game/Player.h (revision 3262) +++ src/game/Player.h (working copy) @@ -1048,13 +1048,17 @@ /*** HONOR SYSTEM ***/ /*********************************************************/ void UpdateHonor(); - void CalculateHonor(Unit *pVictim); +// void CalculateHonor(Unit *pVictim); //Changed for GroupHonor + void CalculateHonor(Unit *pVictim, float); //Changed for GroupHonor 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; }; + void SetWeekEndHonor(float total_week_honor_points) { m_honor_points_lastweek = total_week_honor_points; }; + float GetWeekEndHonor(void) const { return m_honor_points_lastweek; }; + //Acessors of righest rank uint32 GetHonorHighestRank() const { return m_highest_rank; } void SetHonorHighestRank(uint32 hr) { m_highest_rank = hr; } @@ -1308,6 +1312,9 @@ std::deque<uint32> m_TaxiDestinations;
float m_total_honor_points; + //Added by Zhivoi + float m_honor_points_lastweek; //For calculate rang + float m_rating; uint32 m_highest_rank; int32 m_standing; Index: src/game/Unit.cpp =================================================================== --- src/game/Unit.cpp (revision 3262) +++ src/game/Unit.cpp (working copy) @@ -421,13 +421,13 @@ if(player) { float honordiff = player->GetTotalHonor(); - player->CalculateHonor(pVictim); honordiff -= player->GetTotalHonor();
player->CalculateReputation(pVictim);
if(!PvP) { + player->CalculateHonor(pVictim,1.0); //Civilian DEBUG_LOG("DealDamageIsPvE" ; uint32 xp = MaNGOS::XP::Gain(player, pVictim);
@@ -467,6 +467,64 @@ if(xp || honordiff < 0) ProcDamageAndSpell(pVictim,PROC_FLAG_KILL_XP_GIVER,PROC_FLAG_NONE); } + ///// HONOR PARTY + else + { + Group *pGroup = player->groupInfo.group; + if(pGroup) + { + uint32 party_level = 0; //party level + uint32 party_grey = 0; //party grey level + int32 party_membcount = pGroup->GetMembersCount(); //Members + + for (uint32 i = 0; i < pGroup->GetMembersCount(); i++) + { + Player *pGroupGuy = objmgr.GetPlayer(pGroup->GetMemberGUID(i)); + if( (!pGroupGuy) || //Player + (pVictim->GetDistanceSq(pGroupGuy) > sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE)) || //Distance + (!pGroupGuy->isAlive()) ) //Died + { + party_membcount-=1; + continue; + } + //We take only alive players, which beside + if(i+1) //check  + party_level uint32)((float)((party_level*i)+pGroupGuy->getLevel()))/((float)(i+1)); + else pGroupGuy->CalculateHonor(pVictim,10.0); //FOR DEBUG + } + + if( party_level <= 10 ) + party_grey = 0; + else party_grey = party_level * 0.9; + + for (uint32 i = 0; i < pGroup->GetMembersCount(); i++) + { + Player *pGroupGuy = objmgr.GetPlayer(pGroup->GetMemberGUID(i)); + if(!pGroupGuy) //No Player + { + continue; + } + if(pVictim->GetDistanceSq(pGroupGuy) > sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE)) //Distance too greater + { + continue; + } + if(!pGroupGuy->isAlive()) //Player has died + { + continue; + } + //if all cheks passed - give honor for this player + if(pGroupGuy->getLevel() > party_grey) + { + if(party_membcount<1) party_membcount=1; + pGroupGuy->CalculateHonor(pVictim,(float)(1.0/((float)party_membcount))); + } + } + } + else //No Group + { + player->CalculateHonor(pVictim,1.0); + } + } } else {
_______________________________________ Hub Reteaua Nebuna : reneb.no-ip.org Camatar de trib - TBC in curand pe MilenniuM.ro BOTD - All I leave behind is the breath of the dying! WoW addiction is a weapon of mass destruction
|
|