Do not update viewport sign kd tree in network dedicated mode, or during savegame conversion
This commit is contained in:
@@ -609,6 +609,8 @@ bool AfterLoadGame()
|
|||||||
RebuildTownKdtree();
|
RebuildTownKdtree();
|
||||||
RebuildStationKdtree();
|
RebuildStationKdtree();
|
||||||
|
|
||||||
|
_viewport_sign_kdtree_valid = false;
|
||||||
|
|
||||||
if (IsSavegameVersionBefore(SLV_98)) GamelogGRFAddList(_grfconfig);
|
if (IsSavegameVersionBefore(SLV_98)) GamelogGRFAddList(_grfconfig);
|
||||||
|
|
||||||
if (IsSavegameVersionBefore(SLV_119)) {
|
if (IsSavegameVersionBefore(SLV_119)) {
|
||||||
|
@@ -59,7 +59,7 @@ CommandCost CmdPlaceSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
si->name = stredup(text);
|
si->name = stredup(text);
|
||||||
}
|
}
|
||||||
si->UpdateVirtCoord();
|
si->UpdateVirtCoord();
|
||||||
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(si->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(si->index));
|
||||||
InvalidateWindowData(WC_SIGN_LIST, 0, 0);
|
InvalidateWindowData(WC_SIGN_LIST, 0, 0);
|
||||||
_new_sign_id = si->index;
|
_new_sign_id = si->index;
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ CommandCost CmdRenameSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
} else { // Delete sign
|
} else { // Delete sign
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
si->sign.MarkDirty();
|
si->sign.MarkDirty();
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index));
|
||||||
delete si;
|
delete si;
|
||||||
|
|
||||||
InvalidateWindowData(WC_SIGN_LIST, 0, 0);
|
InvalidateWindowData(WC_SIGN_LIST, 0, 0);
|
||||||
|
@@ -168,7 +168,7 @@ Station::~Station()
|
|||||||
CargoPacket::InvalidateAllFrom(this->index);
|
CargoPacket::InvalidateAllFrom(this->index);
|
||||||
|
|
||||||
_station_kdtree.Remove(this->index);
|
_station_kdtree.Remove(this->index);
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -439,13 +439,13 @@ void Station::MoveSign(TileIndex new_xy)
|
|||||||
{
|
{
|
||||||
if (this->xy == new_xy) return;
|
if (this->xy == new_xy) return;
|
||||||
|
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
|
||||||
_station_kdtree.Remove(this->index);
|
_station_kdtree.Remove(this->index);
|
||||||
|
|
||||||
this->BaseStation::MoveSign(new_xy);
|
this->BaseStation::MoveSign(new_xy);
|
||||||
|
|
||||||
_station_kdtree.Insert(this->index);
|
_station_kdtree.Insert(this->index);
|
||||||
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Update the virtual coords needed to draw the station sign for all stations. */
|
/** Update the virtual coords needed to draw the station sign for all stations. */
|
||||||
@@ -730,7 +730,7 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus
|
|||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
*st = new Station(area.tile);
|
*st = new Station(area.tile);
|
||||||
_station_kdtree.Insert((*st)->index);
|
_station_kdtree.Insert((*st)->index);
|
||||||
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation((*st)->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation((*st)->index));
|
||||||
|
|
||||||
(*st)->town = ClosestTownFromTile(area.tile, UINT_MAX);
|
(*st)->town = ClosestTownFromTile(area.tile, UINT_MAX);
|
||||||
(*st)->string_id = GenerateStationName(*st, area.tile, name_class);
|
(*st)->string_id = GenerateStationName(*st, area.tile, name_class);
|
||||||
@@ -4222,7 +4222,7 @@ void BuildOilRig(TileIndex tile)
|
|||||||
st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE);
|
st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE);
|
||||||
|
|
||||||
st->UpdateVirtCoord();
|
st->UpdateVirtCoord();
|
||||||
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index));
|
||||||
st->RecomputeCatchment();
|
st->RecomputeCatchment();
|
||||||
UpdateStationAcceptance(st, false);
|
UpdateStationAcceptance(st, false);
|
||||||
ZoningMarkDirtyStationCoverageArea(st);
|
ZoningMarkDirtyStationCoverageArea(st);
|
||||||
|
@@ -1886,7 +1886,7 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize
|
|||||||
t->townnameparts = townnameparts;
|
t->townnameparts = townnameparts;
|
||||||
|
|
||||||
t->UpdateVirtCoord();
|
t->UpdateVirtCoord();
|
||||||
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index));
|
||||||
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0);
|
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0);
|
||||||
|
|
||||||
t->InitializeLayout(layout);
|
t->InitializeLayout(layout);
|
||||||
@@ -3116,7 +3116,7 @@ CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
/* The town destructor will delete the other things related to the town. */
|
/* The town destructor will delete the other things related to the town. */
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
_town_kdtree.Remove(t->index);
|
_town_kdtree.Remove(t->index);
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index));
|
||||||
delete t;
|
delete t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -122,6 +122,7 @@ Point _tile_fract_coords;
|
|||||||
|
|
||||||
|
|
||||||
ViewportSignKdtree _viewport_sign_kdtree(&Kdtree_ViewportSignXYFunc);
|
ViewportSignKdtree _viewport_sign_kdtree(&Kdtree_ViewportSignXYFunc);
|
||||||
|
bool _viewport_sign_kdtree_valid = false;
|
||||||
static int _viewport_sign_maxwidth = 0;
|
static int _viewport_sign_maxwidth = 0;
|
||||||
|
|
||||||
|
|
||||||
@@ -3345,6 +3346,14 @@ void RebuildViewportKdtree()
|
|||||||
/* Reset biggest size sign seen */
|
/* Reset biggest size sign seen */
|
||||||
_viewport_sign_maxwidth = 0;
|
_viewport_sign_maxwidth = 0;
|
||||||
|
|
||||||
|
if (_network_dedicated) {
|
||||||
|
_viewport_sign_kdtree_valid = false;
|
||||||
|
_viewport_sign_kdtree.Build<ViewportSignKdtreeItem*>(nullptr, nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_viewport_sign_kdtree_valid = true;
|
||||||
|
|
||||||
std::vector<ViewportSignKdtreeItem> items;
|
std::vector<ViewportSignKdtreeItem> items;
|
||||||
items.reserve(BaseStation::GetNumItems() + Town::GetNumItems() + Sign::GetNumItems());
|
items.reserve(BaseStation::GetNumItems() + Town::GetNumItems() + Sign::GetNumItems());
|
||||||
|
|
||||||
|
@@ -77,6 +77,7 @@ inline int32 Kdtree_ViewportSignXYFunc(const ViewportSignKdtreeItem &item, int d
|
|||||||
|
|
||||||
typedef Kdtree<ViewportSignKdtreeItem, decltype(&Kdtree_ViewportSignXYFunc), int32, int32> ViewportSignKdtree;
|
typedef Kdtree<ViewportSignKdtreeItem, decltype(&Kdtree_ViewportSignXYFunc), int32, int32> ViewportSignKdtree;
|
||||||
extern ViewportSignKdtree _viewport_sign_kdtree;
|
extern ViewportSignKdtree _viewport_sign_kdtree;
|
||||||
|
extern bool _viewport_sign_kdtree_valid;
|
||||||
|
|
||||||
void RebuildViewportKdtree();
|
void RebuildViewportKdtree();
|
||||||
|
|
||||||
|
@@ -56,6 +56,6 @@ Waypoint::~Waypoint()
|
|||||||
if (CleaningPool()) return;
|
if (CleaningPool()) return;
|
||||||
DeleteWindowById(WC_WAYPOINT_VIEW, this->index);
|
DeleteWindowById(WC_WAYPOINT_VIEW, this->index);
|
||||||
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index);
|
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index);
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index));
|
||||||
TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index);
|
TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index);
|
||||||
}
|
}
|
||||||
|
@@ -245,7 +245,7 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
|
|||||||
need_sign_update = true;
|
need_sign_update = true;
|
||||||
} else if (!wp->IsInUse()) {
|
} else if (!wp->IsInUse()) {
|
||||||
/* Move existing (recently deleted) waypoint to the new location */
|
/* Move existing (recently deleted) waypoint to the new location */
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
||||||
wp->xy = start_tile;
|
wp->xy = start_tile;
|
||||||
need_sign_update = true;
|
need_sign_update = true;
|
||||||
}
|
}
|
||||||
@@ -262,7 +262,7 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
|
|||||||
if (wp->town == NULL) MakeDefaultName(wp);
|
if (wp->town == NULL) MakeDefaultName(wp);
|
||||||
|
|
||||||
wp->UpdateVirtCoord();
|
wp->UpdateVirtCoord();
|
||||||
if (need_sign_update) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
if (need_sign_update && _viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
||||||
|
|
||||||
byte map_spec_index = AllocateSpecToStation(spec, wp, true);
|
byte map_spec_index = AllocateSpecToStation(spec, wp, true);
|
||||||
|
|
||||||
@@ -320,7 +320,7 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
wp = new Waypoint(tile);
|
wp = new Waypoint(tile);
|
||||||
} else {
|
} else {
|
||||||
/* Move existing (recently deleted) buoy to the new location */
|
/* Move existing (recently deleted) buoy to the new location */
|
||||||
_viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
||||||
wp->xy = tile;
|
wp->xy = tile;
|
||||||
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
|
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
MarkTileDirtyByTile(tile);
|
MarkTileDirtyByTile(tile);
|
||||||
|
|
||||||
wp->UpdateVirtCoord();
|
wp->UpdateVirtCoord();
|
||||||
_viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
|
||||||
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
|
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user