mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
[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:
parent
72b1d30a1c
commit
b11820593c
39 changed files with 284 additions and 149 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue