diff --git a/code/game/g_combat.c b/code/game/g_combat.c index 93ac6d7..4068c38 100644 --- a/code/game/g_combat.c +++ b/code/game/g_combat.c @@ -30,11 +30,6 @@ void AddScore( gentity_t *ent, int score ) { return; } - // no scoring during pre-match warmup - //RPG-X: RedTechie - No warmup! - /*if ( level.warmupTime ) { - return; - }*/ ent->client->ps.persistant[PERS_SCORE] += score; //don't add score to team score during elimination if (g_gametype.integer == GT_TEAM) @@ -68,14 +63,9 @@ void SetScore( gentity_t *ent, int score ) { return; } - // no scoring during pre-match warmup - //RPG-X: RedTechie - No warmup! - /*if ( level.warmupTime ) { - return; - }*/ ent->client->ps.persistant[PERS_SCORE] = score; CalculateRanks( qfalse ); - + // TiM: send the current scoring to all clients SendScoreboardMessageToAllClients(); @@ -91,7 +81,6 @@ Toss the weapon and powerups for the killed player */ void TossClientItems( gentity_t *self, qboolean dis_con ) { gitem_t *item; -// int weapon; float angle; int i; int times; @@ -113,11 +102,6 @@ void TossClientItems( gentity_t *self, qboolean dis_con ) { // remove the evosuit powerup ps->powerups[PW_EVOSUIT] = level.time; } - //RPG-X | TiM - /*if (self->flags & FL_HOLSTER) { - // remove the evosuit powerup - ps->powerups[PW_BOLTON] = level.time; - }*/ // drop all the powerups if not in teamplay if ( g_gametype.integer != GT_TEAM ) { @@ -128,15 +112,7 @@ void TossClientItems( gentity_t *self, qboolean dis_con ) { if ( !item ) { continue; } - //if ( g_pModSpecialties.integer != 0 || self->client->sess.sessionClass == PC_BORG ) - //{//in playerclass game mode - // if ( item->giType != IT_TEAM ) - // {//only drop the flag - // continue; - // } - //} - //Com_Printf( "Dropped!\n"); drop = Drop_Item( self, item, angle ); // decide how many seconds it has left drop->count = ( ps->powerups[ i ] - level.time ) / 1000; @@ -160,12 +136,12 @@ void TossClientItems( gentity_t *self, qboolean dis_con ) { if ( Max_Weapons[i] == NULL) { continue; } - + //RPG-X | GSIO01 | 08/05/2009: let's make sure we only drop weapons the player has item = NULL; if(ps->ammo[i]) { times = ps->ammo[i]; - item = BG_FindItemForWeapon(i); + item = BG_FindItemForWeapon((weapon_t)i); while ( times --> 0 ) { // the 'goes towards' operator :p Drop_Item( self, item, 0 ); } @@ -173,12 +149,12 @@ void TossClientItems( gentity_t *self, qboolean dis_con ) { } // then remove weapons - + for (i = 0; i < WP_NUM_WEAPONS; ++i) { ps->stats[STAT_WEAPONS] &= ~i; ps->ammo[i] = 0; } - + } @@ -207,16 +183,13 @@ void body_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int d if ( self->health > GIB_HEALTH_IMPOSSIBLE ) { return; } - + }else{ if ( self->health > GIB_HEALTH ) { return; } } - //RPG-X: RedTechie - only gib if rpg_medicsrevive is off - //if(rpg_medicsrevive.integer == 0){ - GibEntity( self, 0 ); - //} + GibEntity( self, 0 ); } @@ -264,7 +237,7 @@ char *modNames[MOD_MAX] = { "MOD_DETPACK", "MOD_SEEKER" -//expansion pack + //expansion pack "MOD_KNOCKOUT", "MOD_ASSIMILATE", "MOD_BORG", @@ -295,657 +268,544 @@ void player_die( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int contents = trap_PointContents( self->r.currentOrigin, -1 ); if(rpg_medicsrevive.integer == 1 && !( contents & CONTENTS_NODROP ) && (meansOfDeath != MOD_TRIGGER_HURT)){ - //static int deathNum; - int anim; - char *classname = NULL; - gentity_t *detpack = NULL; - int killer; - char *killerName, *obit; - gentity_t *ent; - int i; - playerState_t *ps = &self->client->ps; - - //RPG-X: RedTechie - Blow up a detpack if some one placed it and died - classname = BG_FindClassnameForHoldable(HI_DETPACK); - if (classname) - { - while ((detpack = G_Find (detpack, FOFS(classname), classname)) != NULL) + int anim; + char *classname = NULL; + gentity_t *detpack = NULL; + int killer; + char *killerName, *obit; + gentity_t *ent; + int i; + playerState_t *ps = &self->client->ps; + + //RPG-X: RedTechie - Blow up a detpack if some one placed it and died + classname = BG_FindClassnameForHoldable(HI_DETPACK); + if (classname) { - if (detpack->parent == self) + while ((detpack = G_Find (detpack, FOFS(classname), classname)) != NULL) { - detpack->think = DetonateDetpack; // Detonate next think. - detpack->nextthink = level.time; + if (detpack->parent == self) + { + detpack->think = DetonateDetpack; // Detonate next think. + detpack->nextthink = level.time; + } } } - } - //RPG-X: Redtechie - Do some score keeping witch we commented out and log - if ( attacker ) { - killer = attacker->s.number; - if ( attacker->client ) { - killerName = attacker->client->pers.netname; - } else { - killerName = ""; - } - } else { - killer = ENTITYNUM_WORLD; - killerName = ""; - } - - if ( killer < 0 || killer >= MAX_CLIENTS ) { - killer = ENTITYNUM_WORLD; - killerName = ""; - } - - if ( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) ) { - obit = ""; - } else { - obit = modNames[ meansOfDeath ]; - } - - G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n", - killer, self->s.number, meansOfDeath, killerName, - self->client->pers.netname, obit ); - - G_LogWeaponKill(killer, meansOfDeath); - G_LogWeaponDeath(self->s.number, self->s.weapon); - if (attacker && attacker->client && attacker->inuse) - { - G_LogWeaponFrag(killer, self->s.number); - } - - if ( meansOfDeath != MOD_RESPAWN && meansOfDeath != MOD_CUSTOM_DIE ) - { - // broadcast the death event to everyone - ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY ); - ent->s.eventParm = meansOfDeath; - ent->s.otherEntityNum = self->s.number; - ent->s.otherEntityNum2 = killer; - ent->r.svFlags = SVF_BROADCAST; // send to everyone - } - - self->enemy = attacker; - - ps->persistant[PERS_KILLED]++; - if (self == attacker) - { - self->client->pers.teamState.suicides++; - } else { - //RPG-X | Phenix | 06/04/2005 - // N00b Protection, you kill two people and puff your auto n00b! - + //RPG-X: Redtechie - Do some score keeping witch we commented out and log if ( attacker ) { + killer = attacker->s.number; if ( attacker->client ) { - if ( IsAdmin( attacker ) == qfalse ) { - attacker->n00bCount++; + killerName = attacker->client->pers.netname; + } else { + killerName = ""; + } + } else { + killer = ENTITYNUM_WORLD; + killerName = ""; + } - attacker->client->fraggerTime = level.time + (rpg_fraggerSpawnDelay.integer * 1000); + if ( killer < 0 || killer >= MAX_CLIENTS ) { + killer = ENTITYNUM_WORLD; + killerName = ""; + } - if (rpg_kickAfterXkills.integer < 1) - { - trap_SendServerCommand( attacker-g_entities, va("print \"^7Server: You have been caught n00bing, you have been temporary put in the n00b class.\n\"" ) ); - } else { - trap_SendServerCommand( attacker-g_entities, va("print \"^7Server: You have been caught n00bing, %i more times and you will be kicked.\n\"", (rpg_kickAfterXkills.integer - attacker->n00bCount) ) ); - } + if ( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) ) { + obit = ""; + } else { + obit = modNames[ meansOfDeath ]; + } - if ((attacker->n00bCount >= rpg_kickAfterXkills.integer) && (rpg_kickAfterXkills.integer != 0)) - { - /*for( i=0; g_classData[i].consoleName[0] && i < MAX_CLASSES; i++ ) + G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n", + killer, self->s.number, meansOfDeath, killerName, + self->client->pers.netname, obit ); + + G_LogWeaponKill(killer, meansOfDeath); + G_LogWeaponDeath(self->s.number, self->s.weapon); + if (attacker && attacker->client && attacker->inuse) + { + G_LogWeaponFrag(killer, self->s.number); + } + + if ( meansOfDeath != MOD_RESPAWN && meansOfDeath != MOD_CUSTOM_DIE ) + { + // broadcast the death event to everyone + ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY ); + ent->s.eventParm = meansOfDeath; + ent->s.otherEntityNum = self->s.number; + ent->s.otherEntityNum2 = killer; + ent->r.svFlags = SVF_BROADCAST; // send to everyone + } + + self->enemy = attacker; + + ps->persistant[PERS_KILLED]++; + if (self == attacker) + { + self->client->pers.teamState.suicides++; + } else { + //RPG-X | Phenix | 06/04/2005 + // N00b Protection, you kill two people and puff your auto n00b! + + if ( attacker ) { + if ( attacker->client ) { + if ( IsAdmin( attacker ) == qfalse ) { + attacker->n00bCount++; + + attacker->client->fraggerTime = level.time + (rpg_fraggerSpawnDelay.integer * 1000); + + if (rpg_kickAfterXkills.integer < 1) { - if ( g_classData[i].isn00b) { - char conName[15]; - trap_Cvar_VariableStringBuffer( va( "rpg_%sPass" ), conName, 15 ); + trap_SendServerCommand( attacker-g_entities, va("print \"^7Server: You have been caught n00bing, you have been temporary put in the n00b class.\n\"" ) ); + } else { + trap_SendServerCommand( attacker-g_entities, va("print \"^7Server: You have been caught n00bing, %i more times and you will be kicked.\n\"", (rpg_kickAfterXkills.integer - attacker->n00bCount) ) ); + } - SetClass( attacker, conName, NULL, qfalse); - trap_DropClient( attacker->s.number, "Kicked: Do Not N00b!" ); - break; - } - }*/ - trap_DropClient( attacker->s.number, "Kicked: Do Not N00b!" ); - - } else { - for( i=0; g_classData[i].consoleName[0] && i < MAX_CLASSES; i++ ) + if ((attacker->n00bCount >= rpg_kickAfterXkills.integer) && (rpg_kickAfterXkills.integer != 0)) { - if ( g_classData[i].isn00b) { - char conName[64]; - trap_Cvar_VariableStringBuffer( va( "rpg_%sPass", conName ), conName, sizeof(conName) ); + trap_DropClient( attacker->s.number, "Kicked: Do Not N00b!" ); + } else { + for( i=0; g_classData[i].consoleName[0] && i < MAX_CLASSES; i++ ) + { + if ( g_classData[i].isn00b) { + char conName[64]; + trap_Cvar_VariableStringBuffer( va( "rpg_%sPass", conName ), conName, sizeof(conName) ); - Q_strncpyz(attacker->client->origClass, ClassNameForValue( attacker->client->sess.sessionClass ), sizeof(attacker->client->origClass)); - attacker->client->n00bTime = level.time + 10000; - SetClass( attacker, conName, NULL, qfalse ); - break; + Q_strncpyz(attacker->client->origClass, ClassNameForValue( attacker->client->sess.sessionClass ), sizeof(attacker->client->origClass)); + attacker->client->n00bTime = level.time + 10000; + SetClass( attacker, conName, NULL, qfalse ); + break; + } } } } } } } - } - //RPG-X: RedTechie no noclip - if ( self->client->noclip ) { - self->client->noclip = qfalse; - } - - //RPG-X: RedTechie - Toss items - //RPG-X: Marcin - not when respawning - 30/12/2008 - if ( meansOfDeath != MOD_RESPAWN ) { - TossClientItems( self, qfalse ); - } - - ps->pm_type = PM_DEAD; - - self->takedamage = qfalse; - - ps->weapon = WP_0; - ps->weaponstate = WEAPON_READY; - //self->s.weapon = WP_0; - //memset(ps->powerups, 0, sizeof(ps->powerups)); //TiM - BOOKMARK - //self->s.powerups = 0; - self->r.contents = CONTENTS_CORPSE; - //self->r.contents = CONTENTS_BODY; - - //TiM - Stops player from yawing about when they die - //self->s.angles[0] = 0; - //self->s.angles[2] = 0; - - //LookAtKiller (self, inflictor, attacker); - - //VectorCopy( self->s.angles, ps->viewangles ); - - //-TiM - - self->s.loopSound = 0; - - self->r.maxs[2] = -8; - - //RPG-X: RedTechie - Wait....forever - self->client->respawnTime = level.time + 1000000000; - - //Clear powerups - //TiM - Bookmark - //memset( ps->powerups, 0, sizeof(ps->powerups) ); - - //Play death sound - //RPG-X: RedTechie - No pain sound when they change class - if(meansOfDeath != MOD_RESPAWN){ - G_AddEvent( self, irandom(EV_DEATH1, EV_DEATH3), killer ); - //if we died from falling, add a nice "splat' sound lol - if ( meansOfDeath == MOD_FALLING ) { - G_AddEvent( self, EV_SPLAT, killer ); + //RPG-X: RedTechie no noclip + if ( self->client->noclip ) { + self->client->noclip = qfalse; } - } - //RPG-X : Model system - Death animations now based on vector hit - if (meansOfDeath == MOD_FALLING ) { - anim = BOTH_FALLDEATH1LAND; - } - else if ( self->waterlevel == 3 ) { - anim = BOTH_FLOAT2; - } - else { - if (meansOfDeath == MOD_PHASER || meansOfDeath == MOD_PHASER_ALT ) { - if (self->client->lasthurt_location & LOCATION_FRONT ) { - anim = BOTH_DEATHBACKWARD1; - } - else if ( self->client->lasthurt_location & LOCATION_BACK ) { - anim = BOTH_DEATHFORWARD2; - } - else if ( self->client->lasthurt_location & LOCATION_LEFT ) { - anim = BOTH_DEATH2; - } - else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { - anim = BOTH_DEATH2; - } - else { - anim = BOTH_DEATH1; + //RPG-X: RedTechie - Toss items + //RPG-X: Marcin - not when respawning - 30/12/2008 + if ( meansOfDeath != MOD_RESPAWN ) { + TossClientItems( self, qfalse ); + } + + ps->pm_type = PM_DEAD; + + self->takedamage = qfalse; + + ps->weapon = WP_0; + ps->weaponstate = WEAPON_READY; + self->r.contents = CONTENTS_CORPSE; + + //-TiM + + self->s.loopSound = 0; + + self->r.maxs[2] = -8; + + //RPG-X: RedTechie - Wait....forever + self->client->respawnTime = level.time + 1000000000; + + //Clear powerups + //TiM - Bookmark + //memset( ps->powerups, 0, sizeof(ps->powerups) ); + + //Play death sound + //RPG-X: RedTechie - No pain sound when they change class + if(meansOfDeath != MOD_RESPAWN){ + G_AddEvent( self, irandom(EV_DEATH1, EV_DEATH3), killer ); + //if we died from falling, add a nice "splat' sound lol + if ( meansOfDeath == MOD_FALLING ) { + G_AddEvent( self, EV_SPLAT, killer ); } } + + //RPG-X : Model system - Death animations now based on vector hit + if (meansOfDeath == MOD_FALLING ) { + anim = BOTH_FALLDEATH1LAND; + } + else if ( self->waterlevel == 3 ) { + anim = BOTH_FLOAT2; + } else { - if (self->client->lasthurt_location & LOCATION_FRONT ) { - anim = BOTH_DEATHBACKWARD2; - } - else if ( self->client->lasthurt_location & LOCATION_BACK ) { - anim = BOTH_DEATHFORWARD1; - } - else if ( self->client->lasthurt_location & LOCATION_LEFT ) { - anim = BOTH_DEATHFORWARD2; - } - else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { - anim = BOTH_DEATHFORWARD2; + if (meansOfDeath == MOD_PHASER || meansOfDeath == MOD_PHASER_ALT ) { + if (self->client->lasthurt_location & LOCATION_FRONT ) { + anim = BOTH_DEATHBACKWARD1; + } + else if ( self->client->lasthurt_location & LOCATION_BACK ) { + anim = BOTH_DEATHFORWARD2; + } + else if ( self->client->lasthurt_location & LOCATION_LEFT ) { + anim = BOTH_DEATH2; + } + else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { + anim = BOTH_DEATH2; + } + else { + anim = BOTH_DEATH1; + } } else { - anim = BOTH_DEATH1; + if (self->client->lasthurt_location & LOCATION_FRONT ) { + anim = BOTH_DEATHBACKWARD2; + } + else if ( self->client->lasthurt_location & LOCATION_BACK ) { + anim = BOTH_DEATHFORWARD1; + } + else if ( self->client->lasthurt_location & LOCATION_LEFT ) { + anim = BOTH_DEATHFORWARD2; + } + else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { + anim = BOTH_DEATHFORWARD2; + } + else { + anim = BOTH_DEATH1; + } } } - } - /*switch ( deathNum ) { - case 0: - anim = BOTH_DEATH1; - break; - case 1: - anim = BOTH_DEATH2; - break; - case 2: - default: - anim = BOTH_DEATHFORWARD1; //DEATH3 - break; - }*/ - //TiM - ps->stats[LEGSANIM] = - ( ( ps->stats[LEGSANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - ps->stats[TORSOANIM] = - ( ( ps->stats[TORSOANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; + //TiM + ps->stats[LEGSANIM] = + ( ( ps->stats[LEGSANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; + ps->stats[TORSOANIM] = + ( ( ps->stats[TORSOANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - /*ps->legsAnim = - ( ( ps->legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - ps->torsoAnim = - ( ( ps->torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim;*/ - - //RPG-X: RedTechie: An override to override a override that raven built into there override - aka suciding dosnt play a animation :S - /*if(meansOfDeath == MOD_SUICIDE){ - ps->torsoAnim = BOTH_DEATH1; - ps->legsAnim = BOTH_DEATH1; - }*/ + trap_LinkEntity (self); - trap_LinkEntity (self); - - BG_PlayerStateToEntityState( &self->client->ps, &self->s, qtrue ); + BG_PlayerStateToEntityState( &self->client->ps, &self->s, qtrue ); - ClientUserinfoChanged( self->s.clientNum ); - - ClientEndFrame( self ); - - G_StoreClientInitialStatus( self ); - //--------------------- - //RPG-X: RedTechie - If it dose equal 0 use regular die - //--------------------- + ClientUserinfoChanged( self->s.clientNum ); + + ClientEndFrame( self ); + + G_StoreClientInitialStatus( self ); + //--------------------- + //RPG-X: RedTechie - If it dose equal 0 use regular die + //--------------------- }else{ - gentity_t *ent; - int anim; - //int contents; - int killer; - int i; - char *killerName, *obit; - gentity_t *detpack = NULL; - char *classname = NULL; - int BottomlessPitDeath; - static int deathNum; - playerState_t *ps = &self->client->ps; + gentity_t *ent; + int anim; + int killer; + int i; + char *killerName, *obit; + gentity_t *detpack = NULL; + char *classname = NULL; + int BottomlessPitDeath; + static int deathNum; + playerState_t *ps = &self->client->ps; - if ( ps->pm_type == PM_DEAD ) { - return; - } + if ( ps->pm_type == PM_DEAD ) { + return; + } - if ( level.intermissiontime ) { - return; - } - - //RPG-X: RedTechie - Trying to make sure player dies when there health is 1 without medics revive turned on - //RPG-X | Phenix | 05/04/2005 - Read learn that "=" sets where "==" is an if statement!!! + if ( level.intermissiontime ) { + return; + } + + //RPG-X: RedTechie - Trying to make sure player dies when there health is 1 without medics revive turned on + //RPG-X | Phenix | 05/04/2005 - Read learn that "=" sets where "==" is an if statement!!! if (self->health == 1) { self->health = 0; } - ps->pm_type = PM_DEAD; - //need to copy health here because pm_type was getting reset to PM_NORMAL if ClientThink_real was called before the STAT_HEALTH was updated - ps->stats[STAT_HEALTH] = self->health; + ps->pm_type = PM_DEAD; + //need to copy health here because pm_type was getting reset to PM_NORMAL if ClientThink_real was called before the STAT_HEALTH was updated + ps->stats[STAT_HEALTH] = self->health; - // check if we are in a NODROP Zone and died from a TRIGGER HURT - // if so, we assume that this resulted from a fall to a "bottomless pit" and - // treat it differently... - // - // Any problems with other places in the code? - // - BottomlessPitDeath = 0; // initialize + // check if we are in a NODROP Zone and died from a TRIGGER HURT + // if so, we assume that this resulted from a fall to a "bottomless pit" and + // treat it differently... + // + // Any problems with other places in the code? + // + BottomlessPitDeath = 0; // initialize - contents = trap_PointContents( self->r.currentOrigin, -1 ); - if ( ( contents & CONTENTS_NODROP ) && (meansOfDeath == MOD_TRIGGER_HURT) ) - { - BottomlessPitDeath = 1; - // G_AddEvent( EV_FALL_FAR ); - // G_AddEvent( self, EV_FALL_FAR, 0 ); -// self->s.eFlags |= EF_NODRAW; - - } - - // if this dead guy had already dropped the first stage of a transporter, remove that transporter -/* - classname = BG_FindClassnameForHoldable(HI_TRANSPORTER); - if (classname) - { - gentity_t *trans = NULL; - while ((trans = G_Find (trans, FOFS(classname), classname)) != NULL) + contents = trap_PointContents( self->r.currentOrigin, -1 ); + if ( ( contents & CONTENTS_NODROP ) && (meansOfDeath == MOD_TRIGGER_HURT) ) { - if (trans->parent == self) + BottomlessPitDeath = 1; + } + + // similarly, if El Corpso here has already dropped a detpack, blow it up + classname = BG_FindClassnameForHoldable(HI_DETPACK); + if (classname) + { + while ((detpack = G_Find (detpack, FOFS(classname), classname)) != NULL) { - G_FreeEntity(trans); + if (detpack->parent == self) + { + detpack->think = DetonateDetpack; // Detonate next think. + detpack->nextthink = level.time; + } } } - } -*/ - // similarly, if El Corpso here has already dropped a detpack, blow it up - classname = BG_FindClassnameForHoldable(HI_DETPACK); - if (classname) - { - while ((detpack = G_Find (detpack, FOFS(classname), classname)) != NULL) - { - if (detpack->parent == self) - { - detpack->think = DetonateDetpack; // Detonate next think. - detpack->nextthink = level.time; - } - } - } - if ( attacker ) { - killer = attacker->s.number; - if ( attacker->client ) { - killerName = attacker->client->pers.netname; + if ( attacker ) { + killer = attacker->s.number; + if ( attacker->client ) { + killerName = attacker->client->pers.netname; + } else { + killerName = ""; + } } else { - killerName = ""; + killer = ENTITYNUM_WORLD; + killerName = ""; } - } else { - killer = ENTITYNUM_WORLD; - killerName = ""; - } - if ( killer < 0 || killer >= MAX_CLIENTS ) { - killer = ENTITYNUM_WORLD; - killerName = ""; - } + if ( killer < 0 || killer >= MAX_CLIENTS ) { + killer = ENTITYNUM_WORLD; + killerName = ""; + } - if ( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) ) { - obit = ""; - } else { - obit = modNames[ meansOfDeath ]; - } + if ( meansOfDeath < 0 || meansOfDeath >= sizeof( modNames ) / sizeof( modNames[0] ) ) { + obit = ""; + } else { + obit = modNames[ meansOfDeath ]; + } - G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n", - killer, self->s.number, meansOfDeath, killerName, - self->client->pers.netname, obit ); + G_LogPrintf("Kill: %i %i %i: %s killed %s by %s\n", + killer, self->s.number, meansOfDeath, killerName, + self->client->pers.netname, obit ); - G_LogWeaponKill(killer, meansOfDeath); - G_LogWeaponDeath(self->s.number, self->s.weapon); - if (attacker && attacker->client && attacker->inuse) - { - G_LogWeaponFrag(killer, self->s.number); - } - - if ( meansOfDeath != MOD_RESPAWN ) - { - // broadcast the death event to everyone - ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY ); - ent->s.eventParm = meansOfDeath; - ent->s.otherEntityNum = self->s.number; - ent->s.otherEntityNum2 = killer; - ent->r.svFlags = SVF_BROADCAST; // send to everyone - } - - self->enemy = attacker; - - ps->persistant[PERS_KILLED]++; - if (self == attacker) - { - self->client->pers.teamState.suicides++; - } - - //RPG-X: Redtechie - No awards or score calculations - //////////////////////////////////////////////////////////////////////// - if (attacker && attacker->client) - { - if ( attacker == self || OnSameTeam (self, attacker ) ) + G_LogWeaponKill(killer, meansOfDeath); + G_LogWeaponDeath(self->s.number, self->s.weapon); + if (attacker && attacker->client && attacker->inuse) { - if ( meansOfDeath != MOD_RESPAWN ) - {//just changing class - AddScore( attacker, -1 ); + G_LogWeaponFrag(killer, self->s.number); + } + + if ( meansOfDeath != MOD_RESPAWN ) + { + // broadcast the death event to everyone + ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY ); + ent->s.eventParm = meansOfDeath; + ent->s.otherEntityNum = self->s.number; + ent->s.otherEntityNum2 = killer; + ent->r.svFlags = SVF_BROADCAST; // send to everyone + } + + self->enemy = attacker; + + ps->persistant[PERS_KILLED]++; + if (self == attacker) + { + self->client->pers.teamState.suicides++; + } + + //RPG-X: Redtechie - No awards or score calculations + //////////////////////////////////////////////////////////////////////// + if (attacker && attacker->client) + { + if ( attacker == self || OnSameTeam (self, attacker ) ) + { + if ( meansOfDeath != MOD_RESPAWN ) + {//just changing class + AddScore( attacker, -1 ); + } + } + else + { + attacker->client->pers.teamState.frags++; + AddScore( attacker, 1 ); + + // Check to see if the player is on a streak. + attacker->client->streakCount++; + + attacker->client->lastKillTime = level.time; } } else { - attacker->client->pers.teamState.frags++; - AddScore( attacker, 1 ); - - // Check to see if the player is on a streak. - attacker->client->streakCount++; - - attacker->client->lastKillTime = level.time; - } - } - else - { - if ( meansOfDeath != MOD_RESPAWN ) - {//not just changing class - AddScore( self, -1 ); - } - } - //////////////////////////////////////////////////////////////////////// - - //RPG-X: Redtechie - agian no need - // Add team bonuses - //Team_FragBonuses(self, inflictor, attacker); - - // if client is in a nodrop area, don't drop anything (but return CTF flags!) - if ( !( contents & CONTENTS_NODROP ) /*&& self->client->sess.sessionClass != PC_ACTIONHERO*/ && meansOfDeath != MOD_SUICIDE && meansOfDeath != MOD_RESPAWN ) - {//action hero doesn't drop stuff - //don't drop stuff in specialty mode - if ( meansOfDeath != MOD_RESPAWN ) { - TossClientItems( self, qfalse ); - } - } - - Cmd_Score_f( self ); // show scores - // send updated scores to any clients that are following this one, - // or they would get stale scoreboards - for ( i = 0 ; i < level.maxclients ; i++ ) { - gclient_t *client; - - client = &level.clients[i]; - if ( client->pers.connected != CON_CONNECTED ) { - continue; - } - if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { - continue; - } - if ( client->sess.spectatorClient == self->s.number ) { - Cmd_Score_f( g_entities + i ); - } - } - - self->takedamage = qtrue; // can still be gibbed - - self->s.weapon = WP_0; - self->s.powerups = 0; - self->r.contents = CONTENTS_CORPSE; - - //TiM - //self->s.angles[0] = 0; - //self->s.angles[2] = 0; - - //LookAtKiller (self, inflictor, attacker); - - //VectorCopy( self->s.angles, ps->viewangles ); - - self->s.loopSound = 0; - - self->r.maxs[2] = -8; - - // don't allow respawn until the death anim is done - // g_forcerespawn may force spawning at some later time - self->client->respawnTime = level.time + 1700; - - // remove powerups - //TiM - Bookmark - //memset( ps->powerups, 0, sizeof(ps->powerups) ); - - // never gib in a nodrop -/* if ( self->health <= GIB_HEALTH && !(contents & CONTENTS_NODROP) ) { - // gib death - GibEntity( self, killer ); - } else -*/ - - // We always want to see the body for special animations, so make sure not to gib right away: - if (meansOfDeath==MOD_CRIFLE_ALT || - meansOfDeath==MOD_DETPACK || - meansOfDeath==MOD_QUANTUM_ALT || - meansOfDeath==MOD_DREADNOUGHT_ALT || - meansOfDeath==MOD_PHASER_ALT)//RPG-X: RedTechie - Added phaser alt disnt - { self->health=0;} - - //RPG-X : Model system - Death animations now based on vector hit - if (meansOfDeath == MOD_FALLING ) { - anim = BOTH_FALLDEATH1LAND; - //G_AddEvent( self, EV_SPLAT, 0 ); - } - else if ( self->waterlevel == 3 ) { - anim = BOTH_FLOAT2; - } - else { - if (meansOfDeath == MOD_PHASER || meansOfDeath == MOD_PHASER_ALT ) { - if (self->client->lasthurt_location & LOCATION_FRONT ) { - anim = BOTH_DEATHBACKWARD1; + if ( meansOfDeath != MOD_RESPAWN ) + {//not just changing class + AddScore( self, -1 ); } - else if ( self->client->lasthurt_location & LOCATION_BACK ) { - anim = BOTH_DEATHFORWARD2; + } + //////////////////////////////////////////////////////////////////////// + + //RPG-X: Redtechie - agian no need + // Add team bonuses + //Team_FragBonuses(self, inflictor, attacker); + + // if client is in a nodrop area, don't drop anything (but return CTF flags!) + if ( !( contents & CONTENTS_NODROP ) /*&& self->client->sess.sessionClass != PC_ACTIONHERO*/ && meansOfDeath != MOD_SUICIDE && meansOfDeath != MOD_RESPAWN ) + {//action hero doesn't drop stuff + //don't drop stuff in specialty mode + if ( meansOfDeath != MOD_RESPAWN ) { + TossClientItems( self, qfalse ); } - else if ( self->client->lasthurt_location & LOCATION_LEFT ) { - anim = BOTH_DEATH2; + } + + Cmd_Score_f( self ); // show scores + // send updated scores to any clients that are following this one, + // or they would get stale scoreboards + for ( i = 0 ; i < level.maxclients ; i++ ) { + gclient_t *client; + + client = &level.clients[i]; + if ( client->pers.connected != CON_CONNECTED ) { + continue; } - else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { - anim = BOTH_DEATH2; + if ( client->sess.sessionTeam != TEAM_SPECTATOR ) { + continue; } - else { - anim = BOTH_DEATH1; + if ( client->sess.spectatorClient == self->s.number ) { + Cmd_Score_f( g_entities + i ); } } + + self->takedamage = qtrue; // can still be gibbed + + self->s.weapon = WP_0; + self->s.powerups = 0; + self->r.contents = CONTENTS_CORPSE; + + self->s.loopSound = 0; + + self->r.maxs[2] = -8; + + // don't allow respawn until the death anim is done + // g_forcerespawn may force spawning at some later time + self->client->respawnTime = level.time + 1700; + + // We always want to see the body for special animations, so make sure not to gib right away: + if (meansOfDeath==MOD_CRIFLE_ALT || + meansOfDeath==MOD_DETPACK || + meansOfDeath==MOD_QUANTUM_ALT || + meansOfDeath==MOD_DREADNOUGHT_ALT || + meansOfDeath==MOD_PHASER_ALT)//RPG-X: RedTechie - Added phaser alt disnt + { self->health=0;} + + //RPG-X : Model system - Death animations now based on vector hit + if (meansOfDeath == MOD_FALLING ) { + anim = BOTH_FALLDEATH1LAND; + } + else if ( self->waterlevel == 3 ) { + anim = BOTH_FLOAT2; + } else { - if (self->client->lasthurt_location & LOCATION_FRONT ) { - anim = BOTH_DEATHBACKWARD2; - } - else if ( self->client->lasthurt_location & LOCATION_BACK ) { - anim = BOTH_DEATHFORWARD1; - } - else if ( self->client->lasthurt_location & LOCATION_LEFT ) { - anim = BOTH_DEATHFORWARD2; - } - else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { - anim = BOTH_DEATHFORWARD2; + if (meansOfDeath == MOD_PHASER || meansOfDeath == MOD_PHASER_ALT ) { + if (self->client->lasthurt_location & LOCATION_FRONT ) { + anim = BOTH_DEATHBACKWARD1; + } + else if ( self->client->lasthurt_location & LOCATION_BACK ) { + anim = BOTH_DEATHFORWARD2; + } + else if ( self->client->lasthurt_location & LOCATION_LEFT ) { + anim = BOTH_DEATH2; + } + else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { + anim = BOTH_DEATH2; + } + else { + anim = BOTH_DEATH1; + } } else { - anim = BOTH_DEATH1; + if (self->client->lasthurt_location & LOCATION_FRONT ) { + anim = BOTH_DEATHBACKWARD2; + } + else if ( self->client->lasthurt_location & LOCATION_BACK ) { + anim = BOTH_DEATHFORWARD1; + } + else if ( self->client->lasthurt_location & LOCATION_LEFT ) { + anim = BOTH_DEATHFORWARD2; + } + else if ( self->client->lasthurt_location & LOCATION_RIGHT ) { + anim = BOTH_DEATHFORWARD2; + } + else { + anim = BOTH_DEATH1; + } } } - } - /*switch ( deathNum ) { - case 0: - anim = BOTH_DEATH1; - break; - case 1: - anim = BOTH_DEATH2; - break; - case 2: - default: - anim = BOTH_DEATHFORWARD1; //DEATH3 - break; - }*/ - ps->stats[LEGSANIM] = - ( ( ps->stats[LEGSANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - ps->stats[TORSOANIM] = - ( ( ps->stats[TORSOANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; + ps->stats[LEGSANIM] = + ( ( ps->stats[LEGSANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; + ps->stats[TORSOANIM] = + ( ( ps->stats[TORSOANIM] & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; -/* ps->legsAnim = - ( ( ps->legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim; - ps->torsoAnim = - ( ( ps->torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | anim;*/ - - if ( (BottomlessPitDeath==1) && (killer == ENTITYNUM_WORLD)) - { - //G_AddEvent( self, EV_FALL_FAR, killer ); ?? Need to play falling SF now, or - // use designer trigger?? - //FIXME: need *some* kind of death anim! - } - else - { - // normal death - - switch(meansOfDeath) + if ( (BottomlessPitDeath==1) && (killer == ENTITYNUM_WORLD)) { - case MOD_PHASER_ALT: //RPG-X: RedTechie - Added better effect for alt phaser - if(rpg_phaserdisintegrates.integer == 1){//RPG-X: RedTechie - Check to see if we want this - G_AddEvent( self, EV_DISINTEGRATION, killer ); - ps->powerups[PW_DISINTEGRATE] = level.time + 100000; + //G_AddEvent( self, EV_FALL_FAR, killer ); ?? Need to play falling SF now, or + // use designer trigger?? + //FIXME: need *some* kind of death anim! + } + else + { + // normal death + + switch(meansOfDeath) + { + case MOD_PHASER_ALT: //RPG-X: RedTechie - Added better effect for alt phaser + if(rpg_phaserdisintegrates.integer == 1){//RPG-X: RedTechie - Check to see if we want this + G_AddEvent( self, EV_DISINTEGRATION, killer ); + ps->powerups[PW_DISINTEGRATE] = level.time + 100000; + VectorClear( ps->velocity ); + self->takedamage = qfalse; + self->r.contents = 0; + } + break; + case MOD_CRIFLE_ALT: + break; + case MOD_QUANTUM_ALT: + G_AddEvent( self, EV_DISINTEGRATION2, killer ); + ps->powerups[PW_EXPLODE] = level.time + 100000; VectorClear( ps->velocity ); self->takedamage = qfalse; self->r.contents = 0; + break; + case MOD_SCAVENGER_ALT: + case MOD_SCAVENGER_ALT_SPLASH: + case MOD_GRENADE: + case MOD_GRENADE_ALT: + case MOD_GRENADE_SPLASH: + case MOD_GRENADE_ALT_SPLASH: + case MOD_QUANTUM: + case MOD_QUANTUM_SPLASH: + case MOD_QUANTUM_ALT_SPLASH: + case MOD_DETPACK: + G_AddEvent( self, EV_EXPLODESHELL, killer ); + ps->powerups[PW_EXPLODE] = level.time + 100000; + VectorClear( ps->velocity ); + self->takedamage = qfalse; + self->r.contents = 0; + break; + case MOD_DREADNOUGHT: + case MOD_DREADNOUGHT_ALT: + G_AddEvent( self, EV_ARCWELD_DISINT, killer); + ps->powerups[PW_ARCWELD_DISINT] = level.time + 100000; + VectorClear( ps->velocity ); + self->takedamage = qfalse; + self->r.contents = 0; + break; + case MOD_FALLING: + G_AddEvent( self, EV_SPLAT, killer ); + break; + default: + G_AddEvent( self, irandom(EV_DEATH1, EV_DEATH3), killer ); + break; } - break; - //case MOD_PHASER: - case MOD_CRIFLE_ALT: - //RPG-X | GSIO01 | 08/05/09: - /*G_AddEvent( self, EV_DISINTEGRATION, killer ); - ps->powerups[PW_DISINTEGRATE] = level.time + 100000; - VectorClear( ps->velocity ); - self->takedamage = qfalse; - self->r.contents = 0;*/ - break; - case MOD_QUANTUM_ALT: - G_AddEvent( self, EV_DISINTEGRATION2, killer ); - ps->powerups[PW_EXPLODE] = level.time + 100000; - VectorClear( ps->velocity ); - self->takedamage = qfalse; - self->r.contents = 0; - break; - case MOD_SCAVENGER_ALT: - case MOD_SCAVENGER_ALT_SPLASH: - case MOD_GRENADE: - case MOD_GRENADE_ALT: - case MOD_GRENADE_SPLASH: - case MOD_GRENADE_ALT_SPLASH: - case MOD_QUANTUM: - case MOD_QUANTUM_SPLASH: - case MOD_QUANTUM_ALT_SPLASH: - case MOD_DETPACK: - G_AddEvent( self, EV_EXPLODESHELL, killer ); - ps->powerups[PW_EXPLODE] = level.time + 100000; - VectorClear( ps->velocity ); - self->takedamage = qfalse; - self->r.contents = 0; - break; - case MOD_DREADNOUGHT: - case MOD_DREADNOUGHT_ALT: - G_AddEvent( self, EV_ARCWELD_DISINT, killer); - ps->powerups[PW_ARCWELD_DISINT] = level.time + 100000; - VectorClear( ps->velocity ); - self->takedamage = qfalse; - self->r.contents = 0; - break; - case MOD_FALLING: - G_AddEvent( self, EV_SPLAT, killer ); - break; - default: - G_AddEvent( self, irandom(EV_DEATH1, EV_DEATH3), killer ); - break; + + // the body can still be gibbed + self->die = body_die; + } + // globally cycle through the different death animations + deathNum = ( deathNum + 1 ) % 3; - // the body can still be gibbed - self->die = body_die; - - } - // globally cycle through the different death animations - deathNum = ( deathNum + 1 ) % 3; - - trap_LinkEntity (self); -}//RPG-X: RedTechie - End of my if statment for medics revive check + trap_LinkEntity (self); + }//RPG-X: RedTechie - End of my if statment for medics revive check }//RPG-X: RedTechie - End of void #define BORG_ADAPT_NUM_HITS 10 -qboolean G_CheckBorgAdaptation( gentity_t *targ, int mod ) +static qboolean G_CheckBorgAdaptation( gentity_t *targ, int mod ) { - //static int borgAdaptHits[WP_NUM_WEAPONS]; int weapon = 0; if ( !targ->client ) @@ -953,14 +813,9 @@ qboolean G_CheckBorgAdaptation( gentity_t *targ, int mod ) return qfalse; } - /*if ( targ->client->sess.sessionClass != PC_BORG ) - { - return qfalse; - }*/ - switch( mod ) { -//other kinds of damage + //other kinds of damage case MOD_UNKNOWN: case MOD_WATER: case MOD_SLIME: @@ -975,12 +830,10 @@ qboolean G_CheckBorgAdaptation( gentity_t *targ, int mod ) case MOD_DETPACK: case MOD_MAX: case MOD_KNOCKOUT: - //case MOD_IMOD: - //case MOD_IMOD_ALT: case MOD_EXPLOSION: return qfalse; break; -// Trek weapons + // Trek weapons case MOD_PHASER: case MOD_PHASER_ALT: weapon = WP_5; @@ -1034,32 +887,32 @@ qboolean G_CheckBorgAdaptation( gentity_t *targ, int mod ) level.borgAdaptHits[weapon]++; switch(weapon) { - case WP_5: - if(level.borgAdaptHits[WP_5] > rpg_adaptPhaserHits.integer) - return qtrue; - break; - case WP_6: - if(level.borgAdaptHits[WP_6] > rpg_adaptCrifleHits.integer) - return qtrue; - break; - case WP_10: - if(level.borgAdaptHits[WP_10] > rpg_adaptDisruptorHits.integer) - return qtrue; - break; - case WP_8: - if(level.borgAdaptHits[WP_8] > rpg_adaptGrenadeLauncherHits.integer) - return qtrue; - break; - case WP_7: - if(level.borgAdaptHits[WP_7] > rpg_adaptTR116Hits.integer) - return qtrue; - break; - case WP_9: - if(level.borgAdaptHits[WP_9] > rpg_adaptPhotonHits.integer) - return qtrue; - break; - default: - return qfalse; + case WP_5: + if(level.borgAdaptHits[WP_5] > rpg_adaptPhaserHits.integer) + return qtrue; + break; + case WP_6: + if(level.borgAdaptHits[WP_6] > rpg_adaptCrifleHits.integer) + return qtrue; + break; + case WP_10: + if(level.borgAdaptHits[WP_10] > rpg_adaptDisruptorHits.integer) + return qtrue; + break; + case WP_8: + if(level.borgAdaptHits[WP_8] > rpg_adaptGrenadeLauncherHits.integer) + return qtrue; + break; + case WP_7: + if(level.borgAdaptHits[WP_7] > rpg_adaptTR116Hits.integer) + return qtrue; + break; + case WP_9: + if(level.borgAdaptHits[WP_9] > rpg_adaptPhotonHits.integer) + return qtrue; + break; + default: + return qfalse; } return qfalse; } @@ -1069,7 +922,7 @@ qboolean G_CheckBorgAdaptation( gentity_t *targ, int mod ) G_LocationDamage ============ */ -int G_LocationDamage(vec3_t point, gentity_t* targ, gentity_t* attacker, int take) { +static int G_LocationDamage(vec3_t point, gentity_t* targ, gentity_t* attacker, int take) { vec3_t bulletPath; vec3_t bulletAngle; @@ -1078,7 +931,7 @@ int G_LocationDamage(vec3_t point, gentity_t* targ, gentity_t* attacker, int tak int clientRotation; int bulletHeight; int bulletRotation; // Degrees rotation around client. - // used to check Back of head vs. Face + // used to check Back of head vs. Face int impactRotation; @@ -1087,7 +940,7 @@ int G_LocationDamage(vec3_t point, gentity_t* targ, gentity_t* attacker, int tak return 0; // Point[2] is the REAL world Z. We want Z relative to the clients feet - + // Where the feet are at [real Z] clientFeetZ = targ->r.currentOrigin[2] + targ->r.mins[2]; // How tall the client is [Relative Z] @@ -1104,71 +957,58 @@ int G_LocationDamage(vec3_t point, gentity_t* targ, gentity_t* attacker, int tak bulletRotation = bulletAngle[YAW]; impactRotation = abs(clientRotation-bulletRotation); - + impactRotation += 45; // just to make it easier to work with impactRotation = impactRotation % 360; // Keep it in the 0-359 range if (impactRotation < 90) { targ->client->lasthurt_location = LOCATION_BACK; - //Com_Printf( S_COLOR_RED "OW! My back!\n" ); } else if (impactRotation < 180) { targ->client->lasthurt_location = LOCATION_RIGHT; - //Com_Printf( S_COLOR_RED "OW! My right!\n" ); } else if (impactRotation < 270) { targ->client->lasthurt_location = LOCATION_FRONT; - //Com_Printf( S_COLOR_RED "OW! My front!\n" ); } else if (impactRotation < 360) { targ->client->lasthurt_location = LOCATION_LEFT; - //Com_Printf( S_COLOR_RED "OW! My left!\n" ); } else { targ->client->lasthurt_location = LOCATION_NONE; - //Com_Printf( S_COLOR_RED "OW! My none!\n" ); } // The upper body never changes height, just distance from the feet if (bulletHeight > clientHeight - 2) { targ->client->lasthurt_location |= LOCATION_HEAD; - //Com_Printf( S_COLOR_RED "OW! My head!\n" ); } else if (bulletHeight > clientHeight - 8) { targ->client->lasthurt_location |= LOCATION_FACE; - //Com_Printf( S_COLOR_RED "GARRRGH! My face!\n" ); } else if (bulletHeight > clientHeight - 10) { targ->client->lasthurt_location |= LOCATION_SHOULDER; - //Com_Printf( S_COLOR_RED "OW! My shoulder!\n" ); } else if (bulletHeight > clientHeight - 16) { targ->client->lasthurt_location |= LOCATION_CHEST; - //Com_Printf( S_COLOR_RED "OW! My chest!\n" ); } else if (bulletHeight > clientHeight - 26) { targ->client->lasthurt_location |= LOCATION_STOMACH; - //Com_Printf( S_COLOR_RED "OW! My tummy!\n" ); } else if (bulletHeight > clientHeight - 29) { targ->client->lasthurt_location |= LOCATION_GROIN; - //Com_Printf( S_COLOR_RED "OW! My groin!\n" ); } else if (bulletHeight < 4) { targ->client->lasthurt_location |= LOCATION_FOOT; - //Com_Printf( S_COLOR_RED "OW! My foot!\n" ); } else { // The leg is the only thing that changes size when you duck, // so we check for every other parts RELATIVE location, and // whats left over must be the leg. targ->client->lasthurt_location |= LOCATION_LEG; - //Com_Printf( S_COLOR_RED "OW! My generic leg!\n" ); } // Check the location ignoring the rotation info switch ( targ->client->lasthurt_location & - ~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) ) + ~(LOCATION_BACK | LOCATION_LEFT | LOCATION_RIGHT | LOCATION_FRONT) ) { case LOCATION_HEAD: take *= 1.8; @@ -1192,17 +1032,17 @@ int G_LocationDamage(vec3_t point, gentity_t* targ, gentity_t* attacker, int tak take *= 0.8; // Arms break; case LOCATION_STOMACH: - take *= 1.2; + take *= 1.2; break; case LOCATION_GROIN: if (targ->client->lasthurt_location & LOCATION_FRONT) take *= 1.3; // Groin shot break; case LOCATION_LEG: - take *= 0.7; + take *= 0.7; break; case LOCATION_FOOT: - take *= 0.5; + take *= 0.5; break; } @@ -1217,7 +1057,7 @@ T_Damage targ entity that is being damaged inflictor entity that is causing the damage attacker entity that caused the inflictor to damage targ - example: targ=monster, inflictor=rocket, attacker=player +example: targ=monster, inflictor=rocket, attacker=player dir direction of the attack for knockback point point at which the damage is being inflicted, used for headshots @@ -1227,30 +1067,28 @@ knockback force to be applied against targ as a result of the damage inflictor, attacker, dir, and point can be NULL for environmental effects dflags these flags are used to control how T_Damage works - DAMAGE_RADIUS damage was indirect (from a nearby explosion) - DAMAGE_NO_ARMOR armor does not protect from this damage - DAMAGE_NO_KNOCKBACK do not affect velocity, just view angles - DAMAGE_NO_PROTECTION kills godmode, armor, everything +DAMAGE_RADIUS damage was indirect (from a nearby explosion) +DAMAGE_NO_ARMOR armor does not protect from this damage +DAMAGE_NO_KNOCKBACK do not affect velocity, just view angles +DAMAGE_NO_PROTECTION kills godmode, armor, everything ============ */ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, - vec3_t dir, vec3_t point, int damage, int dflags, int mod ) { + vec3_t dir, vec3_t point, int damage, int dflags, int mod ) { gclient_t *client; int take=0; -// int asave; int knockback; - qboolean bFriend = (targ && attacker)?OnSameTeam( targ, attacker ):qfalse; -// gentity_t *evEnt; + qboolean bFriend = (targ && attacker) ? OnSameTeam( targ, attacker ) : qfalse; if(!targ) return; - #ifdef G_LUA +#ifdef G_LUA if(targ->luaHurt && !targ->client) { LuaHook_G_EntityHurt(targ->luaHurt, targ->s.number, inflictor->s.number, attacker->s.number); } - #endif +#endif if (!targ->takedamage) { return; @@ -1292,7 +1130,6 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, { //flag targ for adaptation effect targ->client->ps.powerups[PW_BORG_ADAPT] = level.time + 250; - //targ->client->ps.powerups[PW_BOLTON] += 200; if(rpg_adaptUseSound.integer == 1) G_AddEvent(targ, EV_ADAPT_SOUND, 0); return; @@ -1314,21 +1151,6 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, if ( client->noclip ) { return; } - - // kef -- still gotta telefrag people - if (MOD_TELEFRAG != mod) - { - /*if (targ->client->ps.introTime > level.time) - { // Can't be hurt when in holodeck intro. - return; - }*/ - //RPG-X: Redtechie - Wait we dont want ghosting to be non leathal >:) stupid n00bs!! - /* - if (targ->client->ps.powerups[PW_GHOST] >= level.time) - { // Can't be hurt when ghosted. - return; - }*/ - } } if ( !dir ) { @@ -1359,20 +1181,6 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t kvel; float mass; - // flying targets get pushed around a lot more. - //switch ( targ->client->sess.sessionClass ) - //{ - //case PC_INFILTRATOR: - // mass = 100; - // break; - //case PC_HEAVY: - // mass = 400; - // break; - //default: - // mass = 200; - // break; - //} - mass = 200; if (targ->client->ps.powerups[PW_FLIGHT]) @@ -1428,25 +1236,6 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, } } - // kef -- still need to telefrag invulnerable people - if ( MOD_TELEFRAG != mod ) - { - // battlesuit protects from all damage... - //RPG-X: - RedTechie no battlesuit - if ( 0 ) //client && ( /*client->ps.powerups[PW_BOLTON] ||*/ client->ps.powerups[PW_BEAMING] ) - { // EXCEPT DAMAGE_NO_INVULNERABILITY, like the IMOD - if ( dflags & DAMAGE_NO_INVULNERABILITY ) - { // Do only half damage if he has the battlesuit, and that's just because I'm in a good mood... - damage *= 0.5; - } - else - { - G_AddEvent( targ, EV_POWERUP_BATTLESUIT, 0 ); - return; - } - } - } - // always give half damage if hurting self // calculated after knockback, so rocket jumping works if ( rpg_selfdamage.integer != 0 ) @@ -1494,7 +1283,6 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, client->ps.persistant[PERS_ATTACKER] = ENTITYNUM_WORLD; } //RPG-X: - RedTechie no armor in RPG - //client->damage_armor += asave; client->damage_blood += take; client->damage_knockback += knockback; if ( dir ) { @@ -1519,22 +1307,6 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, take = G_LocationDamage(point, targ, attacker, take); else targ->client->lasthurt_location = LOCATION_NONE; - - // if target's shields (armor) took dmg and the dmg was armor-piercing, display the half-shields effect, - //if non-armor-piercing display full shields - //RPG-X: - RedTechie no armor in RPG - /*if (asave) - { - evEnt = G_TempEntity(vec3_origin, EV_SHIELD_HIT); - evEnt->s.otherEntityNum = targ->s.number; - evEnt->s.eventParm = DirToByte(dir); - evEnt->s.time2=asave; - - if (attacker->client && !bFriend) - { - attacker->client->ps.persistant[PERS_SHIELDS] += asave; - } - }*/ } // do the damage @@ -1548,14 +1320,14 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, attacker->client->ps.persistant[PERS_HITS] -= damage; } else if (targ->classname && strcmp(targ->classname, "holdable_shield") // no stupid hit noise when players shoot a shield -- dpk - && strcmp(targ->classname, "holdable_detpack")) // or the detpack either + && strcmp(targ->classname, "holdable_detpack")) // or the detpack either { attacker->client->ps.persistant[PERS_HITS] += damage; } } targ->health = targ->health - take; - + //RPG-X: RedTechie - If medicrevive is on then health only goes down to 1 so we can simulate fake death if(rpg_medicsrevive.integer == 1 && Q_stricmp("func_breakable", targ->classname) && Q_stricmp("misc_model_breakable", targ->classname ) ){ if(targ->health <= 0){ @@ -1572,55 +1344,40 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, if ( targ->client ) { targ->client->ps.stats[STAT_HEALTH] = targ->health; - // kef -- pain effect - // pjl -- if there was armor involved, the half-shield effect was shown in the above block. - //RPG-X: - RedTechie No armor exists why check for it? - //if (!asave) - //{ -// targ->client->ps.powerups[PW_OUCH] = level.time + 500; - // kef -- there absolutely MUST be a better way to do this. cleaner, at least. - //display the full screen "ouch" effect to the player - //} } - - //RPG-X: RedTechie - Custum medicrevive code - if(rpg_medicsrevive.integer == 1 && targ->s.eType == ET_PLAYER ){ + + //RPG-X: RedTechie - Custum medicrevive code + if(rpg_medicsrevive.integer == 1 && targ->s.eType == ET_PLAYER ){ if(targ->health == 1 ){ //TiM : Added Client to try and fix this stupid crashy bug - //ClientSpawn(targ, 1); - //if ( client ) { - client->ps.stats[STAT_WEAPONS] = ( 1 << WP_0 ); //?!!!!! - client->ps.stats[STAT_HOLDABLE_ITEM] = HI_NONE; - targ->health = 1; - player_die( targ, inflictor, attacker, take, mod ); - //} - //targ->die (targ, inflictor, attacker, take, mod); + client->ps.stats[STAT_WEAPONS] = ( 1 << WP_0 ); //?!!!!! + client->ps.stats[STAT_HOLDABLE_ITEM] = HI_NONE; + targ->health = 1; + player_die( targ, inflictor, attacker, take, mod ); } - }else{ - if ( targ->health <= 0 ) { - if ( client ) - targ->flags |= FL_NO_KNOCKBACK; + }else{ + if ( targ->health <= 0 ) { + if ( client ) + targ->flags |= FL_NO_KNOCKBACK; - if (targ->health < -999) - targ->health = -999; + if (targ->health < -999) + targ->health = -999; - #ifdef G_LUA - if(targ->luaDie && !targ->client) - { - LuaHook_G_EntityDie(targ->luaDie, targ->s.number, inflictor->s.number, attacker->s.number, take, mod); +#ifdef G_LUA + if(targ->luaDie && !targ->client) + { + LuaHook_G_EntityDie(targ->luaDie, targ->s.number, inflictor->s.number, attacker->s.number, take, mod); + } +#endif + + targ->enemy = attacker; + targ->die (targ, inflictor, attacker, take, mod); + return; + } + + if ( targ->pain ) { + targ->pain (targ, attacker, take); } - #endif - - targ->enemy = attacker; - //player_die( targ, inflictor, attacker, take, mod ); - //fake_die( targ, inflictor, attacker, take, mod ); //RPG-X: RedTechie - DEBUG by own die function :S - targ->die (targ, inflictor, attacker, take, mod); - return; - } - - if ( targ->pain ) { - targ->pain (targ, attacker, take); } - } G_LogWeaponDamage(attacker->s.number, mod, take); } @@ -1639,21 +1396,6 @@ qboolean CanDamage (gentity_t *targ, vec3_t origin) { vec3_t dest; trace_t tr; vec3_t midpoint; - - - //Wheres the search stuff??? Edit>Find stupid .net - //RPG-X: RedTechie - Need to take this out causes bad crashes with entity shooter, shouldent be needed anyway with newer code - /*if(targ->beingfiredby != NULL) - { - if((targ->r.svFlags ^= SVF_SHIELD_BBOX) == SVF_SHIELD_BBOX){ - if(targ->beingfiredby->client->sess.sessionClass == PC_ADMIN){ - return qtrue; - }else{ - return qfalse; - } - } - - }*/ // use the midpoint of the bounds instead of the origin, because // bmodels may have their origin is 0,0,0 @@ -1707,7 +1449,7 @@ G_RadiusDamage */ extern void tripwireThink ( gentity_t *ent ); qboolean G_RadiusDamage ( vec3_t origin, gentity_t *attacker, float damage, float radius, - gentity_t *ignore, int dflags, int mod) { + gentity_t *ignore, int dflags, int mod) { float points, dist; gentity_t *ent; int entityList[MAX_GENTITIES]; @@ -1864,14 +1606,22 @@ void G_Repair(gentity_t *ent, gentity_t *tr_ent, float rate) { tr_ent->s.eFlags &= ~EF_NODRAW; InitBBrush(tr_ent); tr_ent->health = tr_ent->damage; - if(tr_ent->health) + + if(tr_ent->health) { tr_ent->takedamage = qtrue; + } + tr_ent->use = breakable_use; - if(tr_ent->paintarget) + + if(tr_ent->paintarget) { tr_ent->pain = breakable_pain; + } + tr_ent->clipmask = 0; tr_ent->count = 1; - if(tr_ent->target) + + if(tr_ent->target) { G_UseTargets2(tr_ent, tr_ent, tr_ent->target); + } } }