mirror of https://github.com/OpenTTD/OpenTTD
(svn r1700) - Fix: Hacked clients can no longer be used to build vehicles that are not available yet (Hackykid)
parent
1ae9e7b448
commit
99338d278d
|
@ -161,6 +161,8 @@ int32 CmdBuildAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||||
const AircraftVehicleInfo *avi = AircraftVehInfo(p1);
|
const AircraftVehicleInfo *avi = AircraftVehInfo(p1);
|
||||||
Engine *e;
|
Engine *e;
|
||||||
|
|
||||||
|
if (!(IsEngineBuildable(p1, VEH_Aircraft))) return CMD_ERROR;
|
||||||
|
|
||||||
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
||||||
|
|
||||||
value = EstimateAircraftCost(p1);
|
value = EstimateAircraftCost(p1);
|
||||||
|
|
24
engine.c
24
engine.c
|
@ -906,5 +906,29 @@ const ChunkHandler _engine_chunk_handlers[] = {
|
||||||
{ 'ENGS', LoadSave_ENGS, LoadSave_ENGS, CH_RIFF | CH_LAST},
|
{ 'ENGS', LoadSave_ENGS, LoadSave_ENGS, CH_RIFF | CH_LAST},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns true if an engine is valid, and it is of the specified type, and buildable by the current player, false otherwise
|
||||||
|
*
|
||||||
|
* engine = index of the engine to check
|
||||||
|
* type = the type the engine should be of (VEH_xxx)
|
||||||
|
*/
|
||||||
|
bool IsEngineBuildable(int engine, byte type) {
|
||||||
|
Engine *e;
|
||||||
|
|
||||||
|
// check if it's an engine that is in the engine array
|
||||||
|
if (0 > engine || engine >= TOTAL_NUM_ENGINES ) return false;
|
||||||
|
|
||||||
|
e = DEREF_ENGINE(engine);
|
||||||
|
|
||||||
|
// check if it's an engine of specified type
|
||||||
|
if (e->type != type) return false;
|
||||||
|
|
||||||
|
// check if it's available
|
||||||
|
if (!HASBIT(e->player_avail, _current_player)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
1
engine.h
1
engine.h
|
@ -133,6 +133,7 @@ void AcceptEnginePreview(Engine *e, int player);
|
||||||
void LoadCustomEngineNames(void);
|
void LoadCustomEngineNames(void);
|
||||||
void DeleteCustomEngineNames(void);
|
void DeleteCustomEngineNames(void);
|
||||||
|
|
||||||
|
bool IsEngineBuildable(int engine, byte type);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NUM_NORMAL_RAIL_ENGINES = 54,
|
NUM_NORMAL_RAIL_ENGINES = 54,
|
||||||
|
|
|
@ -115,6 +115,8 @@ int32 CmdBuildRoadVeh(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||||
uint tile = TILE_FROM_XY(x,y);
|
uint tile = TILE_FROM_XY(x,y);
|
||||||
Engine *e;
|
Engine *e;
|
||||||
|
|
||||||
|
if (!(IsEngineBuildable(p1, VEH_Road))) return CMD_ERROR;
|
||||||
|
|
||||||
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
||||||
|
|
||||||
cost = EstimateRoadVehCost(p1);
|
cost = EstimateRoadVehCost(p1);
|
||||||
|
|
|
@ -816,6 +816,8 @@ int32 CmdBuildShip(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||||
uint tile = TILE_FROM_XY(x,y);
|
uint tile = TILE_FROM_XY(x,y);
|
||||||
Engine *e;
|
Engine *e;
|
||||||
|
|
||||||
|
if (!(IsEngineBuildable(p1, VEH_Ship))) return CMD_ERROR;
|
||||||
|
|
||||||
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
||||||
|
|
||||||
value = EstimateShipCost(p1);
|
value = EstimateShipCost(p1);
|
||||||
|
|
|
@ -525,6 +525,8 @@ int32 CmdBuildRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||||
Engine *e;
|
Engine *e;
|
||||||
uint tile;
|
uint tile;
|
||||||
|
|
||||||
|
if (!(IsEngineBuildable(p1, VEH_Train))) return CMD_ERROR;
|
||||||
|
|
||||||
_cmd_build_rail_veh_var1 = 0;
|
_cmd_build_rail_veh_var1 = 0;
|
||||||
|
|
||||||
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
|
||||||
|
|
Loading…
Reference in New Issue