예제 #1
0
파일: combat.c 프로젝트: meag/ktx
/*
============
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 );
	}
}
예제 #2
0
파일: combat.c 프로젝트: meag/ktx
/*
============
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 );
	}
}
예제 #3
0
파일: ctf.c 프로젝트: JosephPecoraro/ktx
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 );
	}
}
예제 #4
0
파일: spy.c 프로젝트: stayoutEE/TF2003-qvm
//=========================================================================
// 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;
		}
	}
}