Code for 0-12-00 VMs
Server-side
Yes, there is some bot code updates =)
This commit is contained in:
Victor Chow 2001-09-11 00:12:29 +00:00
parent 1b12240f15
commit c0bef62b6e
13 changed files with 304 additions and 167 deletions

View file

@ -1282,7 +1282,7 @@ int BotSelectActivateWeapon(bot_state_t *bs) {
// //
if (bs->inventory[INVENTORY_PISTOL] > 0 && bs->inventory[INVENTORY_PISTOLAMMO] > 0) if (bs->inventory[INVENTORY_PISTOL] > 0 && bs->inventory[INVENTORY_PISTOLAMMO] > 0)
return WEAPONINDEX_PISTOL; return WEAPONINDEX_PISTOL;
else if (bs->inventory[INVENTORY_M3] > 0 && bs->inventory[INVENTORY_SHOTGUNAMMO] > 0) else if (bs->inventory[INVENTORY_M3] > 0 && bs->inventory[INVENTORY_M3AMMO] > 0)
return WEAPONINDEX_M3; return WEAPONINDEX_M3;
else if (bs->inventory[INVENTORY_M4] > 0 && bs->inventory[INVENTORY_M4AMMO] > 0) else if (bs->inventory[INVENTORY_M4] > 0 && bs->inventory[INVENTORY_M4AMMO] > 0)
return WEAPONINDEX_M4; return WEAPONINDEX_M4;
@ -1296,8 +1296,10 @@ int BotSelectActivateWeapon(bot_state_t *bs) {
#endif #endif
else if (bs->inventory[INVENTORY_SSG3000] > 0 && bs->inventory[INVENTORY_SSG3000AMMO] > 0) else if (bs->inventory[INVENTORY_SSG3000] > 0 && bs->inventory[INVENTORY_SSG3000AMMO] > 0)
return WEAPONINDEX_SSG3000; return WEAPONINDEX_SSG3000;
else if (bs->inventory[INVENTORY_HANDCANNON] > 0 && bs->inventory[INVENTORY_SHOTGUNAMMO] > 0) else if (bs->inventory[INVENTORY_HANDCANNON] > 0 && bs->inventory[INVENTORY_M3AMMO] > 0)
return WEAPONINDEX_HANDCANNON; return WEAPONINDEX_HANDCANNON;
else if (bs->inventory[INVENTORY_AKIMBO] > 0 && bs->inventory[INVENTORY_AKIMBOAMMO] > 0)
return WEAPONINDEX_AKIMBO;
else { else {
return -1; return -1;
} }

View file

@ -1709,7 +1709,7 @@ void BotUpdateInventory(bot_state_t *bs) {
bs->inventory[INVENTORY_ARMOR] = bs->cur_ps.stats[STAT_ARMOR]; bs->inventory[INVENTORY_ARMOR] = bs->cur_ps.stats[STAT_ARMOR];
//weapons //weapons
//Blaze: Reaction Weapons //Blaze: Reaction Weapons
bs->inventory[INVENTORY_KNIFE] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_KNIFE)) !=0; bs->inventory[INVENTORY_KNIFE] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_KNIFE)) != 0;
bs->inventory[INVENTORY_PISTOL] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_PISTOL)) != 0; bs->inventory[INVENTORY_PISTOL] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_PISTOL)) != 0;
bs->inventory[INVENTORY_M4] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_M4)) != 0; bs->inventory[INVENTORY_M4] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_M4)) != 0;
bs->inventory[INVENTORY_SSG3000] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_SSG3000)) != 0; bs->inventory[INVENTORY_SSG3000] = (bs->cur_ps.stats[STAT_WEAPONS] & (1 << WP_SSG3000)) != 0;
@ -1725,8 +1725,8 @@ void BotUpdateInventory(bot_state_t *bs) {
bs->inventory[INVENTORY_SSG3000AMMO] = bs->cur_ps.ammo[WP_SSG3000]; bs->inventory[INVENTORY_SSG3000AMMO] = bs->cur_ps.ammo[WP_SSG3000];
bs->inventory[INVENTORY_MP5AMMO] = bs->cur_ps.ammo[WP_MP5]; bs->inventory[INVENTORY_MP5AMMO] = bs->cur_ps.ammo[WP_MP5];
//Blaze: Same ammo for shotgun and handcannon //Blaze: Same ammo for shotgun and handcannon
bs->inventory[INVENTORY_SHOTGUNAMMO] = bs->cur_ps.ammo[WP_HANDCANNON]; bs->inventory[INVENTORY_M3AMMO] = bs->cur_ps.ammo[WP_HANDCANNON];
bs->inventory[INVENTORY_SHOTGUNAMMO] = bs->cur_ps.ammo[WP_M3]; bs->inventory[INVENTORY_M3AMMO] = bs->cur_ps.ammo[WP_M3];
//Blaze: Same ammo for Pistol and Akimbo Pistols //Blaze: Same ammo for Pistol and Akimbo Pistols
bs->inventory[INVENTORY_PISTOLAMMO] = bs->cur_ps.ammo[WP_AKIMBO]; bs->inventory[INVENTORY_PISTOLAMMO] = bs->cur_ps.ammo[WP_AKIMBO];
bs->inventory[INVENTORY_GRENADEAMMO] = bs->cur_ps.ammo[WP_GRENADE]; bs->inventory[INVENTORY_GRENADEAMMO] = bs->cur_ps.ammo[WP_GRENADE];
@ -1734,8 +1734,8 @@ void BotUpdateInventory(bot_state_t *bs) {
// bs->inventory[INVENTORY_BFGAMMO] = bs->cur_ps.ammo[WP_BFG]; // bs->inventory[INVENTORY_BFGAMMO] = bs->cur_ps.ammo[WP_BFG];
//powerups //powerups
bs->inventory[INVENTORY_HEALTH] = bs->cur_ps.stats[STAT_HEALTH]; bs->inventory[INVENTORY_HEALTH] = bs->cur_ps.stats[STAT_HEALTH];
bs->inventory[INVENTORY_TELEPORTER] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_TELEPORTER; //bs->inventory[INVENTORY_TELEPORTER] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_TELEPORTER;
bs->inventory[INVENTORY_MEDKIT] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_MEDKIT; //bs->inventory[INVENTORY_MEDKIT] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_MEDKIT;
#ifdef MISSIONPACK #ifdef MISSIONPACK
bs->inventory[INVENTORY_KAMIKAZE] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_KAMIKAZE; bs->inventory[INVENTORY_KAMIKAZE] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_KAMIKAZE;
bs->inventory[INVENTORY_PORTAL] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_PORTAL; bs->inventory[INVENTORY_PORTAL] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_PORTAL;
@ -2192,13 +2192,16 @@ float BotAggression(bot_state_t *bs) {
//if the bot is very low on health //if the bot is very low on health
if (bs->inventory[INVENTORY_HEALTH] < 60) return 0; if (bs->inventory[INVENTORY_HEALTH] < 60) return 0;
//if the bot is low on health //if the bot is low on health
// Elder: ignore armor checks
/*
if (bs->inventory[INVENTORY_HEALTH] < 80) { if (bs->inventory[INVENTORY_HEALTH] < 80) {
//if the bot has insufficient armor //if the bot has insufficient armor
if (bs->inventory[INVENTORY_ARMOR] < 40) return 0; if (bs->inventory[INVENTORY_ARMOR] < 40) return 0;
} }
//if the bot can use the Hand cannon */
//if the bot can use the Handcannon
if (bs->inventory[INVENTORY_HANDCANNON] > 0 && if (bs->inventory[INVENTORY_HANDCANNON] > 0 &&
bs->inventory[INVENTORY_SHOTGUNAMMO] > 2) return 100; bs->inventory[INVENTORY_HANDCANNONAMMO] >= 2) return 100;
//if the bot can use the Sniper //if the bot can use the Sniper
if (bs->inventory[INVENTORY_SSG3000] > 0 && if (bs->inventory[INVENTORY_SSG3000] > 0 &&
bs->inventory[INVENTORY_SSG3000] > 3) return 95; bs->inventory[INVENTORY_SSG3000] > 3) return 95;
@ -2210,10 +2213,13 @@ float BotAggression(bot_state_t *bs) {
bs->inventory[INVENTORY_M4AMMO] > 5) return 90; bs->inventory[INVENTORY_M4AMMO] > 5) return 90;
//if the bot can use the plasmagun //if the bot can use the plasmagun
if (bs->inventory[INVENTORY_M3] > 0 && if (bs->inventory[INVENTORY_M3] > 0 &&
bs->inventory[INVENTORY_SHOTGUNAMMO] > 4) return 85; bs->inventory[INVENTORY_M3AMMO] > 4) return 85;
//if the bot can use the grenade launcher //if the bot can use the grenade launcher
if (bs->inventory[INVENTORY_GRENADE] > 0 && if (bs->inventory[INVENTORY_GRENADE] > 0 &&
bs->inventory[INVENTORY_GRENADE] > 2) return 80; bs->inventory[INVENTORY_GRENADE] > 2) return 80;
// if the bot can use akimbos
if (bs->inventory[INVENTORY_AKIMBO] > 0 &&
bs->inventory[INVENTORY_AKIMBOAMMO] > 4) return 80;
//if the bot can use the shotgun //if the bot can use the shotgun
//if (bs->inventory[INVENTORY_SHOTGUN] > 0 && //if (bs->inventory[INVENTORY_SHOTGUN] > 0 &&
// bs->inventory[INVENTORY_SHELLS] > 10) return 50; // bs->inventory[INVENTORY_SHELLS] > 10) return 50;
@ -2419,7 +2425,7 @@ int BotHasPersistantPowerupAndWeapon(bot_state_t *bs) {
bs->inventory[INVENTORY_MP5AMMO] > 50) return qtrue; bs->inventory[INVENTORY_MP5AMMO] > 50) return qtrue;
//if the bot can use the rocketlauncher //if the bot can use the rocketlauncher
if (bs->inventory[INVENTORY_HANDCANNON] > 0 && if (bs->inventory[INVENTORY_HANDCANNON] > 0 &&
bs->inventory[INVENTORY_SHOTGUNAMMO] > 5) return qtrue; bs->inventory[INVENTORY_M3AMMO] > 5) return qtrue;
// //
/*if (bs->inventory[INVENTORY_NAILGUN] > 0 && /*if (bs->inventory[INVENTORY_NAILGUN] > 0 &&
bs->inventory[INVENTORY_NAILS] > 5) return qtrue; bs->inventory[INVENTORY_NAILS] > 5) return qtrue;
@ -2496,9 +2502,10 @@ int BotWantsToCamp(bot_state_t *bs) {
//if the bot isn't healthy anough //if the bot isn't healthy anough
if (BotAggression(bs) < 50) return qfalse; if (BotAggression(bs) < 50) return qfalse;
//the bot should have at least have the rocket launcher, the railgun or the bfg10k with some ammo //the bot should have at least have the rocket launcher, the railgun or the bfg10k with some ammo
if ((bs->inventory[INVENTORY_HANDCANNON] <= 0 || bs->inventory[INVENTORY_SHOTGUNAMMO < 10]) && // Elder: changed a few of the numbers
if ((bs->inventory[INVENTORY_HANDCANNON] <= 0 || bs->inventory[INVENTORY_M3AMMO < 5]) &&
(bs->inventory[INVENTORY_M4] <= 0 || bs->inventory[INVENTORY_M4AMMO] < 10) && (bs->inventory[INVENTORY_M4] <= 0 || bs->inventory[INVENTORY_M4AMMO] < 10) &&
(bs->inventory[INVENTORY_SSG3000] <= 0 || bs->inventory[INVENTORY_SSG3000AMMO] < 10)) { (bs->inventory[INVENTORY_SSG3000] <= 0 || bs->inventory[INVENTORY_SSG3000AMMO] < 6)) {
return qfalse; return qfalse;
} }
//find the closest camp spot //find the closest camp spot

View file

@ -416,24 +416,6 @@ gitem_t bg_itemlist[] =
/* sounds */ //"" /* sounds */ //""
// }, // },
//Elder: just leaving this in for now
/*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
*/
{
"ammo_rockets",
"sound/misc/am_pkup.wav",
{ "models/ammo/m3.md3",
0, 0, 0},
/* icon */ "icons/icona_shells",
/* pickup */ "Shotgun Shells",
7,
IT_AMMO,
//Blaze: Changed from WP_ROCKET_LAUNCHER to WP_SHOTGUN
WP_M3,
/* precache */ "",
/* sounds */ ""
},
/*QUAKED ammo_m4 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended /*QUAKED ammo_m4 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
*/ */
{ {

View file

@ -1842,8 +1842,12 @@ static void PM_BeginWeaponChange( int weapon ) {
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_AKIMBO ||
pm->ps->weapon == WP_GRENADE ||
(pm->ps->weapon == WP_KNIFE && (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
PM_StartWeaponAnim(WP_ANIM_DISARM); PM_StartWeaponAnim(WP_ANIM_DISARM);
else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
PM_StartWeaponAnim(WP_ANIM_THROWDISARM);
} }
// Elder: cancel reload stuff here // Elder: cancel reload stuff here
@ -1860,8 +1864,12 @@ static void PM_BeginWeaponChange( int weapon ) {
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_AKIMBO ||
pm->ps->weapon == WP_GRENADE ||
(pm->ps->weapon == WP_KNIFE && (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
PM_StartWeaponAnim(WP_ANIM_DISARM); PM_StartWeaponAnim(WP_ANIM_DISARM);
else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
PM_StartWeaponAnim(WP_ANIM_THROWDISARM);
PM_StartTorsoAnim( TORSO_DROP ); PM_StartTorsoAnim( TORSO_DROP );
} }
@ -1937,9 +1945,13 @@ static void PM_FinishWeaponChange( void ) {
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_AKIMBO ||
pm->ps->weapon == WP_GRENADE ||
(pm->ps->weapon == WP_KNIFE && (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
PM_StartWeaponAnim(WP_ANIM_ACTIVATE); PM_StartWeaponAnim(WP_ANIM_ACTIVATE);
else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
PM_StartWeaponAnim(WP_ANIM_THROWACTIVATE);
PM_StartTorsoAnim( TORSO_RAISE ); PM_StartTorsoAnim( TORSO_RAISE );
} }
@ -1961,13 +1973,20 @@ static void PM_TorsoAnimation( void ) {
// QUARANTINE - Weapon Animation // QUARANTINE - Weapon Animation
// Should always draw the weapon when it is just ready // Should always draw the weapon when it is just ready
//Elder: temp hack //Elder: temp hack
if (pm->ps->weapon == WP_PISTOL || if (pm->ps->ammo[pm->ps->weapon] == 0)
PM_ContinueWeaponAnim( WP_ANIM_EMPTY );
else if (pm->ps->weapon == WP_PISTOL ||
pm->ps->weapon == WP_M3 || pm->ps->weapon == WP_M3 ||
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_AKIMBO ||
PM_ContinueWeaponAnim( WP_ANIM_IDLE ); pm->ps->weapon == WP_GRENADE ||
(pm->ps->weapon == WP_KNIFE && (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
PM_ContinueWeaponAnim(WP_ANIM_IDLE);
else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
PM_ContinueWeaponAnim(WP_ANIM_THROWIDLE);
// PM_ContinueWeaponAnim( WP_ANIM_READY ); // PM_ContinueWeaponAnim( WP_ANIM_READY );
return; return;
@ -2070,7 +2089,7 @@ static void PM_Reload( void )
if (pm->ps->stats[STAT_RELOADTIME] > 0) { if (pm->ps->stats[STAT_RELOADTIME] > 0) {
if ( pm->ps->stats[STAT_RQ3] & RQ3_LOCKRELOADS ) if ( pm->ps->stats[STAT_RQ3] & RQ3_LOCKRELOADS )
{ {
Com_Printf("============= Locked out in fast-reload interrupt\n"); //Com_Printf("============= Locked out in fast-reload interrupt\n");
} }
else else
{ {
@ -2082,7 +2101,7 @@ static void PM_Reload( void )
// add to reload queue and enable fast-reloads flag // add to reload queue and enable fast-reloads flag
pm->ps->stats[STAT_RQ3] |= RQ3_FASTRELOADS; pm->ps->stats[STAT_RQ3] |= RQ3_FASTRELOADS;
pm->ps->stats[STAT_RELOADATTEMPTS]++; pm->ps->stats[STAT_RELOADATTEMPTS]++;
Com_Printf("======== Reload attempts: %i ========\n", pm->ps->stats[STAT_RELOADATTEMPTS]); //Com_Printf("======== Reload attempts: %i ========\n", pm->ps->stats[STAT_RELOADATTEMPTS]);
} }
return; return;
} }
@ -2223,19 +2242,19 @@ static void PM_Reload( void )
if (pm->ps->stats[STAT_CLIPS] > 0) if (pm->ps->stats[STAT_CLIPS] > 0)
{ {
Com_Printf("Sending event from continuous fast-reloads\n"); //Com_Printf("Sending event from continuous fast-reloads\n");
PM_AddEvent(EV_RELOAD_WEAPON2); PM_AddEvent(EV_RELOAD_WEAPON2);
} }
else else
{ {
Com_Printf("Negative event prevented\n"); //Com_Printf("Negative event prevented\n");
pm->ps->stats[STAT_RELOADATTEMPTS] = 0; pm->ps->stats[STAT_RELOADATTEMPTS] = 0;
} }
} }
else else
{ {
Com_Printf("============= Locked out in continuous fast-reloads\n"); //Com_Printf("============= Locked out in continuous fast-reloads\n");
} }
// finishing up fast reloads // finishing up fast reloads
@ -2251,7 +2270,7 @@ static void PM_Reload( void )
pm->ps->stats[STAT_RQ3] &= ~RQ3_FASTRELOADS; pm->ps->stats[STAT_RQ3] &= ~RQ3_FASTRELOADS;
// lock fast-reloads during finish delay // lock fast-reloads during finish delay
pm->ps->stats[STAT_RQ3] |= RQ3_LOCKRELOADS; pm->ps->stats[STAT_RQ3] |= RQ3_LOCKRELOADS;
Com_Printf("<<<<<<<<<<<<< Locking\n"); //Com_Printf("<<<<<<<<<<<<< Locking\n");
} }
return; return;
@ -2263,12 +2282,12 @@ static void PM_Reload( void )
// unlock // unlock
if (pm->ps->stats[STAT_RQ3] & RQ3_LOCKRELOADS) if (pm->ps->stats[STAT_RQ3] & RQ3_LOCKRELOADS)
{ {
Com_Printf(">>>>>>>>>>>>> Unlocking\n"); //Com_Printf(">>>>>>>>>>>>> Unlocking\n");
pm->ps->stats[STAT_RQ3] &= ~RQ3_LOCKRELOADS; pm->ps->stats[STAT_RQ3] &= ~RQ3_LOCKRELOADS;
} }
else else
{ {
Com_Printf("Sending event from normal reload\n"); //Com_Printf("Sending event from normal reload\n");
PM_AddEvent(EV_RELOAD_WEAPON2); PM_AddEvent(EV_RELOAD_WEAPON2);
} }
@ -2428,14 +2447,23 @@ static void PM_Weapon( void ) {
else else
{ {
//Elder: temp hack //Elder: temp hack
if (pm->ps->weaponstate == WEAPON_READY && if (pm->ps->weaponstate == WEAPON_READY)
(pm->ps->weapon == WP_PISTOL || {
pm->ps->weapon == WP_M3 || if (pm->ps->ammo[pm->ps->weapon] == 0)
pm->ps->weapon == WP_HANDCANNON || PM_ContinueWeaponAnim( WP_ANIM_EMPTY );
pm->ps->weapon == WP_SSG3000 || else if (pm->ps->weapon == WP_PISTOL ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M3 ||
pm->ps->weapon == WP_AKIMBO)) pm->ps->weapon == WP_HANDCANNON ||
PM_ContinueWeaponAnim(WP_ANIM_IDLE); pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO ||
pm->ps->weapon == WP_GRENADE ||
(pm->ps->weapon == WP_KNIFE && (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
PM_ContinueWeaponAnim(WP_ANIM_IDLE);
else if (pm->ps->weapon == WP_KNIFE &&
!(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
PM_ContinueWeaponAnim(WP_ANIM_THROWIDLE);
}
} }
} }
@ -2477,13 +2505,19 @@ static void PM_Weapon( void ) {
// Should always draw the weapon when it is just ready // Should always draw the weapon when it is just ready
// PM_StartWeaponAnim( WP_ANIM_READY ); // PM_StartWeaponAnim( WP_ANIM_READY );
// temp hack // temp hack
if (pm->ps->weapon == WP_PISTOL || if (pm->ps->ammo[pm->ps->weapon] == 0)
PM_ContinueWeaponAnim( WP_ANIM_EMPTY );
else if (pm->ps->weapon == WP_PISTOL ||
pm->ps->weapon == WP_M3 || pm->ps->weapon == WP_M3 ||
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_AKIMBO ||
pm->ps->weapon == WP_GRENADE ||
(pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
PM_StartWeaponAnim( WP_ANIM_IDLE ); PM_StartWeaponAnim( WP_ANIM_IDLE );
else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
PM_StartWeaponAnim( WP_ANIM_THROWIDLE );
return; return;
} }
@ -2494,6 +2528,7 @@ static void PM_Weapon( void ) {
pm->ps->weaponTime = 0; pm->ps->weaponTime = 0;
// put it in the "cocked" position // put it in the "cocked" position
pm->ps->weaponstate = WEAPON_COCKED; pm->ps->weaponstate = WEAPON_COCKED;
PM_StartWeaponAnim(WP_ANIM_EXTRA1);
return; return;
} }
@ -2554,6 +2589,11 @@ static void PM_Weapon( void ) {
// pm->ps->weaponstate = WEAPON_READY; // pm->ps->weaponstate = WEAPON_READY;
// return; // return;
// } // }
if (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)
PM_StartWeaponAnim( WP_ANIM_FIRE );
else
PM_StartWeaponAnim( WP_ANIM_THROWFIRE );
PM_StartTorsoAnim( TORSO_ATTACK2 ); PM_StartTorsoAnim( TORSO_ATTACK2 );
} else { } else {
// Elder: don't repeat if semi-auto // Elder: don't repeat if semi-auto
@ -2568,12 +2608,18 @@ static void PM_Weapon( void ) {
// This should change pm->ps->generic1 so we can animate // This should change pm->ps->generic1 so we can animate
// Elder: don't repeat if on semi-auto // Elder: don't repeat if on semi-auto
// temp hack // temp hack
if (pm->ps->weapon == WP_PISTOL || if (pm->ps->weapon == WP_AKIMBO)
{
// don't repeat animation if on second akimbo shot
if ( !pm->ps->stats[STAT_BURST] )
PM_StartWeaponAnim( WP_ANIM_FIRE );
}
else if (pm->ps->weapon == WP_PISTOL ||
pm->ps->weapon == WP_M3 || pm->ps->weapon == WP_M3 ||
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_GRENADE)
PM_StartWeaponAnim( WP_ANIM_FIRE ); PM_StartWeaponAnim( WP_ANIM_FIRE );
} }
} }
@ -3248,7 +3294,9 @@ void PmoveSingle (pmove_t *pmove) {
pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_HANDCANNON ||
pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_SSG3000 ||
pm->ps->weapon == WP_M4 || pm->ps->weapon == WP_M4 ||
pm->ps->weapon == WP_AKIMBO) pm->ps->weapon == WP_AKIMBO ||
pm->ps->weapon == WP_GRENADE ||
pm->ps->weapon == WP_KNIFE)
PM_WeaponAnimation(); PM_WeaponAnimation();
// torso animation // torso animation

View file

@ -43,7 +43,7 @@
#define MINS_Z -24 #define MINS_Z -24
#define DEFAULT_VIEWHEIGHT 22 #define DEFAULT_VIEWHEIGHT 22
//#define DEFAULT_VIEWHEIGHT 26 //#define DEFAULT_VIEWHEIGHT 26
//Elder: changed to 8 like AQ2 source BUT is it sync-ed? //Elder: changed to 8 like AQ2 source
#define CROUCH_VIEWHEIGHT 8 #define CROUCH_VIEWHEIGHT 8
//#define CROUCH_VIEWHEIGHT 12 //#define CROUCH_VIEWHEIGHT 12
#define DEAD_VIEWHEIGHT -16 #define DEAD_VIEWHEIGHT -16
@ -187,8 +187,8 @@ typedef enum {
#define SLASH_DAMAGE 200 //Shashing knife damage #define SLASH_DAMAGE 200 //Shashing knife damage
#define THROW_DAMAGE 250 //Throwing Knife damage #define THROW_DAMAGE 250 //Throwing Knife damage
#define GRENADE_DAMAGE 170 #define GRENADE_DAMAGE 170
#define GRENADE_SPLASH_DAMAGE 170 #define GRENADE_SPLASH_DAMAGE 170
#define GRENADE_SPLASH_RADIUS 340 //340 Splash damage * 2 #define GRENADE_SPLASH_RADIUS 340 //Damage * 2
#define PISTOL_SPREAD 140 #define PISTOL_SPREAD 140
#define MP5_SPREAD 250 #define MP5_SPREAD 250
@ -222,7 +222,7 @@ typedef enum {
#define RQ3_SSG3000_BOLT_DELAY 1300// Elder: delay before zooming back in #define RQ3_SSG3000_BOLT_DELAY 1300// Elder: delay before zooming back in
//#define RQ3_AKIMBO_DELAY 500 // Elder: two delays: one for the total delay //#define RQ3_AKIMBO_DELAY 500 // Elder: two delays: one for the total delay
//#define RQ3_AKIMBO_DELAY2 200 // one for the time to start the second shot //#define RQ3_AKIMBO_DELAY2 200 // one for the time to start the second shot
#define RQ3_AKIMBO_DELAY 200 #define RQ3_AKIMBO_DELAY 100
#define RQ3_AKIMBO_DELAY2 300 #define RQ3_AKIMBO_DELAY2 300
#define RQ3_KNIFE_DELAY 800 #define RQ3_KNIFE_DELAY 800
#define RQ3_THROW_DELAY 800 #define RQ3_THROW_DELAY 800
@ -374,7 +374,7 @@ typedef enum {
typedef enum { typedef enum {
WEAPON_READY, //sync with WP_ANIM_IDLE WEAPON_READY, //sync with WP_ANIM_IDLE
WEAPON_COCKED, WEAPON_COCKED, //sync with WP_ANIM_EXTRA1 for grenade
WEAPON_RAISING, //sync with WP_ANIM_ACTIVATE WEAPON_RAISING, //sync with WP_ANIM_ACTIVATE
WEAPON_DROPPING, //sync with WP_ANIM_DISARM WEAPON_DROPPING, //sync with WP_ANIM_DISARM
WEAPON_FIRING, //sync with WP_ANIM_FIRE WEAPON_FIRING, //sync with WP_ANIM_FIRE
@ -389,9 +389,14 @@ typedef enum {
WP_ANIM_IDLE, WP_ANIM_IDLE,
WP_ANIM_DISARM, WP_ANIM_DISARM,
WP_ANIM_ACTIVATE, WP_ANIM_ACTIVATE,
//WP_ANIM_EMPTY, WP_ANIM_EMPTY,
//WP_ANIM_EXTRA1, WP_ANIM_EXTRA1, // e.g. grenade pulling pin, fast-reload, knife slash to throw switch
//WP_ANIM_EXTRA2, WP_ANIM_EXTRA2, // knife throw to slash switch
// Knife exclusives
WP_ANIM_THROWFIRE,
WP_ANIM_THROWIDLE,
WP_ANIM_THROWDISARM,
WP_ANIM_THROWACTIVATE,
MAX_WEAPON_ANIMATIONS MAX_WEAPON_ANIMATIONS
} wpAnimNumber_t; } wpAnimNumber_t;

View file

@ -911,19 +911,30 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow )
weap = 0; weap = 0;
if (client->uniqueWeapons > 0) if (client->uniqueWeapons > 0)
{ {
weap = client->ps.stats[STAT_WEAPONS]; if (client->ps.weapon == WP_AKIMBO ||
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M4) ) == (1 << WP_M4)) client->ps.weapon == WP_PISTOL ||
weap = WP_M4; client->ps.weapon == WP_GRENADE ||
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M3) ) == (1 << WP_M3)) client->ps.weapon == WP_KNIFE ||
weap = WP_M3; client->ps.weapon == WP_NONE) // shouldn't have to worry about NONE, but just in case
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_MP5) ) == (1 << WP_MP5)) {
weap = WP_MP5; weap = client->ps.stats[STAT_WEAPONS];
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_HANDCANNON) ) == (1 << WP_HANDCANNON)) if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M4) ) == (1 << WP_M4))
weap = WP_HANDCANNON; weap = WP_M4;
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_SSG3000) ) == (1 << WP_SSG3000)) if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M3) ) == (1 << WP_M3))
weap = WP_SSG3000; weap = WP_M3;
if (weap == 0 ) if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_MP5) ) == (1 << WP_MP5))
return 0; weap = WP_MP5;
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_HANDCANNON) ) == (1 << WP_HANDCANNON))
weap = WP_HANDCANNON;
if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_SSG3000) ) == (1 << WP_SSG3000))
weap = WP_SSG3000;
if (weap == 0 )
return 0;
}
else
{
weap = client->ps.weapon;
}
xr_item = BG_FindItemForWeapon( weap ); xr_item = BG_FindItemForWeapon( weap );
@ -941,7 +952,10 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow )
trap_SendServerCommand( ent-g_entities, va("selectpistol")); trap_SendServerCommand( ent-g_entities, va("selectpistol"));
} }
client->ps.stats[STAT_WEAPONS] &= ~( 1 << weap); client->weaponCount[weap]--;
if (client->weaponCount[weap] == 0)
client->ps.stats[STAT_WEAPONS] &= ~( 1 << weap);
xr_drop= dropWeapon( ent, xr_item, 0, FL_DROPPED_ITEM | FL_THROWN_ITEM ); xr_drop= dropWeapon( ent, xr_item, 0, FL_DROPPED_ITEM | FL_THROWN_ITEM );
xr_drop->count= -1; // XRAY FMJ 0 is already taken, -1 means no ammo xr_drop->count= -1; // XRAY FMJ 0 is already taken, -1 means no ammo
client->uniqueWeapons--; client->uniqueWeapons--;

View file

@ -1651,6 +1651,9 @@ void Cmd_Stats_f( gentity_t *ent ) {
*/ */
void Cmd_Bandage (gentity_t *ent) void Cmd_Bandage (gentity_t *ent)
{ {
if (ent->client->ps.pm_type == PM_SPECTATOR)
return;
//Elder: added so you can't "rebandage" //Elder: added so you can't "rebandage"
if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) { if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) {
trap_SendServerCommand( ent-g_entities, va("print \"You are already bandaging!\n\"")); trap_SendServerCommand( ent-g_entities, va("print \"You are already bandaging!\n\""));
@ -1682,11 +1685,18 @@ void Cmd_Bandage (gentity_t *ent)
ent->client->ps.weapon == WP_HANDCANNON || ent->client->ps.weapon == WP_HANDCANNON ||
ent->client->ps.weapon == WP_SSG3000 || ent->client->ps.weapon == WP_SSG3000 ||
ent->client->ps.weapon == WP_M4 || ent->client->ps.weapon == WP_M4 ||
ent->client->ps.weapon == WP_AKIMBO) ent->client->ps.weapon == WP_AKIMBO ||
ent->client->ps.weapon == WP_GRENADE ||
(ent->client->ps.weapon == WP_KNIFE && !(ent->client->ps.persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)))
{ {
ent->client->ps.generic1 = ( ( ent->client->ps.generic1 & ANIM_TOGGLEBIT ) ent->client->ps.generic1 = ( ( ent->client->ps.generic1 & ANIM_TOGGLEBIT )
^ ANIM_TOGGLEBIT ) | WP_ANIM_DISARM; ^ ANIM_TOGGLEBIT ) | WP_ANIM_DISARM;
} }
else if (ent->client->ps.weapon == WP_KNIFE && (ent->client->ps.persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE))
{
ent->client->ps.generic1 = ( ( ent->client->ps.generic1 & ANIM_TOGGLEBIT )
^ ANIM_TOGGLEBIT ) | WP_ANIM_THROWDISARM;
}
//Elder: always lower the player model //Elder: always lower the player model
ent->client->ps.torsoAnim = ( ( ent->client->ps.torsoAnim & ANIM_TOGGLEBIT ) ent->client->ps.torsoAnim = ( ( ent->client->ps.torsoAnim & ANIM_TOGGLEBIT )
@ -1720,6 +1730,9 @@ void Cmd_Reload( gentity_t *ent )
int ammotoadd; int ammotoadd;
int delay = 0; int delay = 0;
if (ent->client->ps.pm_type == PM_SPECTATOR)
return;
//G_Printf("(%i) Cmd_Reload: Attempting reload\n", ent->s.clientNum); //G_Printf("(%i) Cmd_Reload: Attempting reload\n", ent->s.clientNum);
//Elder: added for redundant check but shouldn't need to come here - handled in cgame //Elder: added for redundant check but shouldn't need to come here - handled in cgame
@ -2114,8 +2127,8 @@ void Cmd_OpenDoor(gentity_t *ent)
//Use_BinaryMover( ent->parent, ent, other ); //Use_BinaryMover( ent->parent, ent, other );
gentity_t *door = NULL; gentity_t *door = NULL;
//Don't open doors if dead //Don't open doors if dead or spectating
if (ent->client->ps.stats[STAT_HEALTH] <= 0) if (ent->client->ps.stats[STAT_HEALTH] <= 0 || ent->client->ps.pm_type == PM_SPECTATOR)
return; return;
while ((door = findradius(door,ent->r.currentOrigin,100)) != NULL) while ((door = findradius(door,ent->r.currentOrigin,100)) != NULL)
@ -2144,6 +2157,9 @@ void toggleSemi(gentity_t *ent){
/* Hawkins. Reaction weapon command */ /* Hawkins. Reaction weapon command */
void Cmd_Weapon(gentity_t *ent) void Cmd_Weapon(gentity_t *ent)
{ {
if (ent->client->ps.pm_type == PM_SPECTATOR)
return;
//Elder: debug code //Elder: debug code
//G_Printf("PERS_WEAPONMODES: %d\n", ent->client->ps.persistant[PERS_WEAPONMODES]); //G_Printf("PERS_WEAPONMODES: %d\n", ent->client->ps.persistant[PERS_WEAPONMODES]);
@ -2328,7 +2344,9 @@ Cmd_DropWeapon_f XRAY FMJ
================= =================
*/ */
void Cmd_DropWeapon_f( gentity_t *ent ) { void Cmd_DropWeapon_f( gentity_t *ent ) {
if (ent->client->ps.pm_type == PM_SPECTATOR)
return;
//Elder: added -- checked in cgame //Elder: added -- checked in cgame
//if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK) //if ( (ent->client->ps.stats[STAT_RQ3] & RQ3_BANDAGE_WORK) == RQ3_BANDAGE_WORK)
//{ //{
@ -2351,6 +2369,9 @@ Cmd_DropItem_f
*/ */
void Cmd_DropItem_f( gentity_t *ent ) void Cmd_DropItem_f( gentity_t *ent )
{ {
if (ent->client->ps.pm_type == PM_SPECTATOR)
return;
if (ent->client->ps.stats[STAT_HOLDABLE_ITEM]) if (ent->client->ps.stats[STAT_HOLDABLE_ITEM])
{ {
//Elder: reset item totals if using bandolier //Elder: reset item totals if using bandolier
@ -2374,6 +2395,13 @@ void Cmd_DropItem_f( gentity_t *ent )
ent->client->numClips[WP_KNIFE] = RQ3_KNIFE_MAXCLIP; ent->client->numClips[WP_KNIFE] = RQ3_KNIFE_MAXCLIP;
if (ent->client->numClips[WP_GRENADE] > RQ3_GRENADE_MAXCLIP) if (ent->client->numClips[WP_GRENADE] > RQ3_GRENADE_MAXCLIP)
ent->client->numClips[WP_GRENADE] = RQ3_GRENADE_MAXCLIP; ent->client->numClips[WP_GRENADE] = RQ3_GRENADE_MAXCLIP;
if (ent->client->uniqueWeapons > g_RQ3_maxWeapons.integer)
{
Cmd_Unzoom( ent );
ThrowWeapon( ent, qtrue );
}
} }
//Force laser off //Force laser off
else if (bg_itemlist[ent->client->ps.stats[STAT_HOLDABLE_ITEM]].giTag == HI_LASER) else if (bg_itemlist[ent->client->ps.stats[STAT_HOLDABLE_ITEM]].giTag == HI_LASER)

View file

@ -110,43 +110,63 @@ void TossClientItems( gentity_t *self ) {
//as opposed to dropping it, then died //as opposed to dropping it, then died
if ( (weaponInventory & (1 << WP_M3) ) == (1 << WP_M3) ) { if ( (weaponInventory & (1 << WP_M3) ) == (1 << WP_M3) ) {
item = BG_FindItemForWeapon( WP_M3 ); while ( self->client->weaponCount[WP_M3] )
Drop_Item( self, item, angle); {
self->client->pers.hadUniqueWeapon[ WP_M3 ] = qfalse; item = BG_FindItemForWeapon( WP_M3 );
self->client->uniqueWeapons--; Drop_Item( self, item, angle);
angle += 30; self->client->pers.hadUniqueWeapon[ WP_M3 ] = qfalse;
self->client->uniqueWeapons--;
angle += 30;
self->client->weaponCount[WP_M3]--;
}
} }
if ( (weaponInventory & (1 << WP_M4) ) == (1 << WP_M4) ) { if ( (weaponInventory & (1 << WP_M4) ) == (1 << WP_M4) ) {
item = BG_FindItemForWeapon( WP_M4 ); while ( self->client->weaponCount[WP_M4] )
Drop_Item( self, item, angle); {
self->client->pers.hadUniqueWeapon[ WP_M4 ] = qfalse; item = BG_FindItemForWeapon( WP_M4 );
self->client->uniqueWeapons--; Drop_Item( self, item, angle);
angle += 30; self->client->pers.hadUniqueWeapon[ WP_M4 ] = qfalse;
self->client->uniqueWeapons--;
angle += 30;
self->client->weaponCount[WP_M4]--;
}
} }
if ( (weaponInventory & (1 << WP_MP5) ) == (1 << WP_MP5) ) { if ( (weaponInventory & (1 << WP_MP5) ) == (1 << WP_MP5) ) {
item = BG_FindItemForWeapon( WP_MP5 ); while ( self->client->weaponCount[WP_MP5] )
Drop_Item( self, item, angle); {
self->client->pers.hadUniqueWeapon[ WP_MP5 ] = qfalse; item = BG_FindItemForWeapon( WP_MP5 );
self->client->uniqueWeapons--; Drop_Item( self, item, angle);
angle += 30; self->client->pers.hadUniqueWeapon[ WP_MP5 ] = qfalse;
self->client->uniqueWeapons--;
angle += 30;
self->client->weaponCount[WP_MP5]--;
}
} }
if ( (weaponInventory & (1 << WP_HANDCANNON) ) == (1 << WP_HANDCANNON) ) { if ( (weaponInventory & (1 << WP_HANDCANNON) ) == (1 << WP_HANDCANNON) ) {
item = BG_FindItemForWeapon( WP_HANDCANNON ); while ( self->client->weaponCount[WP_HANDCANNON] )
Drop_Item( self, item, angle); {
self->client->pers.hadUniqueWeapon[ WP_HANDCANNON ] = qfalse; item = BG_FindItemForWeapon( WP_HANDCANNON );
self->client->uniqueWeapons--; Drop_Item( self, item, angle);
angle += 30; self->client->pers.hadUniqueWeapon[ WP_HANDCANNON ] = qfalse;
self->client->uniqueWeapons--;
angle += 30;
self->client->weaponCount[WP_HANDCANNON]--;
}
} }
if ( (weaponInventory & (1 << WP_SSG3000) ) == (1 << WP_SSG3000) ) { if ( (weaponInventory & (1 << WP_SSG3000) ) == (1 << WP_SSG3000) ) {
item = BG_FindItemForWeapon( WP_SSG3000 ); while ( self->client->weaponCount[WP_SSG3000] )
Drop_Item( self, item, angle); {
self->client->pers.hadUniqueWeapon[ WP_SSG3000 ] = qfalse; item = BG_FindItemForWeapon( WP_SSG3000 );
self->client->uniqueWeapons--; Drop_Item( self, item, angle);
angle += 30; self->client->pers.hadUniqueWeapon[ WP_SSG3000 ] = qfalse;
self->client->uniqueWeapons--;
angle += 30;
self->client->weaponCount[WP_SSG3000]--;
}
} }
//Elder: Always drop the pistol //Elder: Always drop the pistol
@ -1961,8 +1981,11 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
realBleedTime = BLEED_TIME; realBleedTime = BLEED_TIME;
client->bleeding += take * realBleedTime; client->bleeding += take * realBleedTime;
// Elder: Splash damage bleeding happens from the origin
VectorSubtract (point, targ->r.absmax, targ->client->bleedloc_offset); if (dflags == DAMAGE_RADIUS)
VectorClear(targ->client->bleedloc_offset);
else
VectorSubtract (point, targ->r.currentOrigin, targ->client->bleedloc_offset);
//G_Printf("(%d) = damage",damage); //G_Printf("(%d) = damage",damage);
//G_Printf("(%d) = bleeding",client->bleeding); //G_Printf("(%d) = bleeding",client->bleeding);
@ -2038,6 +2061,8 @@ qboolean CanDamage (gentity_t *targ, vec3_t origin) {
/* /*
============ ============
G_RadiusDamage G_RadiusDamage
Elder: this sucker needed a lot of minor tweaks to behave like AQ2
============ ============
*/ */
qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, float radius, qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, float radius,
@ -2083,7 +2108,8 @@ qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, floa
} }
dist = VectorLength( v ); dist = VectorLength( v );
if ( dist >= radius ) { //if ( dist >= radius ) {
if ( dist > radius ) {
continue; continue;
} }
// Q2 radius damage // Q2 radius damage
@ -2094,7 +2120,7 @@ qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, floa
//Elder: reduce grenade damage if crouching //Elder: reduce grenade damage if crouching
if (ent->r.maxs[2] < 20) if (ent->r.maxs[2] < 20)
{ {
points = points * 0.5; // hefty reduction in damage points = points * 0.5f; // hefty reduction in damage
} }
if( CanDamage (ent, origin) ) { if( CanDamage (ent, origin) ) {
@ -2104,9 +2130,9 @@ qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, floa
VectorSubtract (ent->r.currentOrigin, origin, dir); VectorSubtract (ent->r.currentOrigin, origin, dir);
// push the center of mass higher than the origin so players // push the center of mass higher than the origin so players
// get knocked into the air more // get knocked into the air more
dir[2] += 24; // dir[2] += 24;
G_Damage (ent, NULL, attacker, dir, origin, (int)points, DAMAGE_RADIUS, mod); G_Damage (ent, NULL, attacker, dir, origin, (int)(points * 0.75f), DAMAGE_RADIUS, mod);
} }
} }

View file

@ -312,14 +312,17 @@ int Pickup_Weapon (gentity_t *ent, gentity_t *other, int bandolierFactor) {
// add the weapon if not knife or pistol // add the weapon if not knife or pistol
if (ent->item->giTag != WP_KNIFE || ent->item->giTag != WP_PISTOL) if (ent->item->giTag != WP_KNIFE || ent->item->giTag != WP_PISTOL)
{
other->client->weaponCount[ent->item->giTag]++;
other->client->ps.stats[STAT_WEAPONS] |= ( 1 << ent->item->giTag ); other->client->ps.stats[STAT_WEAPONS] |= ( 1 << ent->item->giTag );
}
// Begin Duffman - Adds a clip for each weapon picked up, will want to edit this later // Begin Duffman - Adds a clip for each weapon picked up, will want to edit this later
/*Add_Ammo( other, ent->item->giTag, quantity );*/ /*Add_Ammo( other, ent->item->giTag, quantity );*/
switch (ent->item->giTag) switch (ent->item->giTag)
{ {
case WP_KNIFE: case WP_KNIFE:
if (other->client->ps.ammo[WP_KNIFE] < RQ3_KNIFE_MAXCLIP) if (other->client->ps.ammo[WP_KNIFE] < RQ3_KNIFE_MAXCLIP * bandolierFactor)
{ {
//G_Printf("(%d)\n",other->client->ps.ammo[ent->item->giTag]); //G_Printf("(%d)\n",other->client->ps.ammo[ent->item->giTag]);
ammotoadd = other->client->ps.ammo[WP_KNIFE] + 1; ammotoadd = other->client->ps.ammo[WP_KNIFE] + 1;
@ -642,8 +645,8 @@ void Touch_Item (gentity_t *ent, gentity_t *other, trace_t *trace) {
case WP_MP5: case WP_MP5:
case WP_M4: case WP_M4:
case WP_SSG3000: case WP_SSG3000:
//Elder: check to see if it's in mid-air //Elder: check to see if it's in mid-air or over the limit
if (other->client->uniqueWeapons >= g_RQ3_maxWeapons.integer || if (other->client->uniqueWeapons >= g_RQ3_maxWeapons.integer + (bandolierFactor - 1) ||
ent->s.pos.trDelta[2] != 0) ent->s.pos.trDelta[2] != 0)
return; return;
break; break;

View file

@ -393,7 +393,8 @@ struct gclient_s {
// Begin Duffman // Begin Duffman
int numClips[MAX_WEAPONS]; // Number of clips each weapon has int numClips[MAX_WEAPONS]; // Number of clips each weapon has
// End Duffman // End Duffman
int weaponCount[WP_NUM_WEAPONS]; // Elder: for duplicate unique weapon tracking
qboolean openDoor; //Blaze: used to hold if someone has hit opendoor key qboolean openDoor; //Blaze: used to hold if someone has hit opendoor key
int openDoorTime; int openDoorTime;

View file

@ -1383,7 +1383,9 @@ MK23 Attack
*/ */
void Weapon_MK23_Fire(gentity_t *ent) void Weapon_MK23_Fire(gentity_t *ent)
{ {
float spread; int i;
float spread;
// Homer: increment burst if needed // Homer: increment burst if needed
if ( (ent->client->ps.persistant[PERS_WEAPONMODES] & RQ3_MK23MODE) == RQ3_MK23MODE ) if ( (ent->client->ps.persistant[PERS_WEAPONMODES] & RQ3_MK23MODE) == RQ3_MK23MODE )
{ {
@ -1395,7 +1397,6 @@ void Weapon_MK23_Fire(gentity_t *ent)
spread = PISTOL_SPREAD; spread = PISTOL_SPREAD;
} }
Bullet_Fire( ent, RQ3_Spread(ent, spread), PISTOL_DAMAGE, MOD_PISTOL); Bullet_Fire( ent, RQ3_Spread(ent, spread), PISTOL_DAMAGE, MOD_PISTOL);
} }
/* /*

View file

@ -1,34 +1,37 @@
// Elder: we have to seriously repair this file
#define INVENTORY_NONE 0 #define INVENTORY_NONE 0
//armor //armor
#define INVENTORY_ARMOR 1 #define INVENTORY_ARMOR 1
//weapons //weapons
#define INVENTORY_KNIFE 4 #define INVENTORY_KNIFE 4 // was gauntlet
//Blaze: I use this later for the reaction shotgun #define INVENTORY_M3 5 // was shotgun
#define INVENTORY_PISTOL 5 #define INVENTORY_PISTOL 6 // was machinegun
#define INVENTORY_M4 6 #define INVENTORY_GRENADE 7 // was grenade launcher
#define INVENTORY_SSG3000 7 #define INVENTORY_HANDCANNON 8 // was rocket launcher
#define INVENTORY_MP5 8 #define INVENTORY_AKIMBO 9 // was lightning gun
#define INVENTORY_HANDCANNON 9 #define INVENTORY_SSG3000 10 // was railgun
#define INVENTORY_M3 10 #define INVENTORY_MP5 11 // was plasma gun
#define INVENTORY_AKIMBO 11 #define INVENTORY_M4 13 // was BFG10K
#define INVENTORY_GRENADE 13 /*
//#define INVENTORY_GRAPPLINGHOOK 14 #define INVENTORY_GRAPPLINGHOOK 14
//#define INVENTORY_NAILGUN 15 #define INVENTORY_NAILGUN 15
//#define INVENTORY_PROXLAUNCHER 16 #define INVENTORY_PROXLAUNCHER 16
//#define INVENTORY_CHAINGUN 17 #define INVENTORY_CHAINGUN 17
*/
//ammo //ammo
#define INVENTORY_KNIFEAMMO 14 #define INVENTORY_KNIFEAMMO 14
#define INVENTORY_PISTOLAMMO 15 #define INVENTORY_PISTOLAMMO 15
#define INVENTORY_M4AMMO 16 #define INVENTORY_M3AMMO 16
#define INVENTORY_SSG3000AMMO 17 #define INVENTORY_SSG3000AMMO 17
#define INVENTORY_MP5AMMO 18 #define INVENTORY_MP5AMMO 18
#define INVENTORY_HANDCANNONAMMO 19 #define INVENTORY_M4AMMO 19
#define INVENTORY_SHOTGUNAMMO 20 #define INVENTORY_HANDCANNONAMMO 20
#define INVENTORY_AKIMBOAMMO 21 #define INVENTORY_AKIMBOAMMO 21
#define INVENTORY_GRENADEAMMO 22 #define INVENTORY_GRENADEAMMO 22
// Duffman: I stold the below numbers for RQ3 Items // Duffman: I stole the below numbers for RQ3 Items
#define INVENTORY_KEVLAR 23 #define INVENTORY_KEVLAR 23
#define INVENTORY_LASER 24 #define INVENTORY_LASER 24
@ -49,6 +52,7 @@
#define INVENTORY_MINES 27 #define INVENTORY_MINES 27
#define INVENTORY_BELT 28 #define INVENTORY_BELT 28
*/ */
//powerups //powerups
#define INVENTORY_HEALTH 29 #define INVENTORY_HEALTH 29
#define INVENTORY_TELEPORTER 30 #define INVENTORY_TELEPORTER 30
@ -73,28 +77,6 @@
#define INVENTORY_REDCUBE 48 #define INVENTORY_REDCUBE 48
#define INVENTORY_BLUECUBE 49 #define INVENTORY_BLUECUBE 49
/*
#define INVENTORY_KNIFE 50
#define INVENTORY_PISTOL 51
#define INVENTORY_M4 52
#define INVENTORY_SSG3000 53
#define INVENTORY_MP5 54
#define INVENTORY_HANDCANNON 55
#define INVENTORY_M3 56
#define INVENTORY_AKIMBO 57
#define INVENTORY_GRENADE 58
#define INVENTORY_KNIFEAMMO 59
#define INVENTORY_PISTOLAMMO 60
#define INVENTORY_M4AMMO 61
#define INVENTORY_SSG3000AMMO 62
#define INVENTORY_MP5AMMO 63
#define INVENTORY_HANDCANNONAMMO 64
#define INVENTORY_SHOTGUNAMMO 65
#define INVENTORY_AKIMBOAMMO 66
#define INVENTORY_GRENADEAMMO 67
*/
//enemy stuff //enemy stuff
#define ENEMY_HORIZONTAL_DIST 200 #define ENEMY_HORIZONTAL_DIST 200
#define ENEMY_HEIGHT 201 #define ENEMY_HEIGHT 201
@ -109,6 +91,43 @@
#endif #endif
//item numbers (make sure they are in sync with bg_itemlist in bg_misc.c) //item numbers (make sure they are in sync with bg_itemlist in bg_misc.c)
#define MODELINDEX_KNIFE 1
#define MODELINDEX_PISTOL 2
#define MODELINDEX_M4 3
#define MODELINDEX_SSG3000 4
#define MODELINDEX_MP5 5
#define MODELINDEX_HANDCANNON 6
#define MODELINDEX_M3 7
#define MODELINDEX_AKIMBO 8
#define MODELINDEX_GRENADE 9
// Elder: these are not necessary but oh well
#define MODELINDEX_KNIFE_1ST 10
#define MODELINDEX_PISTOL_1ST 11
#define MODELINDEX_M4_1ST 12
#define MODELINDEX_SSG3000_1ST 13
#define MODELINDEX_MP5_1ST 14
#define MODELINDEX_HANDCANNON_1ST 15
#define MODELINDEX_M3_1ST 16
#define MODELINDEX_AKIMBO_1ST 17
#define MODELINDEX_GRENADE_1ST 18
#define MODELINDEX_PISTOLAMMO 19
#define MODELINDEX_M3AMMO 20
#define MODELINDEX_SSG3000AMMO 21
#define MODELINDEX_MP5AMMO 22
#define MODELINDEX_M4AMMO 23
// Elder: for CTB later?
#define MODELINDEX_REDFLAG 24
#define MODELINDEX_BLUEFLAG 25
#define MODELINDEX_KEVLAR 26
#define MODELINDEX_SILENCER 27
#define MODELINDEX_LASER 28
#define MODELINDEX_BANDOLIER 29
#define MODELINDEX_SLIPPERS 30
/*
#define MODELINDEX_ARMORSHARD 1 #define MODELINDEX_ARMORSHARD 1
#define MODELINDEX_ARMORCOMBAT 2 #define MODELINDEX_ARMORCOMBAT 2
#define MODELINDEX_ARMORBODY 3 #define MODELINDEX_ARMORBODY 3
@ -171,7 +190,7 @@
#define MODELINDEX_NAILGUN 49 #define MODELINDEX_NAILGUN 49
#define MODELINDEX_PROXLAUNCHER 50 #define MODELINDEX_PROXLAUNCHER 50
#define MODELINDEX_CHAINGUN 51 #define MODELINDEX_CHAINGUN 51
*/
// //
#define WEAPONINDEX_KNIFE 1 #define WEAPONINDEX_KNIFE 1
@ -183,7 +202,8 @@
#define WEAPONINDEX_M3 7 #define WEAPONINDEX_M3 7
#define WEAPONINDEX_AKIMBO 8 #define WEAPONINDEX_AKIMBO 8
#define WEAPONINDEX_GRENADE 9 #define WEAPONINDEX_GRENADE 9
/*#define WEAPONINDEX_GRAPPLING_HOOK 10 /*
#define WEAPONINDEX_GRAPPLING_HOOK 10
#define WEAPONINDEX_NAILGUN 11 #define WEAPONINDEX_NAILGUN 11
#define WEAPONINDEX_PROXLAUNCHER 12 #define WEAPONINDEX_PROXLAUNCHER 12
#define WEAPONINDEX_CHAINGUN 13 #define WEAPONINDEX_CHAINGUN 13

View file

@ -64,13 +64,13 @@ void CheckBleeding(gentity_t *targ)
vec3_t bleedOrigin; vec3_t bleedOrigin;
targ->client->bleed_delay = level.time + 2000; // 2 seconds targ->client->bleed_delay = level.time + 2000; // 2 seconds
VectorAdd(targ->client->bleedloc_offset, targ->r.absmax, bleedOrigin); VectorAdd(targ->client->bleedloc_offset, targ->client->ps.origin, bleedOrigin);
//gi.cprintf(ent, PRINT_HIGH, "Bleeding now.\n"); //gi.cprintf(ent, PRINT_HIGH, "Bleeding now.\n");
//EjectBlooder(ent, pos, pos); //EjectBlooder(ent, pos, pos);
// do bleeding // do bleeding
//tent = G_TempEntity(bleedOrigin, EV_EJECTBLOOD); tent = G_TempEntity(bleedOrigin, EV_EJECTBLOOD);
tent->s.otherEntityNum = targ->s.clientNum;
} }
} }
} }