#pragma once
#include "ModelInfo.h"
#define MODELINDICES \
X("fire_hydrant", MI_FIRE_HYDRANT, 0x5F5A00) \
X("bagelstnd02", MI_BAGELSTAND2, 0x5F59FC) \
X("fish01", MI_FISHSTALL01, 0x5F59EC) \
X("fishstall02", MI_FISHSTALL02, 0x5F59F0) \
X("fishstall03", MI_FISHSTALL03, 0x5F59F4) \
X("fishstall04", MI_FISHSTALL04, 0x5F59F8) \
X("taxisign", MI_TAXISIGN, 0x5F59E8) \
X("phonesign", MI_PHONESIGN, 0x5F59E4) \
X("noparkingsign1", MI_NOPARKINGSIGN1, 0x5F59E0) \
X("bussign1", MI_BUSSIGN1, 0x5F59DC) \
X("roadworkbarrier1", MI_ROADWORKBARRIER1, 0x5F59D8) \
X("dump1", MI_DUMP1, 0x5F59D4) \
X("trafficcone", MI_TRAFFICCONE, 0x5F59D0) \
X("newsstand1", MI_NEWSSTAND, 0x5F59CC) \
X("postbox1", MI_POSTBOX1, 0x5F59C8) \
X("bin1", MI_BIN, 0x5F59C4) \
X("wastebin", MI_WASTEBIN, 0x5F59C0) \
X("phonebooth1", MI_PHONEBOOTH1, 0x5F59BC) \
X("parkingmeter", MI_PARKINGMETER, 0x5F59B8) \
X("trafficlight1", MI_TRAFFICLIGHTS, 0x5F5958) \
X("lamppost1", MI_SINGLESTREETLIGHTS1, 0x5F595C) \
X("lamppost2", MI_SINGLESTREETLIGHTS2, 0x5F5960) \
X("lamppost3", MI_SINGLESTREETLIGHTS3, 0x5F5964) \
X("doublestreetlght1", MI_DOUBLESTREETLIGHTS, 0x5F5968) \
X("rd_Road2A10", MI_ROADSFORROADBLOCKSSTART, 0x5F596C) \
X("rd_Road1A30", MI_ROADSFORROADBLOCKSEND, 0x5F5970) \
X("veg_tree1", MI_TREE1, 0x5F5974) \
X("veg_tree3", MI_TREE2, 0x5F5978) \
X("veg_treea1", MI_TREE3, 0x5F597C) \
X("veg_treenew01", MI_TREE4, 0x5F5980) \
X("veg_treenew05", MI_TREE5, 0x5F5984) \
X("veg_treeb1", MI_TREE6, 0x5F5988) \
X("veg_treenew10", MI_TREE7, 0x5F598C) \
X("veg_treea3", MI_TREE8, 0x5F5990) \
X("veg_treenew09", MI_TREE9, 0x5F5994) \
X("veg_treenew08", MI_TREE10, 0x5F5998) \
X("veg_treenew03", MI_TREE11, 0x5F599C) \
X("veg_treenew16", MI_TREE12, 0x5F59A0) \
X("veg_treenew17", MI_TREE13, 0x5F59A4) \
X("veg_treenew06", MI_TREE14, 0x5F59A8) \
X("doc_crane_cab", MODELID_CRANE_1, 0x5F59AC) \
X("cranetopb", MODELID_CRANE_2, 0x5F59B0) \
X("cranetopa", MODELID_CRANE_3, 0x5F59B4) \
X("package1", MI_COLLECTABLE1, 0x5F5A04) \
X("Money", MI_MONEY, 0x5F5A08) \
X("barrel1", MI_CARMINE, 0x5F5A0C) \
/*X("oddjgaragdoor", MI_GARAGEDOOR1, 0x5F5A10)*/ \
X("dk_paynspraydoor", MI_GARAGEDOOR2, 0x5F5A14) \
X("dk_waretankdoor1", MI_GARAGEDOOR3, 0x5F5A18) \
X("hav_garagedoor1", MI_GARAGEDOOR4, 0x5F5A1C) \
X("hav_garagedoor02", MI_GARAGEDOOR5, 0x5F5A20) \
X("hav_garagedoor03", MI_GARAGEDOOR6, 0x5F5A24) \
X("hav_garagedoor04", MI_GARAGEDOOR7, 0x5F5A28) \
X("lh_showdoor03", MI_GARAGEDOOR9, 0x5F5A2C) \
X("lh_showdoor1", MI_GARAGEDOOR10, 0x5F5A30) \
X("lhtankdoor", MI_GARAGEDOOR11, 0x5F5A34) \
X("nbtgardoor", MI_GARAGEDOOR12, 0x5F5A38) \
X("dk_camjonesdoor", MI_GARAGEDOOR13, 0x5F5A3C) \
X("nbtgardoor02", MI_GARAGEDOOR14, 0x5F5A40) \
X("dt_savedra", MI_GARAGEDOOR15, 0x5F5A44) \
X("dt_savedrb", MI_GARAGEDOOR16, 0x5F5A48) \
/*X("dk_bombdoor", MI_GARAGEDOOR17, 0x5F5A4C)*/ \
X("dk_bombdoor", MI_GARAGEDOOR18, 0x5F5A50) \
X("haiwshpnsdoor", MI_GARAGEDOOR19, 0x5F5A54) \
X("wshpnsdoor", MI_GARAGEDOOR20, 0x5F5A58) \
X("nbecpnsdoor", MI_GARAGEDOOR21, 0x5F5A5C) \
X("nbtgardoor03", MI_GARAGEDOOR22, 0x5F5A60) \
X("dt_savedrc", MI_GARAGEDOOR23, 0x5F5A64) \
X("dt_savedrd", MI_GARAGEDOOR24, 0x5F5A68) \
X("man_frntstepGD", MI_GARAGEDOOR25, 0x5F5A6C) \
X("svegrgedoor", MI_GARAGEDOOR26, 0x5F5A70) \
/*X("towergaragedoor3", MI_GARAGEDOOR27, 0x5F5A74)*/ \
/*X("plysve_gragedoor", MI_GARAGEDOOR28, 0x5F5A78)*/ \
/*X("impexpsubgrgdoor", MI_GARAGEDOOR29, 0x5F5A7C)*/ \
/*X("Sub_sprayshopdoor", MI_GARAGEDOOR30, 0x5F5A80)*/ \
/*X("ind_plyrwoor", MI_GARAGEDOOR31, 0x5F5A84)*/ \
/*X("8ballsuburbandoor", MI_GARAGEDOOR32, 0x5F5A88)*/ \
X("barrel2", MI_NAUTICALMINE, 0x5F5A8C) \
X("crushercrush", MI_CRUSHERBODY, 0x5F5A90) \
X("crushertop", MI_CRUSHERLID, 0x5F5A94) \
X("donkeymag", MI_DONKEYMAG, 0x5F5A98) \
X("bullion", MI_BULLION, 0x5F5A9C) \
X("floatpackge1", MI_FLOATPACKAGE1, 0x5F5AA0) \
X("briefcase", MI_BRIEFCASE, 0x5F5AA4) \
X("chinabanner1", MI_CHINABANNER1, 0x5F5AA8) \
X("chinabanner2", MI_CHINABANNER2, 0x5F5AAC) \
X("chinabanner3", MI_CHINABANNER3, 0x5F5AB0) \
X("chinabanner4", MI_CHINABANNER4, 0x5F5AB4) \
X("iten_chinatown5", MI_CHINABANNER5, 0x5F5AB8) \
X("iten_chinatown7", MI_CHINABANNER6, 0x5F5ABC) \
X("iten_chinatown3", MI_CHINABANNER7, 0x5F5AC0) \
X("iten_chinatown2", MI_CHINABANNER8, 0x5F5AC4) \
X("iten_chinatown4", MI_CHINABANNER9, 0x5F5AC8) \
X("iten_washline01", MI_CHINABANNER10, 0x5F5ACC) \
X("iten_washline02", MI_CHINABANNER11, 0x5F5AD0) \
X("iten_washline03", MI_CHINABANNER12, 0x5F5AD4) \
X("chinalanterns", MI_CHINALANTERN, 0x5F5AD8) \
X("glassfx1", MI_GLASS1, 0x5F5ADC) \
X("glassfx2", MI_GLASS2, 0x5F5AE0) \
X("glassfx3", MI_GLASS3, 0x5F5AE4) \
X("glassfx4", MI_GLASS4, 0x5F5AE8) \
X("glassfx55", MI_GLASS5, 0x5F5AEC) \
X("glassfxsub1", MI_GLASS6, 0x5F5AF0) \
X("glassfxsub2", MI_GLASS7, 0x5F5AF4) \
X("glassfx_composh", MI_GLASS8, 0x5F5AF8) \
X("bridge_liftsec", MI_BRIDGELIFT, 0x5F5AFC) \
X("bridge_liftweight", MI_BRIDGEWEIGHT, 0x5F5B00) \
X("subbridge_lift", MI_BRIDGEROADSEGMENT, 0x5F5B04) \
X("barrel4", MI_EXPLODINGBARREL, 0x5F5B08) \
X("flagsitaly", MI_ITALYBANNER1, 0x5F5B0C) \
X("adrenaline", MI_PICKUP_ADRENALINE, 0x5F5B10) \
X("bodyarmour", MI_PICKUP_BODYARMOUR, 0x5F5B14) \
X("info", MI_PICKUP_INFO, 0x5F5B18) \
X("health", MI_PICKUP_HEALTH, 0x5F5B1C) \
X("bonus", MI_PICKUP_BONUS, 0x5F5B20) \
X("bribe", MI_PICKUP_BRIBE, 0x5F5B24) \
X("killfrenzy", MI_PICKUP_KILLFRENZY, 0x5F5B28) \
X("camerapickup", MI_PICKUP_CAMERA, 0x5F5B2C) \
X("bollardlight", MI_BOLLARDLIGHT, 0x5F5B30) \
X("magnet", MI_MAGNET, 0x5F5B34) \
X("streetlamp1", MI_STREETLAMP1, 0x5F5B38) \
X("streetlamp2", MI_STREETLAMP2, 0x5F5B3C) \
X("railtrax_lo4b", MI_RAILTRACKS, 0x5F5B40) \
X("bar_barrier10", MI_FENCE, 0x5F5B44) \
X("bar_barrier12", MI_FENCE2, 0x5F5B48) \
X("petrolpump", MI_PETROLPUMP, 0x5F5B4C) \
X("bodycast", MI_BODYCAST, 0x5F5B50) \
X("backdoor", MI_BACKDOOR, 0x5F5B54) \
X("coffee", MI_COFFEE, 0x5F5B58) \
X("bouy", MI_BUOY, 0x5F5B5C) \
X("parktable1", MI_PARKTABLE, 0x5F5B60) \
X("sbwy_tunl_start", MI_SUBWAY1, 0x5F5B64) \
X("sbwy_tunl_bit", MI_SUBWAY2, 0x5F5B68) \
X("sbwy_tunl_bend", MI_SUBWAY3, 0x5F5B6C) \
X("sbwy_tunl_cstm6", MI_SUBWAY4, 0x5F5B70) \
X("sbwy_tunl_cstm7", MI_SUBWAY5, 0x5F5B74) \
X("sbwy_tunl_cstm8", MI_SUBWAY6, 0x5F5B78) \
X("sbwy_tunl_cstm10", MI_SUBWAY7, 0x5F5B7C) \
X("sbwy_tunl_cstm9", MI_SUBWAY8, 0x5F5B80) \
X("sbwy_tunl_cstm11", MI_SUBWAY9, 0x5F5B84) \
X("sbwy_tunl_cstm1", MI_SUBWAY10, 0x5F5B88) \
X("sbwy_tunl_cstm2", MI_SUBWAY11, 0x5F5B8C) \
X("sbwy_tunl_cstm4", MI_SUBWAY12, 0x5F5B90) \
X("sbwy_tunl_cstm3", MI_SUBWAY13, 0x5F5B94) \
X("sbwy_tunl_cstm5", MI_SUBWAY14, 0x5F5B98) \
X("subplatform_n2", MI_SUBWAY15, 0x5F5B9C) \
X("suby_tunl_start", MI_SUBWAY16, 0x5F5BA0) \
X("sbwy_tunl_start2", MI_SUBWAY17, 0x5F5BA4) \
X("indy_tunl_start", MI_SUBWAY18, 0x5F5BA8) \
X("indsubway03", MI_SUBPLATFORM_IND, 0x5F5BAC) \
X("comerside_subway", MI_SUBPLATFORM_COMS, 0x5F5BB0) \
X("subplatform", MI_SUBPLATFORM_COMS2, 0x5F5BB4) \
X("subplatform_n", MI_SUBPLATFORM_COMN, 0x5F5BB8) \
X("Otherside_subway", MI_SUBPLATFORM_SUB, 0x5F5BBC) \
X("subplatform_sub", MI_SUBPLATFORM_SUB2, 0x5F5BC0) \
X("files", MI_FILES, 0x5F5BC4) \
X("property_locked", MI_PICKUP_PROPERTY, 0x0) \
X("property_fsale", MI_PICKUP_PROPERTY_FORSALE, 0x0)
#define X(name, var, addr) extern int16 var;
MODELINDICES
#undef X
// and some hardcoded ones
// expand as needed
enum
{
MI_PLAYER = 0,
MI_COP,
MI_SWAT,
MI_FBI,
MI_ARMY,
MI_MEDIC,
MI_FIREMAN,
MI_MALE01,
MI_TAXI_D = 28, // HMOCA
MI_WFOGO = 63,
MI_WMOGO = 64,
MI_CBA = 83,
MI_CBB,
MI_HNA,
MI_HNB,
MI_SGA,
MI_SGB,
MI_CLA,
MI_CLB,
MI_GDA,
MI_GDB,
MI_BKA,
MI_BKB,
MI_PGA,
MI_PGB,
MI_VICE1,
MI_VICE2,
MI_VICE3,
MI_VICE4,
MI_VICE5,
MI_VICE6,
MI_VICE7,
MI_VICE8,
MI_WFYG2 = 106, // last regular ped
MI_SPECIAL01 = 109,
MI_SPECIAL21 = 129,
/*
MI_TAXI_D,
MI_PIMP,
MI_GANG01,
MI_GANG02,
MI_GANG03,
MI_GANG04,
MI_GANG05,
MI_GANG06,
MI_GANG07,
MI_GANG08,
MI_GANG09,
MI_GANG10,
MI_GANG11,
MI_GANG12,
MI_GANG13,
MI_GANG14,
MI_CRIMINAL01,
MI_CRIMINAL02,
MI_SPECIAL01,
MI_SPECIAL02,
MI_SPECIAL03,
MI_SPECIAL04,
MI_MALE02,
MI_MALE03,
MI_FATMALE01,
MI_FATMALE02,
MI_FEMALE01,
MI_FEMALE02,
MI_FEMALE03,
MI_FATFEMALE01,
MI_FATFEMALE02,
MI_PROSTITUTE,
MI_PROSTITUTE2,
MI_P_MAN1,
MI_P_MAN2,
MI_P_WOM1,
MI_P_WOM2,
MI_CT_MAN1,
MI_CT_MAN2,
MI_CT_WOM1,
MI_CT_WOM2,
MI_LI_MAN1,
MI_LI_MAN2,
MI_LI_WOM1,
MI_LI_WOM2,
MI_DOCKER1,
MI_DOCKER2,
MI_SCUM_MAN,
MI_SCUM_WOM,
MI_WORKER1,
MI_WORKER2,
MI_B_MAN1,
MI_B_MAN2,
MI_B_MAN3,
MI_B_WOM1,
MI_B_WOM2,
MI_B_WOM3,
MI_MOD_MAN,
MI_MOD_WOM,
MI_ST_MAN,
MI_ST_WOM,
MI_FAN_MAN1,
MI_FAN_MAN2,
MI_FAN_WOM,
MI_HOS_MAN,
MI_HOS_WOM,
MI_CONST1,
MI_CONST2,
MI_SHOPPER1,
MI_SHOPPER2,
MI_SHOPPER3,
MI_STUD_MAN,
MI_STUD_WOM,
MI_CAS_MAN,
MI_CAS_WOM,
MI_BUSKER1,
MI_BUSKER2,
MI_BUSKER3,
MI_BUSKER4,
// three more peds possible
*/
MI_FIRST_VEHICLE = 130,
MI_LANDSTAL = MI_FIRST_VEHICLE,
MI_IDAHO,
MI_STINGER,
MI_LINERUN,
MI_PEREN,
MI_SENTINEL,
MI_RIO,
MI_FIRETRUCK,
MI_TRASH,
MI_STRETCH,
MI_MANANA,
MI_INFERNUS,
MI_VOODOO,
MI_PONY,
MI_MULE,
MI_CHEETAH,
MI_AMBULAN,
MI_FBICAR,
MI_MOONBEAM,
MI_ESPERANT,
MI_TAXI,
MI_WASHING,
MI_BOBCAT,
MI_MRWHOOP,
MI_BFINJECT,
MI_HUNTER,
MI_POLICE,
MI_ENFORCER,
MI_SECURICA,
MI_BANSHEE,
MI_PREDATOR,
MI_BUS,
MI_RHINO,
MI_BARRACKS,
MI_CUBAN,
MI_CHOPPER,
MI_ANGEL,
MI_COACH,
MI_CABBIE,
MI_STALLION,
MI_RUMPO,
MI_RCBANDIT,
MI_ROMERO,
MI_PACKER,
MI_SENTXS,
MI_ADMIRAL,
MI_SQUALO,
MI_SEASPAR,
MI_PIZZABOY,
MI_GANGBUR,
MI_AIRTRAIN,
MI_DEADDODO,
MI_SPEEDER,
MI_REEFER,
MI_TROPIC,
MI_FLATBED,
MI_YANKEE,
MI_CADDY,
MI_ZEBRA,
MI_TOPFUN,
MI_SKIMMER,
MI_PCJ600,
MI_FAGGIO,
MI_FREEWAY,
MI_RCBARON,
MI_RCRAIDER,
MI_GLENDALE,
MI_OCEANIC,
MI_SANCHEZ,
MI_SPARROW,
MI_PATRIOT,
MI_LOVEFIST,
MI_COASTG,
MI_DINGHY,
MI_HERMES,
MI_SABRE,
MI_SABRETUR,
MI_PHEONIX,
MI_WALTON,
MI_REGINA,
MI_COMET,
MI_DELUXO,
MI_BURRITO,
MI_SPAND,
MI_MARQUIS,
MI_BAGGAGE,
MI_KAUFMAN,
MI_MAVERICK,
MI_VCNMAV,
MI_RANCHER,
MI_FBIRANCH,
MI_VIRGO,
MI_GREENWOO,
MI_JETMAX,
MI_HOTRING,
MI_SANDKING,
MI_BLISTAC,
MI_POLMAV,
MI_BOXVILLE,
MI_BENSON,
MI_MESA,
MI_RCGOBLIN,
MI_HOTRINA,
MI_HOTRINB,
MI_BLOODRA,
MI_BLOODRB,
MI_VICECHEE,
// HACK
MI_TRAIN = -1,
MI_DODO = -2,
MI_NIGHTSTICK = 262,
MI_BASEBALL_BAT = 264,
MI_GRENADE = 270,
MI_MOLOTOV = 272,
MI_MISSILE = 273,
MI_COLT = 274,
MI_AK47 = 276,
MI_SHOTGUN = 279,
MI_M16 = 280,
MI_TEC9 = 281,
MI_UZI = 282,
MI_SILENCEDINGRAM = 283,
MI_MP5 = 284,
MI_SNIPER = 285,
MI_ROCKETLAUNCHER = 287,
MI_FLAMETHROWER = 288,
MI_BOMB = 291,
MI_FINGERS = 293,
MI_CUTOBJ01 = 295,
MI_CUTOBJ02,
MI_CUTOBJ03,
MI_CUTOBJ04,
MI_CUTOBJ05,
MI_CAR_DOOR = 240,
MI_CAR_BUMPER,
MI_CAR_PANEL,
MI_CAR_BONNET,
MI_CAR_BOOT,
MI_CAR_WHEEL,
MI_BODYPARTA,
MI_BODYPARTB,
MI_AIRTRAIN_VLO = 257,
// MI_LOPOLYGUY,
NUM_DEFAULT_MODELS = 300 // MIAMI
};
enum{
NUM_OF_SPECIAL_CHARS = 4,
NUM_OF_CUTSCENE_OBJECTS = 5
};
void InitModelIndices(void);
void MatchModelString(const char *name, int16 id);
void TestModelIndices(void);
inline bool
IsGlass(int16 id)
{
CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(id);
return mi->IsBuilding() && (mi->m_isCodeGlass || mi->m_isArtistGlass);
}
inline bool
IsTrafficLight(int16 id)
{
return id == MI_TRAFFICLIGHTS ||
id == MI_SINGLESTREETLIGHTS1 ||
id == MI_SINGLESTREETLIGHTS2 ||
id == MI_SINGLESTREETLIGHTS3 ||
id == MI_DOUBLESTREETLIGHTS;
}
inline bool
IsBodyPart(int16 id)
{
return id == MI_BODYPARTA || id == MI_BODYPARTB;
}
// This is bad and should perhaps not be used
/*
inline bool
IsBoatModel(int16 id)
{
return id == MI_PREDATOR ||
id == MI_REEFER ||
id == MI_SPEEDER ||
id == MI_GHOST;
}
*/
inline bool
IsPedModel(int16 id)
{
return id >= 0 && id <= 89;
}
inline bool
IsTreeModel(int16 id)
{
return id == MI_TREE1 ||
id == MI_TREE2 ||
id == MI_TREE3 ||
id == MI_TREE4 ||
id == MI_TREE5 ||
id == MI_TREE6 ||
id == MI_TREE7 ||
id == MI_TREE8 ||
id == MI_TREE9 ||
id == MI_TREE10 ||
id == MI_TREE11 ||
id == MI_TREE12 ||
id == MI_TREE13 ||
id == MI_TREE14;
}
inline bool
IsBannerModel(int16 id)
{
return id == MI_CHINABANNER1 ||
id == MI_CHINABANNER2 ||
id == MI_CHINABANNER3 ||
id == MI_CHINABANNER4 ||
id == MI_CHINABANNER5 ||
id == MI_CHINABANNER6 ||
id == MI_CHINABANNER7 ||
id == MI_CHINABANNER8 ||
id == MI_CHINABANNER9 ||
id == MI_CHINABANNER10 ||
id == MI_CHINABANNER11 ||
id == MI_CHINABANNER12 ||
id == MI_ITALYBANNER1 ||
id == MI_CHINALANTERN;
}
inline bool
IsPolicePedModel(int16 id)
{
return id == MI_COP ||
id == MI_SWAT ||
id == MI_FBI ||
id == MI_ARMY;
}
inline bool
IsPoliceVehicleModel(int16 id)
{
return id == MI_CHOPPER ||
id == MI_PREDATOR ||
id == MI_POLICE ||
id == MI_ENFORCER;
}
inline bool
IsExplosiveThingModel(int16 id)
{
return id == MI_EXPLODINGBARREL ||
id == MI_PETROLPUMP;
}
inline bool
IsFence(int16 id)
{
return id == MI_FENCE ||
id == MI_FENCE2;
}