fix(Core): Missing updates for creatures; disable Travis modules check (#2457)

This commit is contained in:
Stoabrogga
2019-11-26 09:49:58 +01:00
committed by GitHub
parent 3700e91436
commit a8ee996431
5 changed files with 46 additions and 45 deletions

View File

@@ -629,16 +629,17 @@ bool Map::IsGridLoaded(const GridCoord &p) const
void Map::VisitNearbyCellsOfPlayer(Player* player, TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer> &gridVisitor,
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer> &worldVisitor,
TypeContainerVisitor<Trinity::LargeObjectUpdater, GridTypeMapContainer> &largeObjectVisitor)
TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer> &largeGridVisitor,
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer> &largeWorldVisitor)
{
// check for valid position
if (!player->IsPositionValid())
return;
// check normal grid activation range of the player
VisitNearbyCellsOf(player, gridVisitor, worldVisitor);
VisitNearbyCellsOf(player, gridVisitor, worldVisitor, largeGridVisitor, largeWorldVisitor);
// check maximum visibility distance for large creatures (cells already visited by the normal check won't be visited again)
// check maximum visibility distance for large creatures
CellArea area = Cell::CalculateCellArea(player->GetPositionX(), player->GetPositionY(), MAX_VISIBILITY_DISTANCE);
for (uint32 x = area.low_bound.x_coord; x <= area.high_bound.x_coord; ++x)
@@ -648,20 +649,23 @@ void Map::VisitNearbyCellsOfPlayer(Player* player, TypeContainerVisitor<Trinity:
// marked cells are those that have been visited
// don't visit the same cell twice
uint32 cell_id = (y * TOTAL_NUMBER_OF_CELLS_PER_MAP) + x;
if (isCellMarked(cell_id))
if (isCellMarkedLarge(cell_id))
continue;
markCell(cell_id);
markCellLarge(cell_id);
CellCoord pair(x, y);
Cell cell(pair);
Visit(cell, largeObjectVisitor);
Visit(cell, largeGridVisitor);
Visit(cell, largeWorldVisitor);
}
}
}
void Map::VisitNearbyCellsOf(WorldObject* obj, TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer> &gridVisitor,
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer> &worldVisitor)
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer> &worldVisitor,
TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer> &largeGridVisitor,
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer> &largeWorldVisitor)
{
// Check for valid position
if (!obj->IsPositionValid())
@@ -690,6 +694,13 @@ void Map::VisitNearbyCellsOf(WorldObject* obj, TypeContainerVisitor<Trinity::Obj
Visit(cell, gridVisitor);
Visit(cell, worldVisitor);
if (!isCellMarkedLarge(cell_id))
{
markCellLarge(cell_id);
Visit(cell, largeGridVisitor);
Visit(cell, largeWorldVisitor);
}
}
}
}
@@ -733,16 +744,18 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
/// update active cells around players and active objects
resetMarkedCells();
resetMarkedCellsLarge();
Trinity::ObjectUpdater updater(t_diff);
Trinity::ObjectUpdater updater(t_diff, false);
// for creature
TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer > grid_object_update(updater);
// for pets
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer > world_object_update(updater);
// for large creatures
Trinity::LargeObjectUpdater largeObjectUpdater(t_diff);
TypeContainerVisitor<Trinity::LargeObjectUpdater, GridTypeMapContainer > grid_large_object_update(largeObjectUpdater);
Trinity::ObjectUpdater largeObjectUpdater(t_diff, true);
TypeContainerVisitor<Trinity::ObjectUpdater, GridTypeMapContainer > grid_large_object_update(largeObjectUpdater);
TypeContainerVisitor<Trinity::ObjectUpdater, WorldTypeMapContainer > world_large_object_update(largeObjectUpdater);
// pussywizard: container for far creatures in combat with players
std::vector<Creature*> updateList; updateList.reserve(10);
@@ -756,7 +769,7 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
if (!obj || !obj->IsInWorld())
continue;
VisitNearbyCellsOf(obj, grid_object_update, world_object_update);
VisitNearbyCellsOf(obj, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
}
// the player iterator is stored in the map object
@@ -771,7 +784,7 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
// update players at tick
player->Update(s_diff);
VisitNearbyCellsOfPlayer(player, grid_object_update, world_object_update, grid_large_object_update);
VisitNearbyCellsOfPlayer(player, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
// handle updates for creatures in combat with player and are more than X yards away
if (player->IsInCombat())
@@ -788,7 +801,7 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
ref = ref->next();
}
for (std::vector<Creature*>::const_iterator itr = updateList.begin(); itr != updateList.end(); ++itr)
VisitNearbyCellsOf(*itr, grid_object_update, world_object_update);
VisitNearbyCellsOf(*itr, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update);
}
}