diff --git a/reaction/game/ai_dmnet.c b/reaction/game/ai_dmnet.c index e1a17c9d..8371e203 100644 --- a/reaction/game/ai_dmnet.c +++ b/reaction/game/ai_dmnet.c @@ -1282,7 +1282,7 @@ int BotSelectActivateWeapon(bot_state_t *bs) { // if (bs->inventory[INVENTORY_PISTOL] > 0 && bs->inventory[INVENTORY_PISTOLAMMO] > 0) 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; else if (bs->inventory[INVENTORY_M4] > 0 && bs->inventory[INVENTORY_M4AMMO] > 0) return WEAPONINDEX_M4; @@ -1296,8 +1296,10 @@ int BotSelectActivateWeapon(bot_state_t *bs) { #endif else if (bs->inventory[INVENTORY_SSG3000] > 0 && bs->inventory[INVENTORY_SSG3000AMMO] > 0) 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; + else if (bs->inventory[INVENTORY_AKIMBO] > 0 && bs->inventory[INVENTORY_AKIMBOAMMO] > 0) + return WEAPONINDEX_AKIMBO; else { return -1; } diff --git a/reaction/game/ai_dmq3.c b/reaction/game/ai_dmq3.c index f9a2142b..bc60bba8 100644 --- a/reaction/game/ai_dmq3.c +++ b/reaction/game/ai_dmq3.c @@ -1709,7 +1709,7 @@ void BotUpdateInventory(bot_state_t *bs) { bs->inventory[INVENTORY_ARMOR] = bs->cur_ps.stats[STAT_ARMOR]; //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_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; @@ -1725,8 +1725,8 @@ void BotUpdateInventory(bot_state_t *bs) { bs->inventory[INVENTORY_SSG3000AMMO] = bs->cur_ps.ammo[WP_SSG3000]; bs->inventory[INVENTORY_MP5AMMO] = bs->cur_ps.ammo[WP_MP5]; //Blaze: Same ammo for shotgun and handcannon - bs->inventory[INVENTORY_SHOTGUNAMMO] = 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_HANDCANNON]; + bs->inventory[INVENTORY_M3AMMO] = bs->cur_ps.ammo[WP_M3]; //Blaze: Same ammo for Pistol and Akimbo Pistols bs->inventory[INVENTORY_PISTOLAMMO] = bs->cur_ps.ammo[WP_AKIMBO]; 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]; //powerups 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_MEDKIT] = bs->cur_ps.stats[STAT_HOLDABLE_ITEM] == MODELINDEX_MEDKIT; + //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; #ifdef MISSIONPACK 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; @@ -2192,13 +2192,16 @@ float BotAggression(bot_state_t *bs) { //if the bot is very low on health if (bs->inventory[INVENTORY_HEALTH] < 60) return 0; //if the bot is low on health + // Elder: ignore armor checks + /* if (bs->inventory[INVENTORY_HEALTH] < 80) { //if the bot has insufficient armor 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 && - bs->inventory[INVENTORY_SHOTGUNAMMO] > 2) return 100; + bs->inventory[INVENTORY_HANDCANNONAMMO] >= 2) return 100; //if the bot can use the Sniper if (bs->inventory[INVENTORY_SSG3000] > 0 && bs->inventory[INVENTORY_SSG3000] > 3) return 95; @@ -2210,10 +2213,13 @@ float BotAggression(bot_state_t *bs) { bs->inventory[INVENTORY_M4AMMO] > 5) return 90; //if the bot can use the plasmagun 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 (bs->inventory[INVENTORY_GRENADE] > 0 && 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 (bs->inventory[INVENTORY_SHOTGUN] > 0 && // bs->inventory[INVENTORY_SHELLS] > 10) return 50; @@ -2419,7 +2425,7 @@ int BotHasPersistantPowerupAndWeapon(bot_state_t *bs) { bs->inventory[INVENTORY_MP5AMMO] > 50) return qtrue; //if the bot can use the rocketlauncher 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 && 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 (BotAggression(bs) < 50) return qfalse; //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_SSG3000] <= 0 || bs->inventory[INVENTORY_SSG3000AMMO] < 10)) { + (bs->inventory[INVENTORY_SSG3000] <= 0 || bs->inventory[INVENTORY_SSG3000AMMO] < 6)) { return qfalse; } //find the closest camp spot diff --git a/reaction/game/bg_misc.c b/reaction/game/bg_misc.c index a36e9e97..a2753a3b 100644 --- a/reaction/game/bg_misc.c +++ b/reaction/game/bg_misc.c @@ -416,24 +416,6 @@ gitem_t bg_itemlist[] = /* 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 */ { diff --git a/reaction/game/bg_pmove.c b/reaction/game/bg_pmove.c index 415fcb00..037c24dd 100644 --- a/reaction/game/bg_pmove.c +++ b/reaction/game/bg_pmove.c @@ -1842,8 +1842,12 @@ static void PM_BeginWeaponChange( int weapon ) { pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_SSG3000 || 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); + else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)) + PM_StartWeaponAnim(WP_ANIM_THROWDISARM); } // Elder: cancel reload stuff here @@ -1860,8 +1864,12 @@ static void PM_BeginWeaponChange( int weapon ) { pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_SSG3000 || 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); + else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)) + PM_StartWeaponAnim(WP_ANIM_THROWDISARM); PM_StartTorsoAnim( TORSO_DROP ); } @@ -1937,9 +1945,13 @@ static void PM_FinishWeaponChange( void ) { pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_SSG3000 || 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); - + else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)) + PM_StartWeaponAnim(WP_ANIM_THROWACTIVATE); + PM_StartTorsoAnim( TORSO_RAISE ); } @@ -1961,13 +1973,20 @@ static void PM_TorsoAnimation( void ) { // QUARANTINE - Weapon Animation // Should always draw the weapon when it is just ready //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_HANDCANNON || pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_M4 || - pm->ps->weapon == WP_AKIMBO) - PM_ContinueWeaponAnim( WP_ANIM_IDLE ); + 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); + // PM_ContinueWeaponAnim( WP_ANIM_READY ); return; @@ -2070,7 +2089,7 @@ static void PM_Reload( void ) if (pm->ps->stats[STAT_RELOADTIME] > 0) { 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 { @@ -2082,7 +2101,7 @@ static void PM_Reload( void ) // add to reload queue and enable fast-reloads flag pm->ps->stats[STAT_RQ3] |= RQ3_FASTRELOADS; 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; } @@ -2223,19 +2242,19 @@ static void PM_Reload( void ) 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); } else { - Com_Printf("Negative event prevented\n"); + //Com_Printf("Negative event prevented\n"); pm->ps->stats[STAT_RELOADATTEMPTS] = 0; } } else { - Com_Printf("============= Locked out in continuous fast-reloads\n"); + //Com_Printf("============= Locked out in continuous fast-reloads\n"); } // finishing up fast reloads @@ -2251,7 +2270,7 @@ static void PM_Reload( void ) pm->ps->stats[STAT_RQ3] &= ~RQ3_FASTRELOADS; // lock fast-reloads during finish delay pm->ps->stats[STAT_RQ3] |= RQ3_LOCKRELOADS; - Com_Printf("<<<<<<<<<<<<< Locking\n"); + //Com_Printf("<<<<<<<<<<<<< Locking\n"); } return; @@ -2263,12 +2282,12 @@ static void PM_Reload( void ) // unlock if (pm->ps->stats[STAT_RQ3] & RQ3_LOCKRELOADS) { - Com_Printf(">>>>>>>>>>>>> Unlocking\n"); + //Com_Printf(">>>>>>>>>>>>> Unlocking\n"); pm->ps->stats[STAT_RQ3] &= ~RQ3_LOCKRELOADS; } else { - Com_Printf("Sending event from normal reload\n"); + //Com_Printf("Sending event from normal reload\n"); PM_AddEvent(EV_RELOAD_WEAPON2); } @@ -2428,14 +2447,23 @@ static void PM_Weapon( void ) { else { //Elder: temp hack - if (pm->ps->weaponstate == WEAPON_READY && - (pm->ps->weapon == WP_PISTOL || - pm->ps->weapon == WP_M3 || - pm->ps->weapon == WP_HANDCANNON || - pm->ps->weapon == WP_SSG3000 || - pm->ps->weapon == WP_M4 || - pm->ps->weapon == WP_AKIMBO)) - PM_ContinueWeaponAnim(WP_ANIM_IDLE); + if (pm->ps->weaponstate == WEAPON_READY) + { + 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_HANDCANNON || + 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 // PM_StartWeaponAnim( WP_ANIM_READY ); // 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_HANDCANNON || pm->ps->weapon == WP_SSG3000 || 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 ); + else if (pm->ps->weapon == WP_KNIFE && !(pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE)) + PM_StartWeaponAnim( WP_ANIM_THROWIDLE ); return; } @@ -2494,6 +2528,7 @@ static void PM_Weapon( void ) { pm->ps->weaponTime = 0; // put it in the "cocked" position pm->ps->weaponstate = WEAPON_COCKED; + PM_StartWeaponAnim(WP_ANIM_EXTRA1); return; } @@ -2554,6 +2589,11 @@ static void PM_Weapon( void ) { // pm->ps->weaponstate = WEAPON_READY; // return; // } + if (pm->ps->persistant[PERS_WEAPONMODES] & RQ3_KNIFEMODE) + PM_StartWeaponAnim( WP_ANIM_FIRE ); + else + PM_StartWeaponAnim( WP_ANIM_THROWFIRE ); + PM_StartTorsoAnim( TORSO_ATTACK2 ); } else { // 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 // Elder: don't repeat if on semi-auto // 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_HANDCANNON || pm->ps->weapon == WP_SSG3000 || pm->ps->weapon == WP_M4 || - pm->ps->weapon == WP_AKIMBO) + pm->ps->weapon == WP_GRENADE) PM_StartWeaponAnim( WP_ANIM_FIRE ); } } @@ -3248,7 +3294,9 @@ void PmoveSingle (pmove_t *pmove) { pm->ps->weapon == WP_HANDCANNON || pm->ps->weapon == WP_SSG3000 || 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(); // torso animation diff --git a/reaction/game/bg_public.h b/reaction/game/bg_public.h index 10cf9baa..37c93330 100644 --- a/reaction/game/bg_public.h +++ b/reaction/game/bg_public.h @@ -43,7 +43,7 @@ #define MINS_Z -24 #define DEFAULT_VIEWHEIGHT 22 //#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 12 #define DEAD_VIEWHEIGHT -16 @@ -187,8 +187,8 @@ typedef enum { #define SLASH_DAMAGE 200 //Shashing knife damage #define THROW_DAMAGE 250 //Throwing Knife damage #define GRENADE_DAMAGE 170 -#define GRENADE_SPLASH_DAMAGE 170 -#define GRENADE_SPLASH_RADIUS 340 //340 Splash damage * 2 +#define GRENADE_SPLASH_DAMAGE 170 +#define GRENADE_SPLASH_RADIUS 340 //Damage * 2 #define PISTOL_SPREAD 140 #define MP5_SPREAD 250 @@ -222,7 +222,7 @@ typedef enum { #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_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_KNIFE_DELAY 800 #define RQ3_THROW_DELAY 800 @@ -374,7 +374,7 @@ typedef enum { typedef enum { 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_DROPPING, //sync with WP_ANIM_DISARM WEAPON_FIRING, //sync with WP_ANIM_FIRE @@ -389,9 +389,14 @@ typedef enum { WP_ANIM_IDLE, WP_ANIM_DISARM, WP_ANIM_ACTIVATE, - //WP_ANIM_EMPTY, - //WP_ANIM_EXTRA1, - //WP_ANIM_EXTRA2, + WP_ANIM_EMPTY, + WP_ANIM_EXTRA1, // e.g. grenade pulling pin, fast-reload, knife slash to throw switch + 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 } wpAnimNumber_t; diff --git a/reaction/game/g_active.c b/reaction/game/g_active.c index 6735996f..6e79a574 100644 --- a/reaction/game/g_active.c +++ b/reaction/game/g_active.c @@ -911,19 +911,30 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow ) weap = 0; if (client->uniqueWeapons > 0) { - weap = client->ps.stats[STAT_WEAPONS]; - if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M4) ) == (1 << WP_M4)) - weap = WP_M4; - if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M3) ) == (1 << WP_M3)) - weap = WP_M3; - if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_MP5) ) == (1 << WP_MP5)) - 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; + if (client->ps.weapon == WP_AKIMBO || + client->ps.weapon == WP_PISTOL || + client->ps.weapon == WP_GRENADE || + client->ps.weapon == WP_KNIFE || + client->ps.weapon == WP_NONE) // shouldn't have to worry about NONE, but just in case + { + weap = client->ps.stats[STAT_WEAPONS]; + if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M4) ) == (1 << WP_M4)) + weap = WP_M4; + if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_M3) ) == (1 << WP_M3)) + weap = WP_M3; + if ((client->ps.stats[STAT_WEAPONS] & (1 << WP_MP5) ) == (1 << WP_MP5)) + 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 ); @@ -941,7 +952,10 @@ int ThrowWeapon( gentity_t *ent, qboolean forceThrow ) 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->count= -1; // XRAY FMJ 0 is already taken, -1 means no ammo client->uniqueWeapons--; diff --git a/reaction/game/g_cmds.c b/reaction/game/g_cmds.c index 06d52a13..bfc69d02 100644 --- a/reaction/game/g_cmds.c +++ b/reaction/game/g_cmds.c @@ -1651,6 +1651,9 @@ void Cmd_Stats_f( 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" 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\"")); @@ -1682,11 +1685,18 @@ void Cmd_Bandage (gentity_t *ent) ent->client->ps.weapon == WP_HANDCANNON || ent->client->ps.weapon == WP_SSG3000 || 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 ) ^ 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 ent->client->ps.torsoAnim = ( ( ent->client->ps.torsoAnim & ANIM_TOGGLEBIT ) @@ -1720,6 +1730,9 @@ void Cmd_Reload( gentity_t *ent ) int ammotoadd; int delay = 0; + if (ent->client->ps.pm_type == PM_SPECTATOR) + return; + //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 @@ -2114,8 +2127,8 @@ void Cmd_OpenDoor(gentity_t *ent) //Use_BinaryMover( ent->parent, ent, other ); gentity_t *door = NULL; - //Don't open doors if dead - if (ent->client->ps.stats[STAT_HEALTH] <= 0) + //Don't open doors if dead or spectating + if (ent->client->ps.stats[STAT_HEALTH] <= 0 || ent->client->ps.pm_type == PM_SPECTATOR) return; while ((door = findradius(door,ent->r.currentOrigin,100)) != NULL) @@ -2144,6 +2157,9 @@ void toggleSemi(gentity_t *ent){ /* Hawkins. Reaction weapon command */ void Cmd_Weapon(gentity_t *ent) { + if (ent->client->ps.pm_type == PM_SPECTATOR) + return; + //Elder: debug code //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 ) { - + + if (ent->client->ps.pm_type == PM_SPECTATOR) + return; //Elder: added -- checked in cgame //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 ) { + if (ent->client->ps.pm_type == PM_SPECTATOR) + return; + if (ent->client->ps.stats[STAT_HOLDABLE_ITEM]) { //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; if (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 else if (bg_itemlist[ent->client->ps.stats[STAT_HOLDABLE_ITEM]].giTag == HI_LASER) diff --git a/reaction/game/g_combat.c b/reaction/game/g_combat.c index 333a838d..c75b38d3 100644 --- a/reaction/game/g_combat.c +++ b/reaction/game/g_combat.c @@ -110,43 +110,63 @@ void TossClientItems( gentity_t *self ) { //as opposed to dropping it, then died if ( (weaponInventory & (1 << WP_M3) ) == (1 << WP_M3) ) { - item = BG_FindItemForWeapon( WP_M3 ); - Drop_Item( self, item, angle); - self->client->pers.hadUniqueWeapon[ WP_M3 ] = qfalse; - self->client->uniqueWeapons--; - angle += 30; + while ( self->client->weaponCount[WP_M3] ) + { + item = BG_FindItemForWeapon( WP_M3 ); + Drop_Item( self, item, angle); + 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) ) { - item = BG_FindItemForWeapon( WP_M4 ); - Drop_Item( self, item, angle); - self->client->pers.hadUniqueWeapon[ WP_M4 ] = qfalse; - self->client->uniqueWeapons--; - angle += 30; + while ( self->client->weaponCount[WP_M4] ) + { + item = BG_FindItemForWeapon( WP_M4 ); + Drop_Item( self, item, angle); + 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) ) { - item = BG_FindItemForWeapon( WP_MP5 ); - Drop_Item( self, item, angle); - self->client->pers.hadUniqueWeapon[ WP_MP5 ] = qfalse; - self->client->uniqueWeapons--; - angle += 30; + while ( self->client->weaponCount[WP_MP5] ) + { + item = BG_FindItemForWeapon( WP_MP5 ); + Drop_Item( self, item, angle); + 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) ) { - item = BG_FindItemForWeapon( WP_HANDCANNON ); - Drop_Item( self, item, angle); - self->client->pers.hadUniqueWeapon[ WP_HANDCANNON ] = qfalse; - self->client->uniqueWeapons--; - angle += 30; + while ( self->client->weaponCount[WP_HANDCANNON] ) + { + item = BG_FindItemForWeapon( WP_HANDCANNON ); + Drop_Item( self, item, angle); + 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) ) { - item = BG_FindItemForWeapon( WP_SSG3000 ); - Drop_Item( self, item, angle); - self->client->pers.hadUniqueWeapon[ WP_SSG3000 ] = qfalse; - self->client->uniqueWeapons--; - angle += 30; + while ( self->client->weaponCount[WP_SSG3000] ) + { + item = BG_FindItemForWeapon( WP_SSG3000 ); + Drop_Item( self, item, angle); + self->client->pers.hadUniqueWeapon[ WP_SSG3000 ] = qfalse; + self->client->uniqueWeapons--; + angle += 30; + self->client->weaponCount[WP_SSG3000]--; + } } //Elder: Always drop the pistol @@ -1961,8 +1981,11 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, realBleedTime = BLEED_TIME; client->bleeding += take * realBleedTime; - - VectorSubtract (point, targ->r.absmax, targ->client->bleedloc_offset); + // Elder: Splash damage bleeding happens from the origin + 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) = bleeding",client->bleeding); @@ -2038,6 +2061,8 @@ qboolean CanDamage (gentity_t *targ, vec3_t origin) { /* ============ 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, @@ -2083,7 +2108,8 @@ qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, floa } dist = VectorLength( v ); - if ( dist >= radius ) { + //if ( dist >= radius ) { + if ( dist > radius ) { continue; } // 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 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) ) { @@ -2104,9 +2130,9 @@ qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, floa VectorSubtract (ent->r.currentOrigin, origin, dir); // push the center of mass higher than the origin so players // 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); } } diff --git a/reaction/game/g_items.c b/reaction/game/g_items.c index 1019a3ee..015ae975 100644 --- a/reaction/game/g_items.c +++ b/reaction/game/g_items.c @@ -312,14 +312,17 @@ int Pickup_Weapon (gentity_t *ent, gentity_t *other, int bandolierFactor) { // add the weapon if not knife or 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 ); + } // Begin Duffman - Adds a clip for each weapon picked up, will want to edit this later /*Add_Ammo( other, ent->item->giTag, quantity );*/ switch (ent->item->giTag) { 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]); 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_M4: case WP_SSG3000: - //Elder: check to see if it's in mid-air - if (other->client->uniqueWeapons >= g_RQ3_maxWeapons.integer || + //Elder: check to see if it's in mid-air or over the limit + if (other->client->uniqueWeapons >= g_RQ3_maxWeapons.integer + (bandolierFactor - 1) || ent->s.pos.trDelta[2] != 0) return; break; diff --git a/reaction/game/g_local.h b/reaction/game/g_local.h index a95f413a..d9b980e3 100644 --- a/reaction/game/g_local.h +++ b/reaction/game/g_local.h @@ -393,7 +393,8 @@ struct gclient_s { // Begin Duffman int numClips[MAX_WEAPONS]; // Number of clips each weapon has // 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 int openDoorTime; diff --git a/reaction/game/g_weapon.c b/reaction/game/g_weapon.c index 2cbc95fb..3a9fa370 100644 --- a/reaction/game/g_weapon.c +++ b/reaction/game/g_weapon.c @@ -1383,7 +1383,9 @@ MK23 Attack */ void Weapon_MK23_Fire(gentity_t *ent) { - float spread; + int i; + float spread; + // Homer: increment burst if needed 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; } Bullet_Fire( ent, RQ3_Spread(ent, spread), PISTOL_DAMAGE, MOD_PISTOL); - } /* diff --git a/reaction/game/inv.h b/reaction/game/inv.h index 9377e003..ad11d116 100644 --- a/reaction/game/inv.h +++ b/reaction/game/inv.h @@ -1,34 +1,37 @@ +// Elder: we have to seriously repair this file #define INVENTORY_NONE 0 //armor #define INVENTORY_ARMOR 1 //weapons -#define INVENTORY_KNIFE 4 -//Blaze: I use this later for the reaction shotgun -#define INVENTORY_PISTOL 5 -#define INVENTORY_M4 6 -#define INVENTORY_SSG3000 7 -#define INVENTORY_MP5 8 -#define INVENTORY_HANDCANNON 9 -#define INVENTORY_M3 10 -#define INVENTORY_AKIMBO 11 -#define INVENTORY_GRENADE 13 -//#define INVENTORY_GRAPPLINGHOOK 14 -//#define INVENTORY_NAILGUN 15 -//#define INVENTORY_PROXLAUNCHER 16 -//#define INVENTORY_CHAINGUN 17 +#define INVENTORY_KNIFE 4 // was gauntlet +#define INVENTORY_M3 5 // was shotgun +#define INVENTORY_PISTOL 6 // was machinegun +#define INVENTORY_GRENADE 7 // was grenade launcher +#define INVENTORY_HANDCANNON 8 // was rocket launcher +#define INVENTORY_AKIMBO 9 // was lightning gun +#define INVENTORY_SSG3000 10 // was railgun +#define INVENTORY_MP5 11 // was plasma gun +#define INVENTORY_M4 13 // was BFG10K +/* +#define INVENTORY_GRAPPLINGHOOK 14 +#define INVENTORY_NAILGUN 15 +#define INVENTORY_PROXLAUNCHER 16 +#define INVENTORY_CHAINGUN 17 +*/ + //ammo #define INVENTORY_KNIFEAMMO 14 #define INVENTORY_PISTOLAMMO 15 -#define INVENTORY_M4AMMO 16 +#define INVENTORY_M3AMMO 16 #define INVENTORY_SSG3000AMMO 17 #define INVENTORY_MP5AMMO 18 -#define INVENTORY_HANDCANNONAMMO 19 -#define INVENTORY_SHOTGUNAMMO 20 +#define INVENTORY_M4AMMO 19 +#define INVENTORY_HANDCANNONAMMO 20 #define INVENTORY_AKIMBOAMMO 21 #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_LASER 24 @@ -49,6 +52,7 @@ #define INVENTORY_MINES 27 #define INVENTORY_BELT 28 */ + //powerups #define INVENTORY_HEALTH 29 #define INVENTORY_TELEPORTER 30 @@ -73,28 +77,6 @@ #define INVENTORY_REDCUBE 48 #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 #define ENEMY_HORIZONTAL_DIST 200 #define ENEMY_HEIGHT 201 @@ -109,6 +91,43 @@ #endif //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_ARMORCOMBAT 2 #define MODELINDEX_ARMORBODY 3 @@ -171,7 +190,7 @@ #define MODELINDEX_NAILGUN 49 #define MODELINDEX_PROXLAUNCHER 50 #define MODELINDEX_CHAINGUN 51 - +*/ // #define WEAPONINDEX_KNIFE 1 @@ -183,7 +202,8 @@ #define WEAPONINDEX_M3 7 #define WEAPONINDEX_AKIMBO 8 #define WEAPONINDEX_GRENADE 9 -/*#define WEAPONINDEX_GRAPPLING_HOOK 10 +/* +#define WEAPONINDEX_GRAPPLING_HOOK 10 #define WEAPONINDEX_NAILGUN 11 #define WEAPONINDEX_PROXLAUNCHER 12 #define WEAPONINDEX_CHAINGUN 13 diff --git a/reaction/game/rxn_game.c b/reaction/game/rxn_game.c index ffe2d58b..85ec1121 100644 --- a/reaction/game/rxn_game.c +++ b/reaction/game/rxn_game.c @@ -64,13 +64,13 @@ void CheckBleeding(gentity_t *targ) vec3_t bleedOrigin; 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"); //EjectBlooder(ent, pos, pos); // do bleeding - //tent = G_TempEntity(bleedOrigin, EV_EJECTBLOOD); - + tent = G_TempEntity(bleedOrigin, EV_EJECTBLOOD); + tent->s.otherEntityNum = targ->s.clientNum; } } }