[12056] Fix a bug of [11825] that causes wrong offhand attack times for players.

Thx to fr1nge for reporting the bug.
Problem spotting and patch by vovk
Additional cleanup by fr1nge

Signed-off-by: Schmoozerd <schmoozerd@scriptdev2.com>
This commit is contained in:
Velvet 2012-07-18 14:56:42 +02:00 committed by Schmoozerd
parent 1c7e46a4a8
commit 4e117d1ee8
2 changed files with 41 additions and 48 deletions

View file

@ -1160,16 +1160,16 @@ void Player::SetDrunkValue(uint16 newDrunkenValue, uint32 itemId)
SendMessageToSet(&data, true);
}
void Player::Update( uint32 update_diff, uint32 p_time )
void Player::Update(uint32 update_diff, uint32 p_time)
{
if(!IsInWorld())
if (!IsInWorld())
return;
// remove failed timed Achievements
// Remove failed timed Achievements
GetAchievementMgr().DoFailedTimedAchievementCriterias();
// undelivered mail
if(m_nextMailDelivereTime && m_nextMailDelivereTime <= time(NULL))
// Undelivered mail
if (m_nextMailDelivereTime && m_nextMailDelivereTime <= time(NULL))
{
SendNewMail();
++unReadMails;
@ -1178,23 +1178,16 @@ void Player::Update( uint32 update_diff, uint32 p_time )
m_nextMailDelivereTime = 0;
}
//used to implement delayed far teleports
// Used to implement delayed far teleports
SetCanDelayTeleport(true);
Unit::Update( update_diff, p_time );
Unit::Update(update_diff, p_time);
SetCanDelayTeleport(false);
// update player only attacks
if(uint32 ranged_att = getAttackTimer(RANGED_ATTACK))
{
setAttackTimer(RANGED_ATTACK, (update_diff >= ranged_att ? 0 : ranged_att - update_diff) );
}
// Update player only attacks
if (uint32 ranged_att = getAttackTimer(RANGED_ATTACK))
setAttackTimer(RANGED_ATTACK, (update_diff >= ranged_att ? 0 : ranged_att - update_diff));
if(uint32 off_att = getAttackTimer(OFF_ATTACK))
{
setAttackTimer(OFF_ATTACK, (update_diff >= off_att ? 0 : off_att - update_diff) );
}
time_t now = time (NULL);
time_t now = time(NULL);
UpdatePvPFlag(now);
@ -1207,8 +1200,8 @@ void Player::Update( uint32 update_diff, uint32 p_time )
UpdateAfkReport(now);
// Update items that have just a limited lifetime
if (now>m_Last_tick)
UpdateItemDuration(uint32(now- m_Last_tick));
if (now > m_Last_tick)
UpdateItemDuration(uint32(now - m_Last_tick));
if (!m_timedquests.empty())
{
@ -1216,10 +1209,10 @@ void Player::Update( uint32 update_diff, uint32 p_time )
while (iter != m_timedquests.end())
{
QuestStatusData& q_status = mQuestStatus[*iter];
if( q_status.m_timer <= update_diff )
if (q_status.m_timer <= update_diff)
{
uint32 quest_id = *iter;
++iter; // current iter will be removed in FailQuest
++iter; // Current iter will be removed in FailQuest
FailQuest(quest_id);
}
else
@ -1235,10 +1228,10 @@ void Player::Update( uint32 update_diff, uint32 p_time )
{
UpdateMeleeAttackingState();
Unit *pVictim = getVictim();
Unit* pVictim = getVictim();
if (pVictim && !IsNonMeleeSpellCasted(false))
{
Player *vOwner = pVictim->GetCharmerOrOwnerPlayerOrPlayerItself();
Player* vOwner = pVictim->GetCharmerOrOwnerPlayerOrPlayerItself();
if (vOwner && vOwner->IsPvP() && !IsInDuelWith(vOwner))
{
UpdatePvP(true);
@ -1249,14 +1242,14 @@ void Player::Update( uint32 update_diff, uint32 p_time )
if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING))
{
if (roll_chance_i(3) && GetTimeInnEnter() > 0) //freeze update
if (roll_chance_i(3) && GetTimeInnEnter() > 0) // Freeze update
{
time_t time_inn = time(NULL)-GetTimeInnEnter();
if (time_inn >= 10) //freeze update
time_t time_inn = time(NULL) - GetTimeInnEnter();
if (time_inn >= 10) // Freeze update
{
float bubble = 0.125f*sWorld.getConfig(CONFIG_FLOAT_RATE_REST_INGAME);
//speed collect rest bonus (section/in hour)
SetRestBonus( float(GetRestBonus()+ time_inn*(GetUInt32Value(PLAYER_NEXT_LEVEL_XP)/72000)*bubble ));
float bubble = 0.125f * sWorld.getConfig(CONFIG_FLOAT_RATE_REST_INGAME);
// Speed collect rest bonus (section/in hour)
SetRestBonus(float(GetRestBonus() + time_inn * (GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000) * bubble));
UpdateInnerTime(time(NULL));
}
}
@ -1264,7 +1257,7 @@ void Player::Update( uint32 update_diff, uint32 p_time )
if (m_regenTimer)
{
if(update_diff >= m_regenTimer)
if (update_diff >= m_regenTimer)
m_regenTimer = 0;
else
m_regenTimer -= update_diff;
@ -1280,18 +1273,18 @@ void Player::Update( uint32 update_diff, uint32 p_time )
if (m_zoneUpdateTimer > 0)
{
if(update_diff >= m_zoneUpdateTimer)
if (update_diff >= m_zoneUpdateTimer)
{
uint32 newzone, newarea;
GetZoneAndAreaId(newzone,newarea);
GetZoneAndAreaId(newzone, newarea);
if( m_zoneUpdateId != newzone )
UpdateZone(newzone,newarea); // also update area
if (m_zoneUpdateId != newzone)
UpdateZone(newzone, newarea); // Also update area
else
{
// use area updates as well
// needed for free far all arenas for example
if( m_areaUpdateId != newarea )
// Use area updates as well
// Needed for free for all arenas for example
if (m_areaUpdateId != newarea)
UpdateArea(newarea);
m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL;
@ -1303,7 +1296,7 @@ void Player::Update( uint32 update_diff, uint32 p_time )
if (m_timeSyncTimer > 0)
{
if(update_diff >= m_timeSyncTimer)
if (update_diff >= m_timeSyncTimer)
SendTimeSync();
else
m_timeSyncTimer -= update_diff;
@ -1322,9 +1315,9 @@ void Player::Update( uint32 update_diff, uint32 p_time )
if (m_deathState == JUST_DIED)
KillPlayer();
if(m_nextSave > 0)
if (m_nextSave > 0)
{
if(update_diff >= m_nextSave)
if (update_diff >= m_nextSave)
{
// m_nextSave reseted in SaveToDB call
SaveToDB();
@ -1334,10 +1327,10 @@ void Player::Update( uint32 update_diff, uint32 p_time )
m_nextSave -= update_diff;
}
//Handle Water/drowning
// Handle Water/drowning
HandleDrowning(update_diff);
//Handle detect stealth players
// Handle detect stealth players
if (m_DetectInvTimer > 0)
{
if (update_diff >= m_DetectInvTimer)
@ -1366,10 +1359,10 @@ void Player::Update( uint32 update_diff, uint32 p_time )
HandleSobering();
}
// not auto-free ghost from body in instances
if(m_deathTimer > 0 && !GetMap()->Instanceable())
// Not auto-free ghost from body in instances
if (m_deathTimer > 0 && !GetMap()->Instanceable())
{
if(p_time >= m_deathTimer)
if (p_time >= m_deathTimer)
{
m_deathTimer = 0;
BuildPlayerRepop();
@ -1382,7 +1375,7 @@ void Player::Update( uint32 update_diff, uint32 p_time )
UpdateEnchantTime(update_diff);
UpdateHomebindTime(update_diff);
// group update
// Group update
SendUpdateToOutOfRangeGroupMembers();
Pet* pet = GetPet();

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "12055"
#define REVISION_NR "12056"
#endif // __REVISION_NR_H__