diff --git a/reaction/ChangeLog b/reaction/ChangeLog index 6a894a3e..cfc04667 100644 --- a/reaction/ChangeLog +++ b/reaction/ChangeLog @@ -1,5 +1,7 @@ # List fixes here for the 2.3 release +* Added replacement model functionality for weapons and items +* Added replacement skin functionality for weapons and items * Fixed the HC's power. * Items from the weapon/item menus are now disabled if they're banned from the server * Added Itembanning diff --git a/reaction/Makefile b/reaction/Makefile index 92cd4d3d..75fe2eca 100755 --- a/reaction/Makefile +++ b/reaction/Makefile @@ -193,7 +193,7 @@ makedirs: @if [ ! -d $(BQ)/$(UIDIRNAME) ];then mkdir $(BQ)/$(UIDIRNAME);fi ctags: - ctags -f tags -R * +# ctags -f tags -R * # --object lists for each build type-- GQVMOBJ = $(GOBJ:%.o=$(BQ)/%.asm) diff --git a/reaction/cgame/cg_ents.c b/reaction/cgame/cg_ents.c index 7c19e041..7118fde7 100644 --- a/reaction/cgame/cg_ents.c +++ b/reaction/cgame/cg_ents.c @@ -5,6 +5,9 @@ //----------------------------------------------------------------------------- // // $Log$ +// Revision 1.35 2003/02/01 02:15:31 jbravo +// Replacement models and items +// // Revision 1.34 2003/01/08 04:46:25 jbravo // Wrote a new hackish model replacement system // @@ -339,6 +342,7 @@ static void CG_Item(centity_t * cent) int msec; float frac, scale; weaponInfo_t *wi; + itemInfo_t *itemInfo; es = ¢->currentState; if (es->modelindex >= bg_numItems) { @@ -452,6 +456,18 @@ static void CG_Item(centity_t * cent) VectorCopy(myvec, ent.axis[2]); } } + // JBravo: world skins + if (item->giType == IT_WEAPON) { + wi = &cg_weapons[item->giTag]; + if (wi->customSkin) + ent.customSkin = wi->customSkin; + } + if (item->giType == IT_HOLDABLE) { + itemInfo = &cg_items[item - bg_itemlist]; + if (itemInfo->customSkin) + ent.customSkin = itemInfo->customSkin; + } + //Elder: ammo offset? if (item->giType == IT_AMMO) cent->lerpOrigin[2] -= 12; @@ -550,8 +566,6 @@ static void CG_Missile(centity_t * cent) entityState_t *s1; const weaponInfo_t *weapon; -// int col; - s1 = ¢->currentState; if (s1->weapon > WP_NUM_WEAPONS) { s1->weapon = 0; @@ -565,23 +579,6 @@ static void CG_Missile(centity_t * cent) if (weapon->missileTrailFunc) { weapon->missileTrailFunc(cent, weapon); } -/* - if ( cent->currentState.modelindex == TEAM_RED ) { - col = 1; - } - else if ( cent->currentState.modelindex == TEAM_BLUE ) { - col = 2; - } - else { - col = 0; - } - - // add dynamic light - if ( weapon->missileDlight ) { - trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, - weapon->missileDlightColor[col][0], weapon->missileDlightColor[col][1], weapon->missileDlightColor[col][2] ); - } -*/ // add dynamic light if (weapon->missileDlight) { trap_R_AddLightToScene(cent->lerpOrigin, weapon->missileDlight, @@ -600,16 +597,6 @@ static void CG_Missile(centity_t * cent) memset(&ent, 0, sizeof(ent)); VectorCopy(cent->lerpOrigin, ent.origin); VectorCopy(cent->lerpOrigin, ent.oldorigin); -//Blaze: No Plasma Gun -/* if ( cent->currentState.weapon == WP_PLASMAGUN ) { - ent.reType = RT_SPRITE; - ent.radius = 16; - ent.rotation = 0; - ent.customShader = cgs.media.plasmaBallShader; - trap_R_AddRefEntityToScene( &ent ); - return; - } -*/ // flicker between two skins ent.skinNum = cg.clientFrame & 1; diff --git a/reaction/cgame/cg_local.h b/reaction/cgame/cg_local.h index 0ede95e3..a701ceb7 100644 --- a/reaction/cgame/cg_local.h +++ b/reaction/cgame/cg_local.h @@ -5,6 +5,9 @@ //----------------------------------------------------------------------------- // // $Log$ +// Revision 1.133 2003/02/01 02:15:31 jbravo +// Replacement models and items +// // Revision 1.132 2002/12/05 23:11:29 blaze // Added item replacement code // @@ -743,6 +746,7 @@ typedef struct weaponInfo_s { qhandle_t weaponModel; // Third-person/world model qhandle_t barrelModel; qhandle_t flashModel; + qhandle_t customSkin; // JBravo: for custom skins qhandle_t firstModel; //Elder: view model qhandle_t animHandModel; //Blaze: for animations @@ -789,6 +793,8 @@ typedef struct { qboolean registered; qhandle_t models[MAX_ITEM_MODELS]; qhandle_t icon; +// JBravo: for customskins + qhandle_t customSkin; } itemInfo_t; typedef struct { @@ -1697,6 +1703,16 @@ extern vmCvar_t cg_RQ3_handcannon; extern vmCvar_t cg_RQ3_m3; extern vmCvar_t cg_RQ3_akimbo; extern vmCvar_t cg_RQ3_grenade; +// JBravo: replacement skins +extern vmCvar_t cg_RQ3_knife_skin; +extern vmCvar_t cg_RQ3_mk23_skin; +extern vmCvar_t cg_RQ3_m4_skin; +extern vmCvar_t cg_RQ3_ssg3000_skin; +extern vmCvar_t cg_RQ3_mp5_skin; +extern vmCvar_t cg_RQ3_handcannon_skin; +extern vmCvar_t cg_RQ3_m3_skin; +extern vmCvar_t cg_RQ3_akimbo_skin; +extern vmCvar_t cg_RQ3_grenade_skin; //Blaze: replacement items extern vmCvar_t cg_RQ3_bandolier; extern vmCvar_t cg_RQ3_kevlar; @@ -1704,6 +1720,13 @@ extern vmCvar_t cg_RQ3_silencer; extern vmCvar_t cg_RQ3_laser; extern vmCvar_t cg_RQ3_slippers; extern vmCvar_t cg_RQ3_helmet; +// JBravo: replacement skins +extern vmCvar_t cg_RQ3_bandolier_skin; +extern vmCvar_t cg_RQ3_kevlar_skin; +extern vmCvar_t cg_RQ3_silencer_skin; +extern vmCvar_t cg_RQ3_laser_skin; +extern vmCvar_t cg_RQ3_slippers_skin; +extern vmCvar_t cg_RQ3_helmet_skin; //Blaze: Reaction weapon positions diff --git a/reaction/cgame/cg_main.c b/reaction/cgame/cg_main.c index 05d8323c..d340e318 100644 --- a/reaction/cgame/cg_main.c +++ b/reaction/cgame/cg_main.c @@ -5,6 +5,9 @@ //----------------------------------------------------------------------------- // // $Log$ +// Revision 1.118 2003/02/01 02:15:31 jbravo +// Replacement models and items +// // Revision 1.117 2003/01/08 04:46:26 jbravo // Wrote a new hackish model replacement system // @@ -414,7 +417,16 @@ vmCvar_t cg_RQ3_handcannon; vmCvar_t cg_RQ3_m3; vmCvar_t cg_RQ3_akimbo; vmCvar_t cg_RQ3_grenade; - +// JBravo: replacement skin cvars +vmCvar_t cg_RQ3_knife_skin; +vmCvar_t cg_RQ3_mk23_skin; +vmCvar_t cg_RQ3_m4_skin; +vmCvar_t cg_RQ3_ssg3000_skin; +vmCvar_t cg_RQ3_mp5_skin; +vmCvar_t cg_RQ3_handcannon_skin; +vmCvar_t cg_RQ3_m3_skin; +vmCvar_t cg_RQ3_akimbo_skin; +vmCvar_t cg_RQ3_grenade_skin; //Blaze: replacement items vmCvar_t cg_RQ3_bandolier; vmCvar_t cg_RQ3_kevlar; @@ -422,6 +434,13 @@ vmCvar_t cg_RQ3_silencer; vmCvar_t cg_RQ3_laser; vmCvar_t cg_RQ3_slippers; vmCvar_t cg_RQ3_helmet; +// JBravo: replacement skin cvars +vmCvar_t cg_RQ3_bandolier_skin; +vmCvar_t cg_RQ3_kevlar_skin; +vmCvar_t cg_RQ3_silencer_skin; +vmCvar_t cg_RQ3_laser_skin; +vmCvar_t cg_RQ3_slippers_skin; +vmCvar_t cg_RQ3_helmet_skin; //Elder: muzzle flash toggle @@ -660,6 +679,16 @@ static cvarTable_t cvarTable[] = { // bk001129 {&cg_RQ3_m3, "cg_RQ3_m3", "m3", CVAR_ARCHIVE}, {&cg_RQ3_akimbo, "cg_RQ3_akimbo", "akimbo", CVAR_ARCHIVE}, {&cg_RQ3_grenade, "cg_RQ3_grenade", "grenade", CVAR_ARCHIVE}, + // JBravo: replacement skins + {&cg_RQ3_knife_skin, "cg_RQ3_knife_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_mk23_skin, "cg_RQ3_mk23_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_m4_skin, "cg_RQ3_m4_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_ssg3000_skin, "cg_RQ3_ssg3000_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_mp5_skin, "cg_RQ3_mp5_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_handcannon_skin, "cg_RQ3_handcannon_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_m3_skin, "cg_RQ3_m3_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_akimbo_skin, "cg_RQ3_akimbo_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_grenade_skin, "cg_RQ3_grenade_skin", "default", CVAR_ARCHIVE}, //Blaze: replacement items {&cg_RQ3_bandolier, "cg_RQ3_bandolier", "bandolier", CVAR_ARCHIVE}, @@ -668,6 +697,13 @@ static cvarTable_t cvarTable[] = { // bk001129 {&cg_RQ3_laser, "cg_RQ3_laser", "laser", CVAR_ARCHIVE}, {&cg_RQ3_slippers, "cg_RQ3_slippers", "slippers", CVAR_ARCHIVE}, {&cg_RQ3_helmet, "cg_RQ3_helmet", "helmet", CVAR_ARCHIVE}, + // JBravo: replacement skins + {&cg_RQ3_bandolier_skin, "cg_RQ3_bandolier_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_kevlar_skin, "cg_RQ3_kevlar_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_silencer_skin, "cg_RQ3_silencer_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_laser_skin, "cg_RQ3_laser_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_slippers_skin, "cg_RQ3_slippers_skin", "default", CVAR_ARCHIVE}, + {&cg_RQ3_helmet_skin, "cg_RQ3_helmet_skin", "default", CVAR_ARCHIVE}, // the following variables are created in other parts of the system, // but we also reference them here @@ -1901,13 +1937,13 @@ static void CG_RegisterGraphics(void) cgs.media.akimboHandModel = trap_R_RegisterModel("models/weapons2/akimbo/akimbo_hand.md3"); //Elder: item cache - cgs.media.rq3_bandolierModel = trap_R_RegisterModel(va("models/items/%s.md3",cg_RQ3_bandolier.string)); - cgs.media.rq3_kevlarModel = trap_R_RegisterModel(va("models/items/%s.md3",cg_RQ3_kevlar.string)); - cgs.media.rq3_silencerModel = trap_R_RegisterModel(va("models/items/%s.md3",cg_RQ3_silencer.string)); + cgs.media.rq3_bandolierModel = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_bandolier.string)); + cgs.media.rq3_kevlarModel = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_kevlar.string)); + cgs.media.rq3_silencerModel = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_silencer.string)); cgs.media.rq3_laserModel = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_laser.string)); - cgs.media.rq3_slippersModel = trap_R_RegisterModel(va("models/items/%s.md3",cg_RQ3_slippers.string)); + cgs.media.rq3_slippersModel = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_slippers.string)); // JBravo: adding the helmet - cgs.media.rq3_helmetModel = trap_R_RegisterModel(va("models/items/%s.md3",cg_RQ3_helmet.string)); + cgs.media.rq3_helmetModel = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_helmet.string)); cgs.media.smoke2 = trap_R_RegisterModel("models/weapons2/shells/s_shell.md3"); @@ -2263,8 +2299,55 @@ void CG_ReplaceModels(void) strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); } } + if (!strcmp(item->classname, "item_kevlar")) { + Com_sprintf(newname, MAX_QPATH, "models/items/%s.md3", cg_RQ3_kevlar.string); + Com_sprintf(newicon, MAX_QPATH, "icons/iconi_%s", cg_RQ3_kevlar.string); + if (JB_FileExists(newname) && (strlen(newname) < 59)) { + strcpy(bg_itemlist[item - bg_itemlist].world_model[0], newname); + strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); + } + } + if (!strcmp(item->classname, "item_silencer")) { + Com_sprintf(newname, MAX_QPATH, "models/items/%s.md3", cg_RQ3_silencer.string); + Com_sprintf(newicon, MAX_QPATH, "icons/iconi_%s", cg_RQ3_silencer.string); + if (JB_FileExists(newname) && (strlen(newname) < 59)) { + strcpy(bg_itemlist[item - bg_itemlist].world_model[0], newname); + strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); + } + } + if (!strcmp(item->classname, "item_laser")) { + Com_sprintf(newname, MAX_QPATH, "models/items/%s.md3", cg_RQ3_laser.string); + Com_sprintf(newicon, MAX_QPATH, "icons/iconi_%s", cg_RQ3_laser.string); + if (JB_FileExists(newname) && (strlen(newname) < 59)) { + strcpy(bg_itemlist[item - bg_itemlist].world_model[0], newname); + strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); + } + } + if (!strcmp(item->classname, "item_bandolier")) { + Com_sprintf(newname, MAX_QPATH, "models/items/%s.md3", cg_RQ3_bandolier.string); + Com_sprintf(newicon, MAX_QPATH, "icons/iconi_%s", cg_RQ3_bandolier.string); + if (JB_FileExists(newname) && (strlen(newname) < 59)) { + strcpy(bg_itemlist[item - bg_itemlist].world_model[0], newname); + strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); + } + } + if (!strcmp(item->classname, "item_slippers")) { + Com_sprintf(newname, MAX_QPATH, "models/items/%s.md3", cg_RQ3_slippers.string); + Com_sprintf(newicon, MAX_QPATH, "icons/iconi_%s", cg_RQ3_slippers.string); + if (JB_FileExists(newname) && (strlen(newname) < 59)) { + strcpy(bg_itemlist[item - bg_itemlist].world_model[0], newname); + strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); + } + } + if (!strcmp(item->classname, "item_helmet")) { + Com_sprintf(newname, MAX_QPATH, "models/items/%s.md3", cg_RQ3_helmet.string); + Com_sprintf(newicon, MAX_QPATH, "icons/iconi_%s", cg_RQ3_helmet.string); + if (JB_FileExists(newname) && (strlen(newname) < 59)) { + strcpy(bg_itemlist[item - bg_itemlist].world_model[0], newname); + strcpy(bg_itemlist[item - bg_itemlist].icon, newicon); + } + } } - } /* diff --git a/reaction/cgame/cg_weapons.c b/reaction/cgame/cg_weapons.c index 2b5e4ac9..db8a5a50 100644 --- a/reaction/cgame/cg_weapons.c +++ b/reaction/cgame/cg_weapons.c @@ -5,6 +5,9 @@ //----------------------------------------------------------------------------- // // $Log$ +// Revision 1.103 2003/02/01 02:15:31 jbravo +// Replacement models and items +// // Revision 1.102 2003/01/08 04:46:26 jbravo // Wrote a new hackish model replacement system // @@ -201,12 +204,8 @@ Reads information for frame-sound timing static qboolean CG_ParseWeaponSoundFile(const char *filename, weaponInfo_t * weapon) { char *text_p; - int len; - int i; + int len, i, skip; char *token; - -// float fps; - int skip; // Elder: What's this for? char text[20000]; fileHandle_t f; sfxWeapTiming_t *weapTiming; @@ -238,26 +237,20 @@ static qboolean CG_ParseWeaponSoundFile(const char *filename, weaponInfo_t * wea break; // Add it to the array if (atoi(token)) { - //Com_Printf("(%i): %s\n", i, token); weapTiming->sfxInfo[i].frame = atoi(token); } else break; - //return qfalse; // Grab sound file path token = COM_Parse(&text_p); if (!token) break; - //return qfalse; - //Com_Printf("(%i): %s\n", i, token); weapTiming->sfxInfo[i].sound = trap_S_RegisterSound(token, qfalse); } // Store total number weapTiming->numFrames = i; - //Com_Printf("Total Frames: %i\n", weapTiming->numFrames); - return qtrue; } @@ -308,11 +301,8 @@ CG_ParseWeaponAnimFile */ static qboolean CG_ParseWeaponAnimFile(const char *filename, weaponInfo_t * weapon) { - char *text_p; - int len; - int i; - int skip; - char *token; + char *text_p, *token; + int len, i, skip; float fps; char text[20000]; fileHandle_t f; @@ -436,15 +426,12 @@ localEntity_t *CG_ShotgunEjectBrass(centity_t * cent) if (cg_brassTime.integer <= 0) { return NULL; } - //for ( i = 0; i < isHC + 1; i++ ) { le = CG_AllocLocalEntity(); re = &le->refEntity; - le->leType = LE_FRAGMENT; le->startTime = cg.time; le->endTime = le->startTime + cg_brassTime.integer * 3 + cg_brassTime.integer * random(); - le->pos.trType = TR_GRAVITY; le->pos.trTime = cg.time; @@ -456,18 +443,15 @@ localEntity_t *CG_ShotgunEjectBrass(centity_t * cent) re->hModel = cgs.media.shotgunBrassModel; le->bounceFactor = 0.3f; - le->angles.trType = TR_LINEAR; le->angles.trTime = cg.time; - le->angles.trDelta[0] = rand() % 200 - 100; le->angles.trDelta[1] = rand() % 200 - 100; le->angles.trDelta[2] = rand() % 200 - 100; - le->leFlags = LEF_TUMBLE; le->leBounceSoundType = LEBS_BRASS; le->leMarkType = LEMT_NONE; - //} + return le; } @@ -481,7 +465,6 @@ void CG_RailTrail(clientInfo_t * ci, vec3_t start, vec3_t end) vec3_t axis[36], move, move2, next_move, vec, temp; float len; int i, j, skip; - localEntity_t *le; refEntity_t *re; @@ -500,12 +483,10 @@ void CG_RailTrail(clientInfo_t * ci, vec3_t start, vec3_t end) le = CG_AllocLocalEntity(); re = &le->refEntity; - le->leType = LE_FADE_RGB; le->startTime = cg.time; le->endTime = cg.time + cg_railTrailTime.value; le->lifeRate = 1.0 / (le->endTime - le->startTime); - re->shaderTime = cg.time / 1000.0f; re->reType = RT_RAIL_CORE; re->customShader = cgs.media.railCoreShader; @@ -517,7 +498,6 @@ void CG_RailTrail(clientInfo_t * ci, vec3_t start, vec3_t end) re->shaderRGBA[1] = ci->color1[1] * 255; re->shaderRGBA[2] = ci->color1[2] * 255; re->shaderRGBA[3] = 255; - le->color[0] = ci->color1[0] * 0.75; le->color[1] = ci->color1[1] * 0.75; le->color[2] = ci->color1[2] * 0.75; @@ -548,22 +528,18 @@ void CG_RailTrail(clientInfo_t * ci, vec3_t start, vec3_t end) le->startTime = cg.time; le->endTime = cg.time + (i >> 1) + 600; le->lifeRate = 1.0 / (le->endTime - le->startTime); - re->shaderTime = cg.time / 1000.0f; re->reType = RT_SPRITE; re->radius = 1.1f; re->customShader = cgs.media.railRingsShader; - re->shaderRGBA[0] = ci->color2[0] * 255; re->shaderRGBA[1] = ci->color2[1] * 255; re->shaderRGBA[2] = ci->color2[2] * 255; re->shaderRGBA[3] = 255; - le->color[0] = ci->color2[0] * 0.75; le->color[1] = ci->color2[1] * 0.75; le->color[2] = ci->color2[2] * 0.75; le->color[3] = 1.0f; - le->pos.trType = TR_LINEAR; le->pos.trTime = cg.time; @@ -739,6 +715,15 @@ void CG_RegisterWeapon(int weaponNum) MAKERGB(weaponInfo->flashDlightColor, 1, 1, 0); weaponInfo->flashSound[0] = trap_S_RegisterSound("sound/weapons/mk23/mk23fire.wav", qfalse); weaponInfo->worldReloadSound[0] = trap_S_RegisterSound("sound/weapons/mk23/mk23reload.wav", qfalse); + // JBravo: skin replacements + if (strcmp(cg_RQ3_mk23_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_mk23.string, cg_RQ3_mk23_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_mk23.string, cg_RQ3_mk23_skin.string)); + } + } weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader("bulletExplosion"); @@ -765,7 +750,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->flashSound[0] = trap_S_RegisterSound("sound/weapons/knife/slash.wav", qfalse); weaponInfo->missileModel = trap_R_RegisterModel(va("models/weapons2/%s/knife.md3", cg_RQ3_knife.string)); - + // JBravo: skin replacements + if (strcmp(cg_RQ3_knife_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_knife.string, cg_RQ3_knife_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_knife.string, cg_RQ3_knife_skin.string)); + } + } // Load the animation information Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_knife.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { @@ -781,7 +774,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->worldReloadSound[0] = trap_S_RegisterSound("sound/weapons/m4/m4reload.wav", qfalse); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader("bulletExplosion"); - + // JBravo: skin replacements + if (strcmp(cg_RQ3_m4_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_m4.string, cg_RQ3_m4_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_m4.string, cg_RQ3_m4_skin.string)); + } + } Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_m4.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { Com_Printf("Failed to load weapon animation file %s\n", filename); @@ -808,6 +809,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->worldReloadSound[2] = trap_S_RegisterSound("sound/weapons/ssg3000/ssgbolt.wav", qfalse); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader("bulletExplosion"); + // JBravo: skin replacements + if (strcmp(cg_RQ3_ssg3000_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_ssg3000.string, cg_RQ3_ssg3000_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_ssg3000.string, cg_RQ3_ssg3000_skin.string)); + } + } Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_ssg3000.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { Com_Printf("Failed to load weapon animation file %s\n", filename); @@ -830,7 +840,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->worldReloadSound[0] = trap_S_RegisterSound("sound/weapons/mp5/mp5reload.wav", qfalse); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader("bulletExplosion"); - + // JBravo: skin replacements + if (strcmp(cg_RQ3_mp5_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_mp5.string, cg_RQ3_mp5_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_mp5.string, cg_RQ3_mp5_skin.string)); + } + } Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_mp5.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { Com_Printf("Failed to load weapon animation file %s\n", filename); @@ -855,7 +873,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->worldReloadSound[0] = trap_S_RegisterSound("sound/weapons/handcannon/hcreload.wav", qfalse); weaponInfo->ejectBrassFunc = CG_ShotgunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader("bulletExplosion"); - + // JBravo: skin replacements + if (strcmp(cg_RQ3_handcannon_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_handcannon.string, cg_RQ3_handcannon_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_handcannon.string, cg_RQ3_handcannon_skin.string)); + } + } Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_handcannon.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { Com_Printf("Failed to load weapon animation file %s\n", filename); @@ -879,7 +905,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->flashSound[0] = trap_S_RegisterSound("sound/weapons/m3/m3fire.wav", qfalse); weaponInfo->worldReloadSound[1] = trap_S_RegisterSound("sound/weapons/m3/m3in.wav", qfalse); weaponInfo->ejectBrassFunc = CG_ShotgunEjectBrass; - + // JBravo: skin replacements + if (strcmp(cg_RQ3_m3_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_m3.string, cg_RQ3_m3_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_m3.string, cg_RQ3_m3_skin.string)); + } + } Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_m3.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { Com_Printf("Failed to load weapon animation file %s\n", filename); @@ -905,6 +939,15 @@ void CG_RegisterWeapon(int weaponNum) weaponInfo->worldReloadSound[0] = trap_S_RegisterSound("sound/weapons/akimbo/akimboreload.wav", qfalse); weaponInfo->ejectBrassFunc = CG_MachineGunEjectBrass; cgs.media.bulletExplosionShader = trap_R_RegisterShader("bulletExplosion"); + // JBravo: skin replacements + if (strcmp(cg_RQ3_akimbo_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_akimbo.string, cg_RQ3_akimbo_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_akimbo.string, cg_RQ3_akimbo_skin.string)); + } + } Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_akimbo.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { Com_Printf("Failed to load weapon animation file %s\n", filename); @@ -930,7 +973,15 @@ void CG_RegisterWeapon(int weaponNum) MAKERGB(weaponInfo->flashDlightColor, 1, 0.70f, 0); //Blaze: Make sure we load this as we may have exploding crates //cgs.media.grenadeExplosionShader = trap_R_RegisterShader( "grenadeExplosion" ); - + // JBravo: skin replacements + if (strcmp(cg_RQ3_grenade_skin.string, "default")) { + weaponInfo->customSkin = trap_R_RegisterSkin (va("models/weapons2/%s/%s.skin", + cg_RQ3_grenade.string, cg_RQ3_grenade_skin.string)); + if (!weaponInfo->customSkin) { + Com_Printf("Weapon skin load failure: %s\n", va("models/weapons2/%s/%s.skin", + cg_RQ3_grenade.string, cg_RQ3_grenade_skin.string)); + } + } // Load the animation information Com_sprintf(filename, sizeof(filename), "models/weapons2/%s/animation.cfg", cg_RQ3_grenade.string); if (!CG_ParseWeaponAnimFile(filename, weaponInfo)) { @@ -974,54 +1025,64 @@ void CG_RegisterItemVisuals(int itemNum) memset(itemInfo, 0, sizeof(&itemInfo)); itemInfo->registered = qtrue; - if (item->giType == IT_HOLDABLE) { - if (item->giTag == HI_KEVLAR) { - itemInfo->models[0] = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_kevlar.string)); - } - if (item->giTag == HI_LASER) { - itemInfo->models[0] = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_laser.string)); - } - if (item->giTag == HI_SILENCER) { - itemInfo->models[0] = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_silencer.string)); - } - if (item->giTag == HI_BANDOLIER) { - itemInfo->models[0] = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_bandolier.string)); - } - if (item->giTag == HI_SLIPPERS) { - itemInfo->models[0] = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_slippers.string)); - } - if (item->giTag == HI_HELMET) { - itemInfo->models[0] = trap_R_RegisterModel(va("models/items/%s.md3", cg_RQ3_helmet.string)); - } - } else { - itemInfo->models[0] = trap_R_RegisterModel(item->world_model[0]); - } - if (item->giType == IT_HOLDABLE) { - if (item->giTag == HI_KEVLAR) { - itemInfo->icon = trap_R_RegisterShader(va("icons/iconi_%s", cg_RQ3_kevlar.string)); - } - if (item->giTag == HI_LASER) { - itemInfo->icon = trap_R_RegisterShader(va("icons/iconi_%s", cg_RQ3_laser.string)); - } - if (item->giTag == HI_SILENCER) { - itemInfo->icon = trap_R_RegisterShader(va("icons/iconi_%s", cg_RQ3_silencer.string)); - } - if (item->giTag == HI_BANDOLIER) { - itemInfo->icon = trap_R_RegisterShader(va("icons/iconi_%s", cg_RQ3_bandolier.string)); - } - if (item->giTag == HI_SLIPPERS) { - itemInfo->icon = trap_R_RegisterShader(va("icons/iconi_%s", cg_RQ3_slippers.string)); - } - if (item->giTag == HI_HELMET) { - itemInfo->icon = trap_R_RegisterShader(va("icons/iconi_%s", cg_RQ3_helmet.string)); - } - } else { - itemInfo->icon = trap_R_RegisterShader(item->icon); - } + itemInfo->models[0] = trap_R_RegisterModel(item->world_model[0]); + itemInfo->icon = trap_R_RegisterShader(item->icon); if (item->giType == IT_WEAPON) { CG_RegisterWeapon(item->giTag); } +// JBravo: replacement skins for items + if (item->giType == IT_HOLDABLE) { + if (!strcmp(item->classname, "item_kevlar") && strcmp(cg_RQ3_kevlar_skin.string, "default")) { + itemInfo->customSkin = trap_R_RegisterSkin (va("models/items/%s/%s.skin", + cg_RQ3_kevlar.string, cg_RQ3_kevlar_skin.string)); + if (!itemInfo->customSkin) { + Com_Printf("Item skin load failure: %s\n", va("models/items/%s/%s.skin", + cg_RQ3_kevlar.string, cg_RQ3_kevlar_skin.string)); + } + } + if (!strcmp(item->classname, "item_silencer") && strcmp(cg_RQ3_silencer_skin.string, "default")) { + itemInfo->customSkin = trap_R_RegisterSkin (va("models/items/%s/%s.skin", + cg_RQ3_silencer.string, cg_RQ3_silencer_skin.string)); + if (!itemInfo->customSkin) { + Com_Printf("Item skin load failure: %s\n", va("models/items/%s/%s.skin", + cg_RQ3_kevlar.string, cg_RQ3_kevlar_skin.string)); + } + } + if (!strcmp(item->classname, "item_laser") && strcmp(cg_RQ3_laser_skin.string, "default")) { + itemInfo->customSkin = trap_R_RegisterSkin (va("models/items/%s/%s.skin", + cg_RQ3_laser.string, cg_RQ3_laser_skin.string)); + if (!itemInfo->customSkin) { + Com_Printf("Item skin load failure: %s\n", va("models/items/%s/%s.skin", + cg_RQ3_laser.string, cg_RQ3_laser_skin.string)); + } + } + if (!strcmp(item->classname, "item_bandolier") && strcmp(cg_RQ3_bandolier_skin.string, "default")) { + itemInfo->customSkin = trap_R_RegisterSkin (va("models/items/%s/%s.skin", + cg_RQ3_bandolier.string, cg_RQ3_bandolier_skin.string)); + if (!itemInfo->customSkin) { + Com_Printf("Item skin load failure: %s\n", va("models/items/%s/%s.skin", + cg_RQ3_bandolier.string, cg_RQ3_bandolier_skin.string)); + } + } + if (!strcmp(item->classname, "item_slippers") && strcmp(cg_RQ3_slippers_skin.string, "default")) { + itemInfo->customSkin = trap_R_RegisterSkin (va("models/items/%s/%s.skin", + cg_RQ3_slippers.string, cg_RQ3_slippers_skin.string)); + if (!itemInfo->customSkin) { + Com_Printf("Item skin load failure: %s\n", va("models/items/%s/%s.skin", + cg_RQ3_slippers.string, cg_RQ3_slippers_skin.string)); + } + } + if (!strcmp(item->classname, "item_helmet") && strcmp(cg_RQ3_helmet_skin.string, "default")) { + itemInfo->customSkin = trap_R_RegisterSkin (va("models/items/%s/%s.skin", + cg_RQ3_helmet.string, cg_RQ3_helmet_skin.string)); + if (!itemInfo->customSkin) { + Com_Printf("Item skin load failure: %s\n", va("models/items/%s/%s.skin", + cg_RQ3_helmet.string, cg_RQ3_helmet_skin.string)); + } + } + } + // // powerups have an accompanying ring or sphere // @@ -1049,9 +1110,8 @@ CG_CalculateWeaponPosition */ static void CG_CalculateWeaponPosition(vec3_t origin, vec3_t angles) { - float scale; + float scale, fracsin; int delta; - float fracsin; VectorCopy(cg.refdef.vieworg, origin); VectorCopy(cg.refdefViewAngles, angles); @@ -1075,15 +1135,6 @@ static void CG_CalculateWeaponPosition(vec3_t origin, vec3_t angles) } else if (delta < LAND_DEFLECT_TIME + LAND_RETURN_TIME) { origin[2] += cg.landChange * 0.25 * (LAND_DEFLECT_TIME + LAND_RETURN_TIME - delta) / LAND_RETURN_TIME; } -#if 0 - // drop the weapon when stair climbing - delta = cg.time - cg.stepTime; - if (delta < STEP_TIME / 2) { - origin[2] -= cg.stepChange * 0.25 * delta / (STEP_TIME / 2); - } else if (delta < STEP_TIME) { - origin[2] -= cg.stepChange * 0.25 * (STEP_TIME - delta) / (STEP_TIME / 2); - } -#endif // idle drift scale = cg.xyspeed + 40; @@ -1114,12 +1165,7 @@ sound should only be done on the world model case. */ void CG_AddPlayerWeapon(refEntity_t * parent, playerState_t * ps, centity_t * cent, int team) { - refEntity_t gun; - -// Blaze: Can remove this because no more spinning barrel -// refEntity_t barrel; - refEntity_t flash; - refEntity_t silencer, laser; + refEntity_t gun, flash, silencer, laser; vec3_t angles; weapon_t weaponNum; weaponInfo_t *weapon; @@ -1152,6 +1198,10 @@ void CG_AddPlayerWeapon(refEntity_t * parent, playerState_t * ps, centity_t * ce return; } + // JBravo: activate the custom skin, if any + if (weapon->customSkin) + gun.customSkin = weapon->customSkin; + if (!ps) { // add weapon ready sound cent->pe.lightningFiring = qfalse; @@ -1205,8 +1255,6 @@ void CG_AddPlayerWeapon(refEntity_t * parent, playerState_t * ps, centity_t * ce if (cg.curSyncSound.played == qfalse) { cg.curSyncSound.played = qtrue; - - //CG_Printf("Playing a timed sound (%i %i %1.1f)\n", gun.frame, gun.oldframe, gun.backlerp); trap_S_StartLocalSound(cg.curSyncSound.sound, CHAN_WEAPON); } } @@ -1348,7 +1396,6 @@ void CG_AddPlayerWeapon(refEntity_t * parent, playerState_t * ps, centity_t * ce "tag_shell2"); else CG_PositionRotatedEntityOnTag(&shell->refEntity, &gun, gun.hModel, "tag_shell"); - } VectorCopy(shell->refEntity.origin, shell->pos.trBase); @@ -1469,9 +1516,6 @@ void CG_AddPlayerWeapon(refEntity_t * parent, playerState_t * ps, centity_t * ce if (ps || cg.renderingThirdPerson || cent->currentState.number != cg.predictedPlayerState.clientNum) { // add rail trail - //Blaze: no need for this - //CG_SpawnRailTrail( cent, flash.origin ); - if (weapon->flashDlightColor[0] || weapon->flashDlightColor[1] || weapon->flashDlightColor[2]) { trap_R_AddLightToScene(flash.origin, 300 + (rand() & 31), weapon->flashDlightColor[0], weapon->flashDlightColor[1], weapon->flashDlightColor[2]); @@ -1574,10 +1618,7 @@ CG_DrawWeaponSelect */ void CG_DrawWeaponSelect(void) { - int i; - int bits; - int count; - int x, y, w; + int i, bits, count, x, y, w; char *name; float *color; @@ -1670,8 +1711,7 @@ CG_NextWeapon_f */ void CG_NextWeapon_f(void) { - int i; - int original; + int i, original; if (!cg.snap) { return; @@ -1723,8 +1763,7 @@ CG_PrevWeapon_f */ void CG_PrevWeapon_f(void) { - int i; - int original; + int i, original; if (!cg.snap) { return; @@ -1755,10 +1794,6 @@ void CG_PrevWeapon_f(void) if (cg.weaponSelect == -1) { cg.weaponSelect = 15; } - //Blaze: Allow full Cycle - //if ( cg.weaponSelect == WP_GAUNTLET ) { - // continue; // never cycle to gauntlet - //} if (CG_WeaponSelectable(cg.weaponSelect)) { break; } @@ -1782,8 +1817,7 @@ CG_SpecialWeapon_f */ void CG_SpecialWeapon_f(void) { - int i; - int original; + int i, original; if (!cg.snap) { //CG_Printf("No snapshot: normally exiting\n"); @@ -2012,8 +2046,6 @@ The current weapon has just run out of ammo */ void CG_OutOfAmmoChange(void) { - //int i; - if (!cg.snap) return; @@ -2195,31 +2227,13 @@ Caused by an EV_MISSILE_MISS event, or directly by local bullet tracing void CG_MissileHitWall(int weapon, int clientNum, vec3_t origin, vec3_t dir, impactSound_t soundType, int weapModification) { - qhandle_t mod; - qhandle_t mark; - qhandle_t shader; + qhandle_t mod, mark, shader; sfxHandle_t sfx; - float radius; - float light; - vec3_t lightColor; - localEntity_t *le; - int r; - qboolean alphaFade; - qboolean isSprite; - int duration; - int angle; - - //Elder: for impact smoke marks - localEntity_t *smokePuff; - vec3_t puffOrigin; - vec3_t puffOffset; - vec3_t puffDir; - int contentType; - - //Elder: for impact sparks - vec3_t velocity; - int sparkCount; - int i; + float radius, light; + vec3_t lightColor, puffOrigin, puffOffset, puffDir, velocity; + localEntity_t *le, *smokePuff; + int r, duration, angle, contentType, sparkCount, i; + qboolean alphaFade, isSprite; mark = 0; radius = 32; @@ -2589,11 +2603,8 @@ We are not going to show every HC impact static void CG_ShotgunPellet(vec3_t start, vec3_t end, int skipNum, int shellWeapon) { trace_t tr; - int sourceContentType, destContentType; - - int l, playerNum; + int sourceContentType, destContentType, l, playerNum; vec3_t t_start; - //Makro int Material; @@ -2720,12 +2731,9 @@ hit splashes */ static void CG_ShotgunPattern(vec3_t origin, vec3_t origin2, int otherEntNum, int shotType, int seed) { - int i; + int i, count; float r, u; - vec3_t end; - vec3_t forward, right, up; - - int count; + vec3_t end, forward, right, up; int hc_multipler = 0; // derive the right and up vectors from the forward vector, because @@ -2822,8 +2830,7 @@ void CG_CreateTracer(int entity, vec3_t start, vec3_t end) { localEntity_t *le; float dist; - vec3_t dir, end2; - vec3_t temp, midpoint; + vec3_t dir, end2, temp, midpoint; float tracerSpeed = 5000; VectorSubtract(end, start, dir); @@ -2861,11 +2868,9 @@ CG_Tracer */ void CG_Tracer(vec3_t source, vec3_t dest) { - vec3_t forward, right; + vec3_t forward, right, line, start, finish; polyVert_t verts[4]; - vec3_t line; float len, begin, end; - vec3_t start, finish; // tracer VectorSubtract(dest, source, forward); @@ -3007,9 +3012,7 @@ Local laser dot if it is the client's own laser */ static void CG_LocalLaser() { - vec3_t muzzle; - vec3_t forward; - vec3_t end; + vec3_t muzzle, forward, end; refEntity_t *re; trace_t tr; diff --git a/reaction/game/bg_misc.c b/reaction/game/bg_misc.c index 58bda61a..42b79a96 100644 --- a/reaction/game/bg_misc.c +++ b/reaction/game/bg_misc.c @@ -5,6 +5,9 @@ //----------------------------------------------------------------------------- // // $Log$ +// Revision 1.48 2003/02/01 02:15:31 jbravo +// Replacement models and items +// // Revision 1.47 2003/01/08 04:46:26 jbravo // Wrote a new hackish model replacement system // @@ -169,7 +172,7 @@ gitem_t bg_itemlist[] = { {"models/weapons2/m4/m4.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , -/* icon */ "icons/iconw_m4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +/* icon */ "icons/iconw_m4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", /* pickup */ RQ3_M4_NAME, 24, IT_WEAPON, @@ -186,7 +189,7 @@ gitem_t bg_itemlist[] = { {"models/weapons2/ssg3000/ssg3000.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , -/* icon */ "icons/iconw_ssg\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +/* icon */ "icons/iconw_ssg\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", /* pickup */ RQ3_SSG3000_NAME, 6, IT_WEAPON, @@ -203,7 +206,7 @@ gitem_t bg_itemlist[] = { {"models/weapons2/mp5/mp5.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , -/* icon */ "icons/iconw_mp5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +/* icon */ "icons/iconw_mp5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", /* pickup */ RQ3_MP5_NAME, 30, IT_WEAPON, @@ -237,7 +240,7 @@ gitem_t bg_itemlist[] = { {"models/weapons2/m3/m3.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , -/* icon */ "icons/iconw_m3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +/* icon */ "icons/iconw_m3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", /* pickup */ RQ3_M3_NAME, 7, IT_WEAPON, @@ -588,10 +591,10 @@ Only in CTF games { "item_kevlar", "sound/items/kevlar.wav", - {"models/items/kevlar.md3", + {"models/items/kevlar.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , - "icons/iconi_kevlar", + "icons/iconi_kevlar\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", RQ3_KEVLAR_NAME, 0, IT_HOLDABLE, @@ -603,10 +606,10 @@ Only in CTF games { "item_silencer", "sound/items/silencer.wav", - {"models/items/silencer.md3", + {"models/items/silencer.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , - "icons/iconi_silencer", + "icons/iconi_silencer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", RQ3_SILENCER_NAME, 0, IT_HOLDABLE, @@ -618,10 +621,10 @@ Only in CTF games { "item_laser", "sound/items/laser.wav", - {"models/items/laser.md3", + {"models/items/laser.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , - "icons/iconi_laser", + "icons/iconi_laser\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", RQ3_LASER_NAME, 0, IT_HOLDABLE, @@ -633,10 +636,10 @@ Only in CTF games { "item_bandolier", "sound/items/bandolier.wav", - {"models/items/bandolier.md3", + {"models/items/bandolier.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , - "icons/iconi_bandolier", + "icons/iconi_bandolier\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", RQ3_BANDOLIER_NAME, 0, IT_HOLDABLE, @@ -648,10 +651,10 @@ Only in CTF games { "item_slippers", "sound/items/slippers.wav", - {"models/items/slippers.md3", + {"models/items/slippers.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , - "icons/iconi_slippers", + "icons/iconi_slippers\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", RQ3_SLIPPERS_NAME, 0, IT_HOLDABLE, @@ -663,10 +666,10 @@ Only in CTF games { "item_helmet", "sound/items/slippers.wav", - {"models/items/helmet/helmet.md3", + {"models/items/helmet.md3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 0, 0, 0} , - "icons/iconi_helmet", + "icons/iconi_helmet\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", RQ3_HELMET_NAME, 0, IT_HOLDABLE,