/* ============ T_BeamDamage ============ */ void T_BeamDamage( gedict_t * attacker, float damage ) { vec3_t tmpv; float points; gedict_t *head; head = trap_findradius( world, attacker->s.v.origin, damage + 40 ); while ( head ) { if ( head->s.v.takedamage ) { VectorSubtract( attacker->s.v.origin, head->s.v.origin, tmpv ) points = 0.5 * vlen( tmpv ); if ( points < 0 ) points = 0; points = damage - points; if ( head == attacker ) points = points * 0.5; if ( points > 0 ) { if ( CanDamage( head, attacker ) ) T_Damage( head, attacker, attacker, points ); } } head = trap_findradius( head, attacker->s.v.origin, damage + 40 ); } }
/* ============ T_RadiusDamage ============ */ void T_RadiusDamage( gedict_t * inflictor, gedict_t * attacker, float damage, gedict_t * ignore, deathType_t dtype ) { float points; gedict_t *head; vec3_t org; head = trap_findradius( world, inflictor->s.v.origin, damage + 40 ); while ( head ) { if ( head != ignore ) { if ( head->s.v.takedamage ) { org[0] = inflictor->s.v.origin[0] - ( head->s.v.origin[0] + ( head->s.v.mins[0] + head->s.v.maxs[0] ) * 0.5 ); org[1] = inflictor->s.v.origin[1] - ( head->s.v.origin[1] + ( head->s.v.mins[1] + head->s.v.maxs[1] ) * 0.5 ); org[2] = inflictor->s.v.origin[2] - ( head->s.v.origin[2] + ( head->s.v.mins[2] + head->s.v.maxs[2] ) * 0.5 ); points = 0.5 * vlen( org ); if ( points < 0 ) points = 0; points = damage - points; if ( head == attacker ) points = points * 0.5; // no out of water discharge damage if k_dis 2 else if ( cvar("k_dis") == 2 && dtLG_DIS == dtype && !head->s.v.waterlevel ) points = 0; if ( points > 0 ) { if ( CanDamage( head, inflictor ) ) { head->deathtype = dtype; dmg_is_splash = 1; // mark damage as splash if ( cvar("k_instagib") || isRACE() ) // in instagib splash applied to inflictor only, for coil jump { if ( head == attacker ) T_Damage( head, inflictor, attacker, points ); } else { // shamblers only take half damage from rocket/grenade explosions if ( streq(head->s.v.classname, "monster_shambler") && !cvar("k_bloodfest") ) points = points / 2; T_Damage( head, inflictor, attacker, points ); } dmg_is_splash = 0; // unmark splash } } } } head = trap_findradius( head, inflictor->s.v.origin, damage + 40 ); } }
void CTF_Obituary( gedict_t *targ, gedict_t *attacker ) { qbool carrier_bonus = false; qbool flagdefended = false; gedict_t *head; char *attackerteam; if ( !isCTF() ) return; attackerteam = getteam(attacker); // 2 point bonus for killing enemy flag carrier if ( targ->ctf_flag & CTF_FLAG ) { attacker->ps.c_frags++; attacker->s.v.frags += 2; attacker->ps.ctf_points += 2; attacker->carrier_frag_time = g_globalvars.time; //G_sprint( attacker, 1, "Enemy flag carrier killed: 2 bonus frags\n" ); } // defending carrier from aggressive player if (( targ->carrier_hurt_time + CARRIER_DEFEND_TIME > g_globalvars.time ) && !( attacker->ctf_flag & CTF_FLAG ) ) { carrier_bonus = true; attacker->ps.c_defends++; attacker->s.v.frags += 2; attacker->ps.ctf_points += 2; // Yes, aggressive is spelled wrong.. but dont want to fix now and break stat parsers G_bprint( 2, "%s defends %s's flag carrier against an agressive enemy\n", attacker->s.v.netname, streq( getteam(attacker), "red" ) ? redtext("RED") : redtext("BLUE") ); } head = trap_findradius( world, targ->s.v.origin, 400 ); while ( head ) { if ( head->ct == ctPlayer ) { if ( (head->ctf_flag & CTF_FLAG) && ( head != attacker ) && streq(getteam(head), getteam(attacker)) && !carrier_bonus ) { attacker->ps.c_defends++; attacker->s.v.frags++; attacker->ps.ctf_points++; G_bprint( 2, "%s defends %s's flag carrier\n", attacker->s.v.netname, streq(getteam(attacker), "red") ? redtext("RED") : redtext("BLUE")); } } if ( (streq(getteam(attacker), "red") && streq(head->s.v.classname, "item_flag_team1")) || (streq(getteam(attacker), "blue") && streq(head->s.v.classname, "item_flag_team2")) ) { flagdefended = true; attacker->ps.f_defends++; attacker->s.v.frags += 2; attacker->ps.ctf_points += 2; G_bprint( 2, "%s defends the %s flag\n", attacker->s.v.netname, streq(getteam(attacker), "red") ? redtext("RED") : redtext("BLUE")); } head = trap_findradius( head, targ->s.v.origin, 400 ); } // Defend bonus if attacker is close to flag even if target is not head = trap_findradius( world, attacker->s.v.origin, 400 ); while ( head ) { if ( ( streq(head->s.v.classname, "item_flag_team1") && streq(attackerteam, "red" ) ) || ( streq(head->s.v.classname, "item_flag_team2") && streq(attackerteam, "blue") ) ) { if (!flagdefended) { attacker->ps.f_defends++; attacker->s.v.frags += 2; attacker->ps.ctf_points += 2; G_bprint( 2, "%s defends the %s flag\n", attacker->s.v.netname, streq(attackerteam, "red") ? redtext("RED") : redtext("BLUE")); } } head = trap_findradius( head, attacker->s.v.origin, 400 ); } }
//========================================================================= // Function handling the Spy's feign death ability void TeamFortress_SpyFeignDeath( int issilent ) { int i, j; gedict_t *at_spot; gedict_t *te; self->StatusRefreshTime = g_globalvars.time + 0.1; if ( self->is_feigning ) { // Check to make sure there isn't anyone on top of us at_spot = trap_findradius( world, self->s.v.origin, 64 ); i = 1; j = 0; while ( at_spot ) { if ( streq( at_spot->mdl, "progs/detpack.mdl" ) ) j = 1; if ( streq( at_spot->mdl, "progs/detpack2.mdl" ) && tf_data.birthday == 1 ) j = 1; if ( streq( at_spot->mdl, "progs/turrbase.mdl" ) ) j = 1; if ( streq( at_spot->mdl, "progs/turrgun.mdl" ) ) j = 1; if ( streq( at_spot->mdl, "progs/disp.mdl" ) ) j = 1; if ( streq( at_spot->s.v.classname, "player" ) && !at_spot->s.v.deadflag && self != at_spot ) j = 2; switch ( j ) { case 1: G_sprint( self, 2, "You can't get up with something\non top of you.\n" ); return; case 2: G_sprint( self, 2, "You can't get up while someone\nis standing on you.\n" ); return; } at_spot = trap_findradius( at_spot, self->s.v.origin, 64 ); } SetVector( self->s.v.velocity, 0, 0, 0 ); setsize( self, -16, -16, -24, 16, 16, 32 ); SetVector( self->s.v.view_ofs, 0, 0, 22 ); self->s.v.movetype = MOVETYPE_WALK; self->is_feigning = 0; self->current_weapon = self->s.v.weapon; W_SetCurrentAmmo( ); self->tfstate = self->tfstate - ( self->tfstate & TFSTATE_CANT_MOVE ); TeamFortress_SetSpeed( self ); // Check .weapon, because .current_weapon has been reset if ( self->s.v.weapon <= 16 ) { spy_upaxe1( ); return; } switch ( ( int ) ( g_random( ) * 4 ) ) { case 0: spy_upb1( ); break; case 1: spy_upc1( ); break; case 2: spy_upd1( ); break; default: spy_upe1( ); break; } return; } else // !self->is_feigning { if ( self->hook_out ) { G_sprint( self, 2, "You can't feign with the hook out.\n" ); return; } //REMOVE!!! /* if (self.is_unabletospy == 1) { G_sprint(self, 2, "You can't go undercover right now.\n"); return; }*/ /* if (!(self.flags & 512) && !self->s.v.waterlevel) { G_sprint(self, 2, "You can't feign in the air.\n"); return; }*/ for ( at_spot = world; ( at_spot = trap_findradius( at_spot, self->s.v.origin, 64 ) ) ; ) { if ( streq( at_spot->s.v.classname, "player" ) && self != at_spot && at_spot->is_feigning == 1 ) { G_sprint( self, 2, "You can't feign on top of another spy!\n" ); return; } } self->tfstate = self->tfstate | TFSTATE_CANT_MOVE; TeamFortress_SetSpeed( self ); self->is_feigning = 1; Attack_Finished( 0.8 ); self->invisible_finished = 0; self->s.v.modelindex = modelindex_player; self->s.v.weapon = self->current_weapon; self->current_weapon = 0; self->s.v.weaponmodel = ""; self->s.v.weaponframe = 0; setsize( self, -16, -16, -24, 16, 16, -16 ); SetVector( self->s.v.view_ofs, 0, 0, 4 ); self->s.v.movetype = MOVETYPE_TOSS; if ( !issilent ) DeathSound( ); self->s.v.angles[0] = 0; self->s.v.angles[2] = 0; if ( self->s.v.weapon <= 16 ) { spy_die_ax1( ); return; } te = world; for( te = world; ( te = trap_find( te, FOFS( s.v.classname ), "item_tfgoal" ) ) ;) { if ( te->s.v.owner != EDICT_TO_PROG( self ) ) continue; if ( !( te->goal_activation & TFGI_KEEP ) || self->has_disconnected == 1 ) tfgoalitem_RemoveFromPlayer( te, self, 0 ); if ( CTF_Map == 1 ) { if ( te->goal_no == 1 ) G_bprint( 2, "%s лост the блуе flag!\n", self->s.v.netname ); else G_bprint( 2, "%s лост the ред flag!\n", self->s.v.netname ); } } switch ( ( int ) ( g_random( ) * 5 ) ) { case 0: spy_diea1( ); break; case 1: spy_dieb1( ); break; case 2: spy_diec1( ); break; case 3: spy_died1( ); break; default: spy_diee1( ); break; } } }