[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

@ -117,12 +117,20 @@ class MANGOS_DLL_DECL Grid
return i_container.template remove<SPECIFIC_OBJECT>(obj); return i_container.template remove<SPECIFIC_OBJECT>(obj);
} }
uint32 SetLastUpdateTimeAndReturnDiff(uint32 newtime)
{
uint32 realdiff = getMSTimeDiff(m_LastUpdateTime,newtime);
m_LastUpdateTime = newtime;
return realdiff;
}
private: private:
TypeMapContainer<GRID_OBJECT_TYPES> i_container; TypeMapContainer<GRID_OBJECT_TYPES> i_container;
TypeMapContainer<WORLD_OBJECT_TYPES> i_objects; TypeMapContainer<WORLD_OBJECT_TYPES> i_objects;
typedef std::set<void*> ActiveGridObjects; typedef std::set<void*> ActiveGridObjects;
ActiveGridObjects m_activeGridObjects; ActiveGridObjects m_activeGridObjects;
uint32 m_LastUpdateTime; // last time when Update call has been or current started, used and set Map::Update
}; };
#endif #endif

View file

@ -406,7 +406,7 @@ uint32 Creature::ChooseDisplayId(const CreatureInfo *cinfo, const CreatureData *
return display_id; return display_id;
} }
void Creature::Update(uint32 diff) void Creature::Update(uint32 update_diff, uint32 tick_diff)
{ {
if (m_needNotify) if (m_needNotify)
{ {
@ -467,7 +467,7 @@ void Creature::Update(uint32 diff)
if (m_isDeadByDefault) if (m_isDeadByDefault)
break; break;
if (m_corpseDecayTimer <= diff) if (m_corpseDecayTimer <= update_diff)
{ {
// since pool system can fail to roll unspawned object, this one can remain spawned, so must set respawn nevertheless // since pool system can fail to roll unspawned object, this one can remain spawned, so must set respawn nevertheless
uint16 poolid = GetDBTableGUIDLow() ? sPoolMgr.IsPartOfAPool<Creature>(GetDBTableGUIDLow()) : 0; uint16 poolid = GetDBTableGUIDLow() ? sPoolMgr.IsPartOfAPool<Creature>(GetDBTableGUIDLow()) : 0;
@ -482,11 +482,11 @@ void Creature::Update(uint32 diff)
} }
else else
{ {
m_corpseDecayTimer -= diff; m_corpseDecayTimer -= update_diff;
if (m_groupLootId) if (m_groupLootId)
{ {
if(diff < m_groupLootTimer) if(update_diff < m_groupLootTimer)
m_groupLootTimer -= diff; m_groupLootTimer -= update_diff;
else else
StopGroupLoot(); StopGroupLoot();
} }
@ -498,7 +498,7 @@ void Creature::Update(uint32 diff)
{ {
if (m_isDeadByDefault) if (m_isDeadByDefault)
{ {
if (m_corpseDecayTimer <= diff) if (m_corpseDecayTimer <= update_diff)
{ {
// since pool system can fail to roll unspawned object, this one can remain spawned, so must set respawn nevertheless // since pool system can fail to roll unspawned object, this one can remain spawned, so must set respawn nevertheless
uint16 poolid = GetDBTableGUIDLow() ? sPoolMgr.IsPartOfAPool<Creature>(GetDBTableGUIDLow()) : 0; uint16 poolid = GetDBTableGUIDLow() ? sPoolMgr.IsPartOfAPool<Creature>(GetDBTableGUIDLow()) : 0;
@ -516,11 +516,11 @@ void Creature::Update(uint32 diff)
} }
else else
{ {
m_corpseDecayTimer -= diff; m_corpseDecayTimer -= update_diff;
} }
} }
Unit::Update( diff ); Unit::Update(update_diff, tick_diff);
// creature can be dead after Unit::Update call // creature can be dead after Unit::Update call
// CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly) // CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly)
@ -531,7 +531,7 @@ void Creature::Update(uint32 diff)
{ {
// do not allow the AI to be changed during update // do not allow the AI to be changed during update
m_AI_locked = true; m_AI_locked = true;
i_AI->UpdateAI(diff); i_AI->UpdateAI(tick_diff); // AI not react good at real update delays (while freeze in non-active part of map)
m_AI_locked = false; m_AI_locked = false;
} }
@ -541,10 +541,10 @@ void Creature::Update(uint32 diff)
break; break;
if(m_regenTimer > 0) if(m_regenTimer > 0)
{ {
if(diff >= m_regenTimer) if(update_diff >= m_regenTimer)
m_regenTimer = 0; m_regenTimer = 0;
else else
m_regenTimer -= diff; m_regenTimer -= update_diff;
} }
if (m_regenTimer != 0) if (m_regenTimer != 0)
break; break;

View file

@ -402,7 +402,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; } uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; }
char const* GetSubName() const { return GetCreatureInfo()->SubName; } char const* GetSubName() const { return GetCreatureInfo()->SubName; }
void Update(uint32 time); // overwrite Unit::Update void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
void GetRespawnCoord(float &x, float &y, float &z, float* ori = NULL, float* dist =NULL) const; void GetRespawnCoord(float &x, float &y, float &z, float* ori = NULL, float* dist =NULL) const;
uint32 GetEquipmentId() const { return m_equipmentId; } uint32 GetEquipmentId() const { return m_equipmentId; }

View file

@ -106,7 +106,7 @@ Unit* DynamicObject::GetCaster() const
return ObjectAccessor::GetUnit(*this, GetCasterGUID()); return ObjectAccessor::GetUnit(*this, GetCasterGUID());
} }
void DynamicObject::Update(uint32 p_time) void DynamicObject::Update(uint32 update_diff, uint32 /*tick_diff*/)
{ {
// caster can be not in world at time dynamic object update, but dynamic object not yet deleted in Unit destructor // caster can be not in world at time dynamic object update, but dynamic object not yet deleted in Unit destructor
Unit* caster = GetCaster(); Unit* caster = GetCaster();
@ -118,8 +118,8 @@ void DynamicObject::Update(uint32 p_time)
bool deleteThis = false; bool deleteThis = false;
if(m_aliveDuration > int32(p_time)) if(m_aliveDuration > int32(update_diff))
m_aliveDuration -= p_time; m_aliveDuration -= update_diff;
else else
deleteThis = true; deleteThis = true;

View file

@ -35,7 +35,7 @@ class DynamicObject : public WorldObject
void RemoveFromWorld(); void RemoveFromWorld();
bool Create(uint32 guidlow, Unit *caster, uint32 spellId, SpellEffectIndex effIndex, float x, float y, float z, int32 duration, float radius); bool Create(uint32 guidlow, Unit *caster, uint32 spellId, SpellEffectIndex effIndex, float x, float y, float z, int32 duration, float radius);
void Update(uint32 p_time); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
void Delete(); void Delete();
uint32 GetSpellId() const { return m_spellId; } uint32 GetSpellId() const { return m_spellId; }
SpellEffectIndex GetEffIndex() const { return m_effIndex; } SpellEffectIndex GetEffIndex() const { return m_effIndex; }

View file

@ -159,7 +159,7 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
return true; return true;
} }
void GameObject::Update(uint32 /*p_time*/) void GameObject::Update(uint32 /*update_diff*/, uint32 /*tick_diff*/)
{ {
if (GetObjectGuid().IsMOTransport()) if (GetObjectGuid().IsMOTransport())
{ {

View file

@ -588,7 +588,7 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
void RemoveFromWorld(); void RemoveFromWorld();
bool Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint8 animprogress, GOState go_state); bool Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint8 animprogress, GOState go_state);
void Update(uint32 p_time); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
GameObjectInfo const* GetGOInfo() const; GameObjectInfo const* GetGOInfo() const;
bool IsTransport() const; bool IsTransport() const;

View file

@ -187,9 +187,7 @@ template<class T> void
ObjectUpdater::Visit(GridRefManager<T> &m) ObjectUpdater::Visit(GridRefManager<T> &m)
{ {
for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter) for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
{ iter->getSource()->Update(i_realdiff, i_diff);
iter->getSource()->Update(i_timeDiff);
}
} }
bool CannibalizeObjectCheck::operator()(Corpse* u) bool CannibalizeObjectCheck::operator()(Corpse* u)

View file

@ -61,13 +61,14 @@ namespace MaNGOS
struct MANGOS_DLL_DECL GridUpdater struct MANGOS_DLL_DECL GridUpdater
{ {
GridType &i_grid; GridType &i_grid;
uint32 i_realdiff;
uint32 i_timeDiff; uint32 i_timeDiff;
GridUpdater(GridType &grid, uint32 diff) : i_grid(grid), i_timeDiff(diff) {} GridUpdater(GridType &grid, uint32 realdiff, uint32 diff) : i_grid(grid), i_realdiff(realdiff), i_timeDiff(diff) {}
template<class T> void updateObjects(GridRefManager<T> &m) template<class T> void updateObjects(GridRefManager<T> &m)
{ {
for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter) for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
iter->getSource()->Update(i_timeDiff); iter->getSource()->Update(i_realdiff, i_timeDiff);
} }
void Visit(PlayerMapType &m) { updateObjects<Player>(m); } void Visit(PlayerMapType &m) { updateObjects<Player>(m); }
@ -136,8 +137,9 @@ namespace MaNGOS
struct MANGOS_DLL_DECL ObjectUpdater struct MANGOS_DLL_DECL ObjectUpdater
{ {
uint32 i_timeDiff; uint32 i_realdiff; // time from last update in msecs
explicit ObjectUpdater(const uint32 &diff) : i_timeDiff(diff) {} uint32 i_diff; // current tick time diff in msecs
explicit ObjectUpdater(uint32 realdiff, uint32 diff) : i_realdiff(realdiff), i_diff(diff) {}
template<class T> void Visit(GridRefManager<T> &m); template<class T> void Visit(GridRefManager<T> &m);
void Visit(PlayerMapType &) {} void Visit(PlayerMapType &) {}
void Visit(CorpseMapType &) {} void Visit(CorpseMapType &) {}

View file

@ -41,7 +41,7 @@ inline void MaNGOS::VisibleNotifier::Visit(GridRefManager<T> &m)
inline void MaNGOS::ObjectUpdater::Visit(CreatureMapType &m) inline void MaNGOS::ObjectUpdater::Visit(CreatureMapType &m)
{ {
for(CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) for(CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
iter->getSource()->Update(i_timeDiff); iter->getSource()->Update(i_realdiff, i_diff);
} }
inline void PlayerCreatureRelocationWorker(Player* pl, WorldObject const* viewPoint, Creature* c) inline void PlayerCreatureRelocationWorker(Player* pl, WorldObject const* viewPoint, Creature* c)

View file

@ -131,7 +131,8 @@ Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode, Map* _par
i_id(id), i_InstanceId(InstanceId), m_unloadTimer(0), i_id(id), i_InstanceId(InstanceId), m_unloadTimer(0),
m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_instanceSave(NULL), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_instanceSave(NULL),
m_activeNonPlayersIter(m_activeNonPlayers.end()), m_activeNonPlayersIter(m_activeNonPlayers.end()),
i_gridExpiry(expiry), m_parentMap(_parent ? _parent : this) i_gridExpiry(expiry), m_parentMap(_parent ? _parent : this),
m_lastUpdateTime(getMSTime()) // expected that next update call will not long after map creating
{ {
for(unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx) for(unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx)
{ {
@ -510,25 +511,19 @@ bool Map::loaded(const GridPair &p) const
return ( getNGrid(p.x_coord, p.y_coord) && isGridObjectDataLoaded(p.x_coord, p.y_coord) ); return ( getNGrid(p.x_coord, p.y_coord) && isGridObjectDataLoaded(p.x_coord, p.y_coord) );
} }
void Map::Update(const uint32 &t_diff) void Map::Update(uint32 time_, uint32 diff)
{ {
m_lastUpdateTime = time_;
/// update players at tick /// update players at tick
for(m_mapRefIter = m_mapRefManager.begin(); m_mapRefIter != m_mapRefManager.end(); ++m_mapRefIter) for(m_mapRefIter = m_mapRefManager.begin(); m_mapRefIter != m_mapRefManager.end(); ++m_mapRefIter)
{ if (Player* plr = m_mapRefIter->getSource())
Player* plr = m_mapRefIter->getSource(); if (plr->IsInWorld())
if(plr && plr->IsInWorld()) plr->Update(diff, diff);
plr->Update(t_diff);
}
/// update active cells around players and active objects /// update active cells around players and active objects
resetMarkedCells(); resetMarkedCells();
MaNGOS::ObjectUpdater updater(t_diff);
// for creature
TypeContainerVisitor<MaNGOS::ObjectUpdater, GridTypeMapContainer > grid_object_update(updater);
// for pets
TypeContainerVisitor<MaNGOS::ObjectUpdater, WorldTypeMapContainer > world_object_update(updater);
// the player iterator is stored in the map object // the player iterator is stored in the map object
// to make sure calls to Map::Remove don't invalidate it // to make sure calls to Map::Remove don't invalidate it
for(m_mapRefIter = m_mapRefManager.begin(); m_mapRefIter != m_mapRefManager.end(); ++m_mapRefIter) for(m_mapRefIter = m_mapRefManager.begin(); m_mapRefIter != m_mapRefManager.end(); ++m_mapRefIter)
@ -561,9 +556,21 @@ void Map::Update(const uint32 &t_diff)
if(!isCellMarked(cell_id)) if(!isCellMarked(cell_id))
{ {
markCell(cell_id); markCell(cell_id);
CellPair pair(x,y); CellPair pair(x,y);
Cell cell(pair); Cell cell(pair);
cell.SetNoCreate(); cell.SetNoCreate();
uint32 realdiff = diff;
if (loaded(cell.gridPair()) )
realdiff = (*getNGrid(cell.GridX(),cell.GridY()))(cell.CellX(),cell.CellY()).SetLastUpdateTimeAndReturnDiff(time_);
MaNGOS::ObjectUpdater updater(realdiff, diff);
// for creature
TypeContainerVisitor<MaNGOS::ObjectUpdater, GridTypeMapContainer > grid_object_update(updater);
// for pets
TypeContainerVisitor<MaNGOS::ObjectUpdater, WorldTypeMapContainer > world_object_update(updater);
Visit(cell, grid_object_update); Visit(cell, grid_object_update);
Visit(cell, world_object_update); Visit(cell, world_object_update);
} }
@ -608,9 +615,21 @@ void Map::Update(const uint32 &t_diff)
if(!isCellMarked(cell_id)) if(!isCellMarked(cell_id))
{ {
markCell(cell_id); markCell(cell_id);
CellPair pair(x,y); CellPair pair(x,y);
Cell cell(pair); Cell cell(pair);
cell.SetNoCreate(); cell.SetNoCreate();
uint32 realdiff = diff;
if (loaded(cell.gridPair()) )
realdiff = (*getNGrid(cell.GridX(),cell.GridY()))(cell.CellX(),cell.CellY()).SetLastUpdateTimeAndReturnDiff(time_);
MaNGOS::ObjectUpdater updater(realdiff, diff);
// for creature
TypeContainerVisitor<MaNGOS::ObjectUpdater, GridTypeMapContainer > grid_object_update(updater);
// for pets
TypeContainerVisitor<MaNGOS::ObjectUpdater, WorldTypeMapContainer > world_object_update(updater);
Visit(cell, grid_object_update); Visit(cell, grid_object_update);
Visit(cell, world_object_update); Visit(cell, world_object_update);
} }
@ -632,7 +651,7 @@ void Map::Update(const uint32 &t_diff)
GridInfo *info = i->getSource()->getGridInfoRef(); GridInfo *info = i->getSource()->getGridInfoRef();
++i; // The update might delete the map and we need the next map before the iterator gets invalid ++i; // The update might delete the map and we need the next map before the iterator gets invalid
MANGOS_ASSERT(grid->GetGridState() >= 0 && grid->GetGridState() < MAX_GRID_STATE); MANGOS_ASSERT(grid->GetGridState() >= 0 && grid->GetGridState() < MAX_GRID_STATE);
sMapMgr.UpdateGridState(grid->GetGridState(), *this, *grid, *info, grid->getX(), grid->getY(), t_diff); sMapMgr.UpdateGridState(grid->GetGridState(), *this, *grid, *info, grid->getX(), grid->getY(), diff);
} }
} }
@ -1840,17 +1859,17 @@ bool InstanceMap::Add(Player *player)
return true; return true;
} }
void InstanceMap::Update(const uint32& t_diff) void InstanceMap::Update(uint32 time_, uint32 diff)
{ {
Map::Update(t_diff); Map::Update(time_, diff);
if(i_data) if(i_data)
i_data->Update(t_diff); i_data->Update(diff);
} }
void BattleGroundMap::Update(const uint32& diff) void BattleGroundMap::Update(uint32 time_, uint32 diff)
{ {
Map::Update(diff); Map::Update(time_, diff);
GetBG()->Update(diff); GetBG()->Update(diff);
} }

View file

@ -108,7 +108,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
template<class T> void Add(T *); template<class T> void Add(T *);
template<class T> void Remove(T *, bool); template<class T> void Remove(T *, bool);
virtual void Update(const uint32&); virtual void Update(uint32 time_, uint32 diff);
void MessageBroadcast(Player *, WorldPacket *, bool to_self); void MessageBroadcast(Player *, WorldPacket *, bool to_self);
void MessageBroadcast(WorldObject *, WorldPacket *); void MessageBroadcast(WorldObject *, WorldPacket *);
@ -270,6 +270,8 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
uint32 GenerateLocalLowGuid(HighGuid guidhigh); uint32 GenerateLocalLowGuid(HighGuid guidhigh);
bool GetAreaInfo(float x, float y, float z, uint32 &mogpflags, int32 &adtId, int32 &rootId, int32 &groupId) const; bool GetAreaInfo(float x, float y, float z, uint32 &mogpflags, int32 &adtId, int32 &rootId, int32 &groupId) const;
bool IsOutdoors(float x, float y, float z) const; bool IsOutdoors(float x, float y, float z) const;
uint32 GetLastUpdateTime() const { return m_lastUpdateTime; }
private: private:
void LoadMapAndVMap(int gx, int gy); void LoadMapAndVMap(int gx, int gy);
void LoadVMap(int gx, int gy); void LoadVMap(int gx, int gy);
@ -346,6 +348,8 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
std::set<WorldObject *> i_objectsToRemove; std::set<WorldObject *> i_objectsToRemove;
std::multimap<time_t, ScriptAction> m_scriptSchedule; std::multimap<time_t, ScriptAction> m_scriptSchedule;
uint32 m_lastUpdateTime; // time in past when called Update last time, set to object at adding to Map
// Map local low guid counters // Map local low guid counters
ObjectGuidGenerator<HIGHGUID_DYNAMICOBJECT> m_DynObjectGuids; ObjectGuidGenerator<HIGHGUID_DYNAMICOBJECT> m_DynObjectGuids;
ObjectGuidGenerator<HIGHGUID_PET> m_PetGuids; ObjectGuidGenerator<HIGHGUID_PET> m_PetGuids;
@ -382,7 +386,7 @@ class MANGOS_DLL_SPEC InstanceMap : public Map
~InstanceMap(); ~InstanceMap();
bool Add(Player *); bool Add(Player *);
void Remove(Player *, bool); void Remove(Player *, bool);
void Update(const uint32&); void Update(uint32 time_, uint32 diff);
void CreateInstanceData(bool load); void CreateInstanceData(bool load);
bool Reset(uint8 method); bool Reset(uint8 method);
uint32 GetScriptId() { return i_script_id; } uint32 GetScriptId() { return i_script_id; }
@ -407,7 +411,7 @@ class MANGOS_DLL_SPEC BattleGroundMap : public Map
BattleGroundMap(uint32 id, time_t, uint32 InstanceId, Map* _parent, uint8 spawnMode); BattleGroundMap(uint32 id, time_t, uint32 InstanceId, Map* _parent, uint8 spawnMode);
~BattleGroundMap(); ~BattleGroundMap();
void Update(const uint32&); void Update(uint32 time_, uint32 diff);
bool Add(Player *); bool Add(Player *);
void Remove(Player *, bool); void Remove(Player *, bool);
bool CanEnter(Player* player); bool CanEnter(Player* player);

View file

@ -43,24 +43,24 @@ void MapInstanced::InitVisibilityDistance()
} }
} }
void MapInstanced::Update(const uint32& t) void MapInstanced::Update(uint32 time_, uint32 diff)
{ {
// take care of loaded GridMaps (when unused, unload it!) // take care of loaded GridMaps (when unused, unload it!)
Map::Update(t); Map::Update(time_, diff);
// update the instanced maps // update the instanced maps
InstancedMaps::iterator i = m_InstancedMaps.begin(); InstancedMaps::iterator i = m_InstancedMaps.begin();
while (i != m_InstancedMaps.end()) while (i != m_InstancedMaps.end())
{ {
if(i->second->CanUnload(t)) if(i->second->CanUnload(diff))
{ {
DestroyInstance(i); // iterator incremented DestroyInstance(i); // iterator incremented
} }
else else
{ {
// update only here, because it may schedule some bad things before delete // update only here, because it may schedule some bad things before delete
i->second->Update(t); i->second->Update(time_, diff);
++i; ++i;
} }
} }

View file

@ -34,7 +34,7 @@ class MANGOS_DLL_DECL MapInstanced : public Map
~MapInstanced() {} ~MapInstanced() {}
// functions overwrite Map versions // functions overwrite Map versions
void Update(const uint32&); void Update(uint32 time_, uint32 diff);
void RemoveAllObjectsInRemoveList(); void RemoveAllObjectsInRemoveList();
void UnloadAll(bool pForce); void UnloadAll(bool pForce);

View file

@ -239,17 +239,17 @@ void MapManager::DeleteInstance(uint32 mapid, uint32 instanceId)
} }
void void
MapManager::Update(uint32 diff) MapManager::Update(const uint32 time_, const uint32 diff)
{ {
i_timer.Update(diff); i_timer.Update(diff);
if( !i_timer.Passed() ) if( !i_timer.Passed() )
return; return;
for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
iter->second->Update(i_timer.GetCurrent()); iter->second->Update(time_, i_timer.GetCurrent());
for (TransportSet::iterator iter = m_Transports.begin(); iter != m_Transports.end(); ++iter) for (TransportSet::iterator iter = m_Transports.begin(); iter != m_Transports.end(); ++iter)
(*iter)->Update(i_timer.GetCurrent()); (*iter)->Update(i_timer.GetCurrent(), i_timer.GetCurrent());
i_timer.SetCurrent(0); i_timer.SetCurrent(0);
} }

View file

@ -67,7 +67,7 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::
} }
void Initialize(void); void Initialize(void);
void Update(uint32); void Update(const uint32 time, const uint32 diff);
void SetGridCleanUpDelay(uint32 t) void SetGridCleanUpDelay(uint32 t)
{ {

View file

@ -342,7 +342,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object
public: public:
virtual ~WorldObject ( ) {} virtual ~WorldObject ( ) {}
virtual void Update ( uint32 /*time_diff*/ ) { } virtual void Update(uint32 /*update_diff*/, uint32 /*tick_diff*/) { }
void _Create( uint32 guidlow, HighGuid guidhigh, uint32 phaseMask); void _Create( uint32 guidlow, HighGuid guidhigh, uint32 phaseMask);
@ -492,6 +492,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object
bool isActiveObject() const { return m_isActiveObject || m_viewPoint.hasViewers(); } bool isActiveObject() const { return m_isActiveObject || m_viewPoint.hasViewers(); }
ViewPoint& GetViewPoint() { return m_viewPoint; } ViewPoint& GetViewPoint() { return m_viewPoint; }
protected: protected:
explicit WorldObject(); explicit WorldObject();

View file

@ -227,6 +227,8 @@ ObjectGridLoader::Load(GridType &grid)
void ObjectGridLoader::LoadN(void) void ObjectGridLoader::LoadN(void)
{ {
uint32 updatetime = i_map->GetLastUpdateTime();
i_gameObjects = 0; i_creatures = 0; i_corpses = 0; i_gameObjects = 0; i_creatures = 0; i_corpses = 0;
i_cell.data.Part.cell_y = 0; i_cell.data.Part.cell_y = 0;
for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x) for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x)
@ -237,6 +239,9 @@ void ObjectGridLoader::LoadN(void)
i_cell.data.Part.cell_y = y; i_cell.data.Part.cell_y = y;
GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> loader; GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> loader;
loader.Load(i_grid(x, y), *this); loader.Load(i_grid(x, y), *this);
// setup last update time for loaded cell
i_grid(x, y).SetLastUpdateTimeAndReturnDiff(updatetime);
} }
} }
DEBUG_LOG("%u GameObjects, %u Creatures, and %u Corpses/Bones loaded for grid %u on map %u", i_gameObjects, i_creatures, i_corpses,i_grid.GetGridId(), i_map->GetId()); DEBUG_LOG("%u GameObjects, %u Creatures, and %u Corpses/Bones loaded for grid %u on map %u", i_gameObjects, i_creatures, i_corpses,i_grid.GetGridId(), i_map->GetId());

View file

@ -482,7 +482,7 @@ void Pet::SetDeathState(DeathState s) // overwrite virtual
} }
} }
void Pet::Update(uint32 diff) void Pet::Update(uint32 update_diff, uint32 tick_diff)
{ {
if(m_removed) // pet already removed, just wait in remove queue, no updates if(m_removed) // pet already removed, just wait in remove queue, no updates
return; return;
@ -491,7 +491,7 @@ void Pet::Update(uint32 diff)
{ {
case CORPSE: case CORPSE:
{ {
if (m_corpseDecayTimer <= diff) if (m_corpseDecayTimer <= update_diff)
{ {
MANGOS_ASSERT(getPetType()!=SUMMON_PET && "Must be already removed."); MANGOS_ASSERT(getPetType()!=SUMMON_PET && "Must be already removed.");
Remove(PET_SAVE_NOT_IN_SLOT); //hunters' pets never get removed because of death, NEVER! Remove(PET_SAVE_NOT_IN_SLOT); //hunters' pets never get removed because of death, NEVER!
@ -520,8 +520,8 @@ void Pet::Update(uint32 diff)
if (m_duration > 0) if (m_duration > 0)
{ {
if(m_duration > (int32)diff) if (m_duration > (int32)update_diff)
m_duration -= (int32)diff; m_duration -= (int32)update_diff;
else else
{ {
Remove(getPetType() != SUMMON_PET ? PET_SAVE_AS_DELETED:PET_SAVE_NOT_IN_SLOT); Remove(getPetType() != SUMMON_PET ? PET_SAVE_AS_DELETED:PET_SAVE_NOT_IN_SLOT);
@ -530,7 +530,7 @@ void Pet::Update(uint32 diff)
} }
//regenerate focus for hunter pets or energy for deathknight's ghoul //regenerate focus for hunter pets or energy for deathknight's ghoul
if(m_regenTimer <= diff) if (m_regenTimer <= update_diff)
{ {
switch (getPowerType()) switch (getPowerType())
{ {
@ -544,25 +544,25 @@ void Pet::Update(uint32 diff)
m_regenTimer = 4000; m_regenTimer = 4000;
} }
else else
m_regenTimer -= diff; m_regenTimer -= update_diff;
if (getPetType() != HUNTER_PET) if (getPetType() != HUNTER_PET)
break; break;
if(m_happinessTimer <= diff) if (m_happinessTimer <= update_diff)
{ {
LooseHappiness(); LooseHappiness();
m_happinessTimer = 7500; m_happinessTimer = 7500;
} }
else else
m_happinessTimer -= diff; m_happinessTimer -= update_diff;
break; break;
} }
default: default:
break; break;
} }
Creature::Update(diff); Creature::Update(update_diff, tick_diff);
} }
void Pet::Regenerate(Powers power) void Pet::Regenerate(Powers power)

View file

@ -157,7 +157,8 @@ class Pet : public Creature
static void DeleteFromDB(uint32 guidlow); static void DeleteFromDB(uint32 guidlow);
void SetDeathState(DeathState s); // overwrite virtual Creature::SetDeathState and Unit::SetDeathState void SetDeathState(DeathState s); // overwrite virtual Creature::SetDeathState and Unit::SetDeathState
void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
uint8 GetPetAutoSpellSize() const { return m_autospells.size(); } uint8 GetPetAutoSpellSize() const { return m_autospells.size(); }
uint32 GetPetAutoSpellOnPos(uint8 pos) const uint32 GetPetAutoSpellOnPos(uint8 pos) const

View file

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

View file

@ -1123,7 +1123,7 @@ class MANGOS_DLL_SPEC Player : public Unit
bool Create( uint32 guidlow, const std::string& name, uint8 race, uint8 class_, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId ); bool Create( uint32 guidlow, const std::string& name, uint8 race, uint8 class_, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId );
void Update( uint32 time ); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
static bool BuildEnumData( QueryResult * result, WorldPacket * p_data ); static bool BuildEnumData( QueryResult * result, WorldPacket * p_data );

View file

@ -26,7 +26,7 @@ Creature(CREATURE_SUBTYPE_TEMPORARY_SUMMON), m_type(TEMPSUMMON_TIMED_OR_CORPSE_D
{ {
} }
void TemporarySummon::Update( uint32 diff ) void TemporarySummon::Update(uint32 update_diff, uint32 tick_diff)
{ {
switch(m_type) switch(m_type)
{ {
@ -34,26 +34,26 @@ void TemporarySummon::Update( uint32 diff )
break; break;
case TEMPSUMMON_TIMED_DESPAWN: case TEMPSUMMON_TIMED_DESPAWN:
{ {
if (m_timer <= diff) if (m_timer <= update_diff)
{ {
UnSummon(); UnSummon();
return; return;
} }
m_timer -= diff; m_timer -= update_diff;
break; break;
} }
case TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT: case TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT:
{ {
if (!isInCombat()) if (!isInCombat())
{ {
if (m_timer <= diff) if (m_timer <= update_diff)
{ {
UnSummon(); UnSummon();
return; return;
} }
m_timer -= diff; m_timer -= update_diff;
} }
else if (m_timer != m_lifetime) else if (m_timer != m_lifetime)
m_timer = m_lifetime; m_timer = m_lifetime;
@ -65,13 +65,13 @@ void TemporarySummon::Update( uint32 diff )
{ {
if (m_deathState == CORPSE) if (m_deathState == CORPSE)
{ {
if (m_timer <= diff) if (m_timer <= update_diff)
{ {
UnSummon(); UnSummon();
return; return;
} }
m_timer -= diff; m_timer -= update_diff;
} }
break; break;
} }
@ -106,13 +106,13 @@ void TemporarySummon::Update( uint32 diff )
if (!isInCombat()) if (!isInCombat())
{ {
if (m_timer <= diff) if (m_timer <= update_diff)
{ {
UnSummon(); UnSummon();
return; return;
} }
else else
m_timer -= diff; m_timer -= update_diff;
} }
else if (m_timer != m_lifetime) else if (m_timer != m_lifetime)
m_timer = m_lifetime; m_timer = m_lifetime;
@ -129,13 +129,13 @@ void TemporarySummon::Update( uint32 diff )
if (!isInCombat() && isAlive() ) if (!isInCombat() && isAlive() )
{ {
if (m_timer <= diff) if (m_timer <= update_diff)
{ {
UnSummon(); UnSummon();
return; return;
} }
else else
m_timer -= diff; m_timer -= update_diff;
} }
else if (m_timer != m_lifetime) else if (m_timer != m_lifetime)
m_timer = m_lifetime; m_timer = m_lifetime;
@ -147,7 +147,7 @@ void TemporarySummon::Update( uint32 diff )
break; break;
} }
Creature::Update( diff ); Creature::Update(update_diff, tick_diff);
} }
void TemporarySummon::Summon(TempSummonType type, uint32 lifetime) void TemporarySummon::Summon(TempSummonType type, uint32 lifetime)

View file

@ -27,7 +27,7 @@ class TemporarySummon : public Creature
public: public:
explicit TemporarySummon(ObjectGuid summoner = ObjectGuid()); explicit TemporarySummon(ObjectGuid summoner = ObjectGuid());
virtual ~TemporarySummon(){}; virtual ~TemporarySummon(){};
void Update(uint32 time); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
void Summon(TempSummonType type, uint32 lifetime); void Summon(TempSummonType type, uint32 lifetime);
void MANGOS_DLL_SPEC UnSummon(); void MANGOS_DLL_SPEC UnSummon();
void SaveToDB(); void SaveToDB();

View file

@ -31,7 +31,7 @@ Totem::Totem() : Creature(CREATURE_SUBTYPE_TOTEM)
m_type = TOTEM_PASSIVE; m_type = TOTEM_PASSIVE;
} }
void Totem::Update( uint32 time ) void Totem::Update(uint32 update_diff, uint32 tick_diff)
{ {
Unit *owner = GetOwner(); Unit *owner = GetOwner();
if (!owner || !owner->isAlive() || !isAlive()) if (!owner || !owner->isAlive() || !isAlive())
@ -40,15 +40,15 @@ void Totem::Update( uint32 time )
return; return;
} }
if (m_duration <= time) if (m_duration <= update_diff)
{ {
UnSummon(); // remove self UnSummon(); // remove self
return; return;
} }
else else
m_duration -= time; m_duration -= update_diff;
Creature::Update( time ); Creature::Update(update_diff, tick_diff);
} }
void Totem::Summon(Unit* owner) void Totem::Summon(Unit* owner)

View file

@ -33,7 +33,7 @@ class Totem : public Creature
public: public:
explicit Totem(); explicit Totem();
virtual ~Totem(){}; virtual ~Totem(){};
void Update( uint32 time ); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
void Summon(Unit* owner); void Summon(Unit* owner);
void UnSummon(); void UnSummon();
uint32 GetSpell() const { return m_spells[0]; } uint32 GetSpell() const { return m_spells[0]; }

View file

@ -487,7 +487,7 @@ bool Transport::RemovePassenger(Player* passenger)
return true; return true;
} }
void Transport::Update(uint32 /*p_time*/) void Transport::Update(uint32 /*update_diff*/, uint32 /*tick_diff*/)
{ {
if (m_WayPoints.size() <= 1) if (m_WayPoints.size() <= 1)
return; return;

View file

@ -32,7 +32,7 @@ class Transport : public GameObject
bool Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint8 animprogress, uint16 dynamicHighValue); bool Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint8 animprogress, uint16 dynamicHighValue);
bool GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids); bool GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids);
void Update(uint32 p_time); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
bool AddPassenger(Player* passenger); bool AddPassenger(Player* passenger);
bool RemovePassenger(Player* passenger); bool RemovePassenger(Player* passenger);

View file

@ -291,7 +291,7 @@ Unit::~Unit()
MANGOS_ASSERT(m_deletedHolders.size() == 0); MANGOS_ASSERT(m_deletedHolders.size() == 0);
} }
void Unit::Update( uint32 p_time ) void Unit::Update(uint32 update_diff, uint32 tick_diff)
{ {
if(!IsInWorld()) if(!IsInWorld())
return; return;
@ -306,21 +306,21 @@ void Unit::Update( uint32 p_time )
// WARNING! Order of execution here is important, do not change. // WARNING! Order of execution here is important, do not change.
// Spells must be processed with event system BEFORE they go to _UpdateSpells. // Spells must be processed with event system BEFORE they go to _UpdateSpells.
// Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad. // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
m_Events.Update( p_time ); m_Events.Update(update_diff);
_UpdateSpells( p_time ); _UpdateSpells(update_diff);
CleanupDeletedAuras(); CleanupDeletedAuras();
if (m_lastManaUseTimer) if (m_lastManaUseTimer)
{ {
if (p_time >= m_lastManaUseTimer) if (update_diff >= m_lastManaUseTimer)
m_lastManaUseTimer = 0; m_lastManaUseTimer = 0;
else else
m_lastManaUseTimer -= p_time; m_lastManaUseTimer -= update_diff;
} }
if (CanHaveThreatList()) if (CanHaveThreatList())
getThreatManager().UpdateForClient(p_time); getThreatManager().UpdateForClient(update_diff);
// update combat timer only for players and pets // update combat timer only for players and pets
if (isInCombat() && (GetTypeId() == TYPEID_PLAYER || ((Creature*)this)->IsPet() || ((Creature*)this)->isCharmed())) if (isInCombat() && (GetTypeId() == TYPEID_PLAYER || ((Creature*)this)->IsPet() || ((Creature*)this)->isCharmed()))
@ -331,26 +331,24 @@ void Unit::Update( uint32 p_time )
if (m_HostileRefManager.isEmpty()) if (m_HostileRefManager.isEmpty())
{ {
// m_CombatTimer set at aura start and it will be freeze until aura removing // m_CombatTimer set at aura start and it will be freeze until aura removing
if (m_CombatTimer <= p_time) if (m_CombatTimer <= update_diff)
CombatStop(); CombatStop();
else else
m_CombatTimer -= p_time; m_CombatTimer -= update_diff;
} }
} }
if (uint32 base_att = getAttackTimer(BASE_ATTACK)) if (uint32 base_att = getAttackTimer(BASE_ATTACK))
{ setAttackTimer(BASE_ATTACK, (update_diff >= base_att ? 0 : base_att - update_diff) );
setAttackTimer(BASE_ATTACK, (p_time >= base_att ? 0 : base_att - p_time) );
}
// update abilities available only for fraction of time // update abilities available only for fraction of time
UpdateReactives( p_time ); UpdateReactives(update_diff);
ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, GetHealth() < GetMaxHealth()*0.20f); ModifyAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, GetHealth() < GetMaxHealth()*0.20f);
ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, GetHealth() < GetMaxHealth()*0.35f); ModifyAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, GetHealth() < GetMaxHealth()*0.35f);
ModifyAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetHealth() > GetMaxHealth()*0.75f); ModifyAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetHealth() > GetMaxHealth()*0.75f);
i_motionMaster.UpdateMotion(p_time); i_motionMaster.UpdateMotion(tick_diff); // movegens expected non freeze time diff
} }
bool Unit::haveOffhandWeapon() const bool Unit::haveOffhandWeapon() const

View file

@ -1168,7 +1168,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void ApplyDiminishingAura(DiminishingGroup group, bool apply); void ApplyDiminishingAura(DiminishingGroup group, bool apply);
void ClearDiminishings() { m_Diminishing.clear(); } void ClearDiminishings() { m_Diminishing.clear(); }
virtual void Update( uint32 time ); void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
void setAttackTimer(WeaponAttackType type, uint32 time) { m_attackTimer[type] = time; } void setAttackTimer(WeaponAttackType type, uint32 time) { m_attackTimer[type] = time; }
void resetAttackTimer(WeaponAttackType type = BASE_ATTACK); void resetAttackTimer(WeaponAttackType type = BASE_ATTACK);

View file

@ -56,9 +56,9 @@ void Vehicle::SetDeathState(DeathState s) // overwrite vir
Creature::SetDeathState(s); Creature::SetDeathState(s);
} }
void Vehicle::Update(uint32 diff) void Vehicle::Update(uint32 update_diff, uint32 tick_diff)
{ {
Creature::Update(diff); Creature::Update(update_diff, tick_diff);
} }
bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team) bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team)

View file

@ -36,7 +36,7 @@ class Vehicle : public Creature
bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team); bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team);
void SetDeathState(DeathState s); // overwrite virtual Creature::SetDeathState and Unit::SetDeathState void SetDeathState(DeathState s); // overwrite virtual Creature::SetDeathState and Unit::SetDeathState
void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update void Update(uint32 update_diff, uint32 tick_diff); // overwrite WorldObject::Update
uint32 GetVehicleId() { return m_vehicleId; } uint32 GetVehicleId() { return m_vehicleId; }
void SetVehicleId(uint32 vehicleid) { m_vehicleId = vehicleid; } void SetVehicleId(uint32 vehicleid) { m_vehicleId = vehicleid; }

View file

@ -1380,7 +1380,7 @@ void World::DetectDBCLang()
} }
/// Update the World ! /// Update the World !
void World::Update(uint32 diff) void World::Update(uint32 time_, uint32 diff)
{ {
///- Update the different timers ///- Update the different timers
for(int i = 0; i < WUPDATE_COUNT; ++i) for(int i = 0; i < WUPDATE_COUNT; ++i)
@ -1460,7 +1460,7 @@ void World::Update(uint32 diff)
{ {
m_timers[WUPDATE_OBJECTS].Reset(); m_timers[WUPDATE_OBJECTS].Reset();
///- Update objects when the timer has passed (maps, transport, creatures,...) ///- Update objects when the timer has passed (maps, transport, creatures,...)
sMapMgr.Update(diff); // As interval = 0 sMapMgr.Update(time_, diff); // As interval = 0
sBattleGroundMgr.Update(diff); sBattleGroundMgr.Update(diff);
} }

View file

@ -509,7 +509,7 @@ class World
static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; } static void StopNow(uint8 exitcode) { m_stopEvent = true; m_ExitCode = exitcode; }
static bool IsStopped() { return m_stopEvent; } static bool IsStopped() { return m_stopEvent; }
void Update(uint32 diff); void Update(uint32 time_, uint32 diff);
void UpdateSessions( uint32 diff ); void UpdateSessions( uint32 diff );

View file

@ -57,7 +57,7 @@ void WorldRunnable::run()
uint32 diff = getMSTimeDiff(realPrevTime,realCurrTime); uint32 diff = getMSTimeDiff(realPrevTime,realCurrTime);
sWorld.Update( diff ); sWorld.Update(realCurrTime, diff);
realPrevTime = realCurrTime; realPrevTime = realCurrTime;
// diff (D0) include time of previous sleep (d0) + tick time (t0) // diff (D0) include time of previous sleep (d0) + tick time (t0)

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "10687" #define REVISION_NR "10688"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__