diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index f6ff916d60..30034693b0 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -139,7 +139,7 @@ void GroupStatistics::Clear() /* static */ void GroupStatistics::CountVehicle(const Vehicle *v, int delta) { /* make virtual trains group-neutral */ - if ( HasBit(v->subtype, GVSF_VIRTUAL) ) return; + if (HasBit(v->subtype, GVSF_VIRTUAL)) return; assert(delta == 1 || delta == -1); @@ -164,6 +164,9 @@ void GroupStatistics::Clear() */ /* static */ void GroupStatistics::CountEngine(const Vehicle *v, int delta) { + /* make virtual trains group-neutral */ + if (HasBit(v->subtype, GVSF_VIRTUAL)) return; + assert(delta == 1 || delta == -1); GroupStatistics::GetAllGroup(v).num_engines[v->engine_type] += delta; GroupStatistics::Get(v).num_engines[v->engine_type] += delta; diff --git a/src/saveload/tbtr_template_veh_sl.cpp b/src/saveload/tbtr_template_veh_sl.cpp index 60c8b6080b..32dd9e104c 100644 --- a/src/saveload/tbtr_template_veh_sl.cpp +++ b/src/saveload/tbtr_template_veh_sl.cpp @@ -3,6 +3,8 @@ #include "../tbtr_template_vehicle.h" #include "../tbtr_template_vehicle_func.h" #include "../train.h" +#include "../core/backup_type.hpp" +#include "../core/random_func.hpp" #include "saveload.h" @@ -100,8 +102,12 @@ void AfterLoadTemplateVehiclesUpdateImage() { TemplateVehicle *tv; + SavedRandomSeeds saved_seeds; + SaveRandomSeeds(&saved_seeds); + FOR_ALL_TEMPLATES(tv) { if (tv->Prev() == NULL) { + Backup cur_company(_current_company, tv->owner, FILE_LINE); StringID err; Train* t = VirtualTrainFromTemplateVehicle(tv, err); if (t != NULL) { @@ -123,8 +129,11 @@ void AfterLoadTemplateVehiclesUpdateImage() } delete t; } + cur_company.Restore(); } } + + RestoreRandomSeeds(saved_seeds); } extern const ChunkHandler _template_vehicle_chunk_handlers[] = { diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 251d48fcef..b6ebb5a47c 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -732,6 +732,7 @@ uint CountVehiclesInChain(const Vehicle *v) */ bool Vehicle::IsEngineCountable() const { + if (HasBit(this->subtype, GVSF_VIRTUAL)) return false; switch (this->type) { case VEH_AIRCRAFT: return Aircraft::From(this)->IsNormalAircraft(); // don't count plane shadows and helicopter rotors case VEH_TRAIN: diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 75e051111d..4d7bdc429d 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -960,6 +960,10 @@ CommandCost CmdVirtualTrainFromTemplateVehicle(TileIndex tile, DoCommandFlag fla return CMD_ERROR; } + if (tv->owner != _current_company) { + return CMD_ERROR; + } + bool should_execute = (flags & DC_EXEC) != 0; if (should_execute) { @@ -981,6 +985,8 @@ Train* VirtualTrainFromTemplateVehicle(TemplateVehicle* tv, StringID &err) CommandCost c; Train *tmp, *head, *tail; + assert(tv->owner == _current_company); + head = CmdBuildVirtualRailVehicle(tv->engine_type, true, err); if (!head) return NULL;