[10688] New version of patch for send real diff from last update.

In new version last update time stopred for specific Cell that store all world objects
placed in it. All objects of Cell updated (or not updated) in same time.

Original version provided by ciphercom.
This commit is contained in:
VladimirMangos 2010-11-06 19:43:23 +03:00
parent 464908f453
commit e219ee99bb
36 changed files with 183 additions and 151 deletions

View file

@ -1175,7 +1175,7 @@ void Player::SetDrunkValue(uint16 newDrunkenValue, uint32 itemId)
SendMessageToSet(&data, true);
}
void Player::Update( uint32 p_time )
void Player::Update(uint32 update_diff, uint32 tick_diff)
{
if(!IsInWorld())
return;
@ -1195,25 +1195,21 @@ void Player::Update( uint32 p_time )
//used to implement delayed far teleports
SetCanDelayTeleport(true);
Unit::Update( p_time );
Unit::Update(update_diff, tick_diff);
SetCanDelayTeleport(false);
// update player only attacks
if(uint32 ranged_att = getAttackTimer(RANGED_ATTACK))
{
setAttackTimer(RANGED_ATTACK, (p_time >= ranged_att ? 0 : ranged_att - p_time) );
}
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, (p_time >= off_att ? 0 : off_att - p_time) );
}
if (uint32 off_att = getAttackTimer(OFF_ATTACK))
setAttackTimer(OFF_ATTACK, (update_diff >= off_att ? 0 : off_att - update_diff) );
time_t now = time (NULL);
UpdatePvPFlag(now);
UpdateContestedPvP(p_time);
UpdateContestedPvP(update_diff);
UpdateDuelFlag(now);
@ -1231,7 +1227,7 @@ void Player::Update( uint32 p_time )
while (iter != m_timedquests.end())
{
QuestStatusData& q_status = mQuestStatus[*iter];
if( q_status.m_timer <= p_time )
if (q_status.m_timer <= update_diff)
{
uint32 quest_id = *iter;
++iter; // current iter will be removed in FailQuest
@ -1239,7 +1235,7 @@ void Player::Update( uint32 p_time )
}
else
{
q_status.m_timer -= p_time;
q_status.m_timer -= update_diff;
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
++iter;
}
@ -1342,49 +1338,49 @@ void Player::Update( uint32 p_time )
if (m_regenTimer)
{
if(p_time >= m_regenTimer)
if (update_diff >= m_regenTimer)
m_regenTimer = 0;
else
m_regenTimer -= p_time;
m_regenTimer -= update_diff;
}
if (m_weaponChangeTimer > 0)
{
if(p_time >= m_weaponChangeTimer)
if (update_diff >= m_weaponChangeTimer)
m_weaponChangeTimer = 0;
else
m_weaponChangeTimer -= p_time;
m_weaponChangeTimer -= update_diff;
}
if (m_zoneUpdateTimer > 0)
{
if(p_time >= m_zoneUpdateTimer)
if (update_diff >= m_zoneUpdateTimer)
{
uint32 newzone, newarea;
GetZoneAndAreaId(newzone,newarea);
if( m_zoneUpdateId != newzone )
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 )
if (m_areaUpdateId != newarea)
UpdateArea(newarea);
m_zoneUpdateTimer = ZONE_UPDATE_INTERVAL;
}
}
else
m_zoneUpdateTimer -= p_time;
m_zoneUpdateTimer -= update_diff;
}
if (m_timeSyncTimer > 0)
{
if(p_time >= m_timeSyncTimer)
if (update_diff >= m_timeSyncTimer)
SendTimeSync();
else
m_timeSyncTimer -= p_time;
m_timeSyncTimer -= update_diff;
}
if (isAlive())
@ -1400,31 +1396,31 @@ void Player::Update( uint32 p_time )
if (m_deathState == JUST_DIED)
KillPlayer();
if(m_nextSave > 0)
if (m_nextSave > 0)
{
if(p_time >= m_nextSave)
if (update_diff >= m_nextSave)
{
// m_nextSave reseted in SaveToDB call
SaveToDB();
DETAIL_LOG("Player '%s' (GUID: %u) saved", GetName(), GetGUIDLow());
}
else
m_nextSave -= p_time;
m_nextSave -= update_diff;
}
//Handle Water/drowning
HandleDrowning(p_time);
HandleDrowning(update_diff);
//Handle detect stealth players
if (m_DetectInvTimer > 0)
{
if (p_time >= m_DetectInvTimer)
if (update_diff >= m_DetectInvTimer)
{
HandleStealthedUnitsDetection();
m_DetectInvTimer = 3000;
}
else
m_DetectInvTimer -= p_time;
m_DetectInvTimer -= update_diff;
}
// Played time
@ -1438,27 +1434,27 @@ void Player::Update( uint32 p_time )
if (m_drunk)
{
m_drunkTimer += p_time;
m_drunkTimer += update_diff;
if (m_drunkTimer > 10*IN_MILLISECONDS)
HandleSobering();
}
// not auto-free ghost from body in instances
if(m_deathTimer > 0 && !GetBaseMap()->Instanceable())
if (m_deathTimer > 0 && !GetBaseMap()->Instanceable())
{
if(p_time >= m_deathTimer)
if(update_diff >= m_deathTimer)
{
m_deathTimer = 0;
BuildPlayerRepop();
RepopAtGraveyard();
}
else
m_deathTimer -= p_time;
m_deathTimer -= update_diff;
}
UpdateEnchantTime(p_time);
UpdateHomebindTime(p_time);
UpdateEnchantTime(update_diff);
UpdateHomebindTime(update_diff);
// group update
SendUpdateToOutOfRangeGroupMembers();