[10924] Send time diff between Update() calls for object - should help with mob respawn on inactive grids etc. Based on patches by VladimirMangos and cipherCOM. All issues from previous patches should be finally fixed now.

Signed-off-by: Ambal <pogrebniak@gala.net>
This commit is contained in:
Ambal 2010-12-27 22:16:19 +02:00
parent 72b1d30a1c
commit b11820593c
39 changed files with 284 additions and 149 deletions

View file

@ -1190,7 +1190,7 @@ void Player::SetDrunkValue(uint16 newDrunkenValue, uint32 itemId)
SendMessageToSet(&data, true);
}
void Player::Update( uint32 p_time )
void Player::Update( uint32 update_diff, uint32 p_time )
{
if(!IsInWorld())
return;
@ -1210,25 +1210,25 @@ void Player::Update( uint32 p_time )
//used to implement delayed far teleports
SetCanDelayTeleport(true);
Unit::Update( p_time );
Unit::Update( update_diff, p_time );
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) );
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) );
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);
@ -1246,7 +1246,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
@ -1254,7 +1254,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;
}
@ -1357,23 +1357,23 @@ 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);
@ -1391,15 +1391,15 @@ void Player::Update( uint32 p_time )
}
}
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())
@ -1417,29 +1417,29 @@ void Player::Update( uint32 p_time )
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
@ -1453,7 +1453,7 @@ void Player::Update( uint32 p_time )
if (m_drunk)
{
m_drunkTimer += p_time;
m_drunkTimer += update_diff;
if (m_drunkTimer > 10*IN_MILLISECONDS)
HandleSobering();
@ -1472,8 +1472,8 @@ void Player::Update( uint32 p_time )
m_deathTimer -= p_time;
}
UpdateEnchantTime(p_time);
UpdateHomebindTime(p_time);
UpdateEnchantTime(update_diff);
UpdateHomebindTime(update_diff);
// group update
SendUpdateToOutOfRangeGroupMembers();
@ -21063,7 +21063,7 @@ void Player::EnterVehicle(Vehicle *vehicle)
data << uint32(0); // counter?
data << uint32(MOVEFLAG_ONTRANSPORT); // transport
data << uint16(0); // special flags
data << uint32(getMSTime()); // time
data << uint32(WorldTimer::getMSTime()); // time
data << vehicle->GetPositionX(); // x
data << vehicle->GetPositionY(); // y
data << vehicle->GetPositionZ(); // z
@ -21074,7 +21074,7 @@ void Player::EnterVehicle(Vehicle *vehicle)
data << float(veSeat->m_attachmentOffsetY); // transport offsetY
data << float(veSeat->m_attachmentOffsetZ); // transport offsetZ
data << float(0); // transport orientation
data << uint32(getMSTime()); // transport time
data << uint32(WorldTimer::getMSTime()); // transport time
data << uint8(0); // seat
// end of transport part
data << uint32(0); // fall time
@ -21112,7 +21112,7 @@ void Player::ExitVehicle(Vehicle *vehicle)
data << uint32(0); // counter?
data << uint32(MOVEFLAG_ROOT); // fly unk
data << uint16(MOVEFLAG2_UNK4); // special flags
data << uint32(getMSTime()); // time
data << uint32(WorldTimer::getMSTime()); // time
data << vehicle->GetPositionX(); // x
data << vehicle->GetPositionY(); // y
data << vehicle->GetPositionZ(); // z
@ -22387,7 +22387,7 @@ void Player::BuildTeleportAckMsg( WorldPacket *data, float x, float y, float z,
*data << uint32(0); // this value increments every time
*data << uint32(m_movementInfo.GetMovementFlags()); // movement flags
*data << uint16(0); // 2.3.0
*data << uint32(getMSTime()); // time
*data << uint32(WorldTimer::getMSTime()); // time
*data << x;
*data << y;
*data << z;
@ -22405,7 +22405,7 @@ void Player::ResetTimeSync()
m_timeSyncCounter = 0;
m_timeSyncTimer = 0;
m_timeSyncClient = 0;
m_timeSyncServer = getMSTime();
m_timeSyncServer = WorldTimer::getMSTime();
}
void Player::SendTimeSync()
@ -22416,7 +22416,7 @@ void Player::SendTimeSync()
// Schedule next sync in 10 sec
m_timeSyncTimer = 10000;
m_timeSyncServer = getMSTime();
m_timeSyncServer = WorldTimer::getMSTime();
}
void Player::SendDuelCountdown(uint32 counter)