mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-12 18:40:29 +00:00
(svn r20545) -Codechange: make sure an OrderBackup gets cleared when the depot it belongs to gets removed, the depot window gets closed or when another vehicle gets sold in a depot
This commit is contained in:
parent
e242294530
commit
019878118d
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "depot_base.h"
|
#include "depot_base.h"
|
||||||
|
#include "order_backup.h"
|
||||||
#include "order_func.h"
|
#include "order_func.h"
|
||||||
#include "window_func.h"
|
#include "window_func.h"
|
||||||
#include "core/pool_func.hpp"
|
#include "core/pool_func.hpp"
|
||||||
@ -31,6 +32,7 @@ Depot::~Depot()
|
|||||||
|
|
||||||
/* Delete the depot-window */
|
/* Delete the depot-window */
|
||||||
DeleteWindowById(WC_VEHICLE_DEPOT, this->xy);
|
DeleteWindowById(WC_VEHICLE_DEPOT, this->xy);
|
||||||
|
OrderBackup::Reset(this->xy);
|
||||||
|
|
||||||
/* Delete the depot list */
|
/* Delete the depot list */
|
||||||
WindowNumber wno = (this->index << 16) | VLW_DEPOT_LIST | GetTileOwner(this->xy);
|
WindowNumber wno = (this->index << 16) | VLW_DEPOT_LIST | GetTileOwner(this->xy);
|
||||||
|
@ -261,6 +261,7 @@ struct DepotWindow : Window {
|
|||||||
~DepotWindow()
|
~DepotWindow()
|
||||||
{
|
{
|
||||||
DeleteWindowById(WC_BUILD_VEHICLE, this->window_number);
|
DeleteWindowById(WC_BUILD_VEHICLE, this->window_number);
|
||||||
|
OrderBackup::Reset(this->window_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -978,12 +979,9 @@ struct DepotWindow : Window {
|
|||||||
|
|
||||||
bool is_engine = (v->type != VEH_TRAIN || Train::From(v)->IsFrontEngine());
|
bool is_engine = (v->type != VEH_TRAIN || Train::From(v)->IsFrontEngine());
|
||||||
|
|
||||||
if (is_engine) {
|
if (is_engine) OrderBackup::Backup(v);
|
||||||
OrderBackup::Reset();
|
|
||||||
new OrderBackup(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!DoCommandP(v->tile, v->index | sell_cmd << 16, 0, GetCmdSellVeh(v->type)) && is_engine) OrderBackup::Reset();
|
if (!DoCommandP(v->tile, v->index | sell_cmd << 16, 0, GetCmdSellVeh(v->type)) && is_engine) OrderBackup::Reset(this->window_number);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ OrderBackup::OrderBackup(const Vehicle *v)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OrderBackup::RestoreTo(const Vehicle *v)
|
void OrderBackup::DoRestore(const Vehicle *v)
|
||||||
{
|
{
|
||||||
/* If we have a custom name, process that */
|
/* If we have a custom name, process that */
|
||||||
if (this->name != NULL) DoCommandP(0, v->index, 0, CMD_RENAME_VEHICLE, NULL, this->name);
|
if (this->name != NULL) DoCommandP(0, v->index, 0, CMD_RENAME_VEHICLE, NULL, this->name);
|
||||||
@ -109,22 +109,31 @@ void OrderBackup::RestoreTo(const Vehicle *v)
|
|||||||
|
|
||||||
/* Restore vehicle group */
|
/* Restore vehicle group */
|
||||||
DoCommandP(0, this->group, v->index, CMD_ADD_VEHICLE_GROUP);
|
DoCommandP(0, this->group, v->index, CMD_ADD_VEHICLE_GROUP);
|
||||||
|
|
||||||
delete this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ OrderBackup *OrderBackup::GetByTile(TileIndex t)
|
/* static */ void OrderBackup::Backup(const Vehicle *v)
|
||||||
|
{
|
||||||
|
OrderBackup::Reset();
|
||||||
|
new OrderBackup(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* static */ void OrderBackup::Restore(const Vehicle *v)
|
||||||
{
|
{
|
||||||
OrderBackup *ob;
|
OrderBackup *ob;
|
||||||
FOR_ALL_ORDER_BACKUPS(ob) {
|
FOR_ALL_ORDER_BACKUPS(ob) {
|
||||||
if (ob->tile == t) return ob;
|
if (v->tile != ob->tile) continue;
|
||||||
|
|
||||||
|
ob->DoRestore(v);
|
||||||
|
delete ob;
|
||||||
}
|
}
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ void OrderBackup::Reset()
|
/* static */ void OrderBackup::Reset(TileIndex t)
|
||||||
{
|
{
|
||||||
_order_backup_pool.CleanPool();
|
OrderBackup *ob;
|
||||||
|
FOR_ALL_ORDER_BACKUPS(ob) {
|
||||||
|
if (t == INVALID_TILE || t == ob->tile) delete ob;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ void OrderBackup::ClearGroup(GroupID group)
|
/* static */ void OrderBackup::ClearGroup(GroupID group)
|
||||||
|
@ -43,34 +43,41 @@ private:
|
|||||||
VehicleOrderID orderindex; ///< The order-index the vehicle had.
|
VehicleOrderID orderindex; ///< The order-index the vehicle had.
|
||||||
Order *orders; ///< The actual orders if the vehicle was not a clone.
|
Order *orders; ///< The actual orders if the vehicle was not a clone.
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
/**
|
||||||
* Create an order backup for the given vehicle.
|
* Create an order backup for the given vehicle.
|
||||||
* @param v The vehicle to make a backup of.
|
* @param v The vehicle to make a backup of.
|
||||||
*/
|
*/
|
||||||
OrderBackup(const Vehicle *v);
|
OrderBackup(const Vehicle *v);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restore the data of this order to the given vehicle.
|
||||||
|
* @param v The vehicle to restore to.
|
||||||
|
*/
|
||||||
|
void DoRestore(const Vehicle *v);
|
||||||
|
|
||||||
|
public:
|
||||||
/** Free everything that is allocated. */
|
/** Free everything that is allocated. */
|
||||||
~OrderBackup();
|
~OrderBackup();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an order backup for the given vehicle.
|
||||||
|
* @param v The vehicle to make a backup of.
|
||||||
|
* @note Will automatically remove any previous backups of this user.
|
||||||
|
*/
|
||||||
|
static void Backup(const Vehicle *v);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restore the data of this order to the given vehicle.
|
* Restore the data of this order to the given vehicle.
|
||||||
* @param v The vehicle to restore to.
|
* @param v The vehicle to restore to.
|
||||||
* @note After restoration the backup will automatically be removed.
|
* @note After restoration the backup will automatically be removed.
|
||||||
*/
|
*/
|
||||||
void RestoreTo(const Vehicle *v);
|
static void Restore(const Vehicle *v);
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the order backup associated with a given tile.
|
|
||||||
* @param t The tile to get the order backup for.
|
|
||||||
* @return The order backup, or NULL if it doesn't exist.
|
|
||||||
*/
|
|
||||||
static OrderBackup *GetByTile(TileIndex t);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the OrderBackups.
|
* Reset the OrderBackups.
|
||||||
|
* @param tile The tile of the order backup.
|
||||||
*/
|
*/
|
||||||
static void Reset();
|
static void Reset(TileIndex tile = INVALID_TILE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the group of all backups having this group ID.
|
* Clear the group of all backups having this group ID.
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include "newgrf.h"
|
#include "newgrf.h"
|
||||||
#include "table/airporttile_ids.h"
|
#include "table/airporttile_ids.h"
|
||||||
#include "newgrf_airporttiles.h"
|
#include "newgrf_airporttiles.h"
|
||||||
|
#include "order_backup.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
@ -2287,6 +2288,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
|
|||||||
cost.AddCost(_price[PR_CLEAR_STATION_AIRPORT]);
|
cost.AddCost(_price[PR_CLEAR_STATION_AIRPORT]);
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
|
if (IsHangarTile(tile_cur)) OrderBackup::Reset(tile_cur);
|
||||||
DeleteAnimatedTile(tile_cur);
|
DeleteAnimatedTile(tile_cur);
|
||||||
DoClearSquare(tile_cur);
|
DoClearSquare(tile_cur);
|
||||||
DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur);
|
DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur);
|
||||||
|
@ -2373,7 +2373,6 @@ void CcBuildPrimaryVehicle(const CommandCost &result, TileIndex tile, uint32 p1,
|
|||||||
if (result.Failed()) return;
|
if (result.Failed()) return;
|
||||||
|
|
||||||
const Vehicle *v = Vehicle::Get(_new_vehicle_id);
|
const Vehicle *v = Vehicle::Get(_new_vehicle_id);
|
||||||
OrderBackup *ob = OrderBackup::GetByTile(v->tile);
|
OrderBackup::Restore(v);
|
||||||
if (ob != NULL) ob->RestoreTo(v);
|
|
||||||
ShowVehicleViewWindow(v);
|
ShowVehicleViewWindow(v);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user