1785 lines · 40.8 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <stdio.h>#include "../dat.h"#include "../fns.h"#include "m_player.h" void ClientUserinfoChanged (edict_t *ent, char *userinfo); void SP_misc_teleporter_dest (edict_t *ent); //// Gross, ugly, disgustuing hack section// // this function is an ugly as hell hack to fix some map flaws//// the coop spawn spots on some maps are SNAFU.  There are coop spots// with the wrong targetname as well as spots with no name at all//// we use carnal knowledge of the maps to fix the coop spot targetnames to match// that of the nearest named single player spot static void SP_FixCoopSpots (edict_t *self){	edict_t	*spot;	vec3_t	d; 	spot = NULL; 	while(1)	{		spot = G_Find(spot, FOFS(classname), "info_player_start");		if (!spot)			return;		if (!spot->targetname)			continue;		VectorSubtract(self->s.origin, spot->s.origin, d);		if (VectorLength(d) < 384)		{			if ((!self->targetname) || cistrcmp(self->targetname, spot->targetname) != 0)			{//				gi.dprintf("FixCoopSpots changed %s at %s targetname from %s to %s\n", self->classname, vtos(self->s.origin), self->targetname, spot->targetname);				self->targetname = spot->targetname;			}			return;		}	}} // now if that one wasn't ugly enough for you then try this one on for size// some maps don't have any coop spots at all, so we need to create them// where they should have been static void SP_CreateCoopSpots (edict_t */*self*/){	edict_t	*spot; 	if(cistrcmp(level.mapname, "security") == 0)	{		spot = G_Spawn();		spot->classname = "info_player_coop";		spot->s.origin[0] = 188 - 64;		spot->s.origin[1] = -164;		spot->s.origin[2] = 80;		spot->targetname = "jail3";		spot->s.angles[1] = 90; 		spot = G_Spawn();		spot->classname = "info_player_coop";		spot->s.origin[0] = 188 + 64;		spot->s.origin[1] = -164;		spot->s.origin[2] = 80;		spot->targetname = "jail3";		spot->s.angles[1] = 90; 		spot = G_Spawn();		spot->classname = "info_player_coop";		spot->s.origin[0] = 188 + 128;		spot->s.origin[1] = -164;		spot->s.origin[2] = 80;		spot->targetname = "jail3";		spot->s.angles[1] = 90; 		return;	}}  /*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32)The normal starting point for a level.*/void SP_info_player_start(edict_t *self){	if (!coop->value)		return;	if(cistrcmp(level.mapname, "security") == 0)	{		// invoke one of our gross, ugly, disgusting hacks		self->think = SP_CreateCoopSpots;		self->nextthink = level.time + FRAMETIME;	}} /*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 32)potential spawning position for deathmatch games*/void SP_info_player_deathmatch(edict_t *self){	if (!deathmatch->value)	{		G_FreeEdict (self);		return;	}	SP_misc_teleporter_dest (self);} /*QUAKED info_player_coop (1 0 1) (-16 -16 -24) (16 16 32)potential spawning position for coop games*/ void SP_info_player_coop(edict_t *self){	if (!coop->value)	{		G_FreeEdict (self);		return;	} 	if((cistrcmp(level.mapname, "jail2") == 0)   ||	   (cistrcmp(level.mapname, "jail4") == 0)   ||	   (cistrcmp(level.mapname, "mine1") == 0)   ||	   (cistrcmp(level.mapname, "mine2") == 0)   ||	   (cistrcmp(level.mapname, "mine3") == 0)   ||	   (cistrcmp(level.mapname, "mine4") == 0)   ||	   (cistrcmp(level.mapname, "lab") == 0)     ||	   (cistrcmp(level.mapname, "boss1") == 0)   ||	   (cistrcmp(level.mapname, "fact3") == 0)   ||	   (cistrcmp(level.mapname, "biggun") == 0)  ||	   (cistrcmp(level.mapname, "space") == 0)   ||	   (cistrcmp(level.mapname, "command") == 0) ||	   (cistrcmp(level.mapname, "power2") == 0) ||	   (cistrcmp(level.mapname, "strike") == 0))	{		// invoke one of our gross, ugly, disgusting hacks		self->think = SP_FixCoopSpots;		self->nextthink = level.time + FRAMETIME;	}}  /*QUAKED info_player_intermission (1 0 1) (-16 -16 -24) (16 16 32)The deathmatch intermission point will be at one of theseUse 'angles' instead of 'angle', so you can set pitch or roll as well as yaw.  'pitch yaw roll'*/void SP_info_player_intermission (edict_t */*ent*/){}  //=======================================================================  void player_pain (edict_t */*self*/, edict_t */*other*/, float /*kick*/, int /*damage*/){	// player pain is handled at the end of the frame in P_DamageFeedback}  qboolean IsFemale (edict_t *ent){	char		*info; 	if (!ent->client)		return false; 	info = Info_ValueForKey (ent->client->pers.userinfo, "gender");	if (info[0] == 'f' || info[0] == 'F')		return true;	return false;} qboolean IsNeutral (edict_t *ent){	char		*info; 	if (!ent->client)		return false; 	info = Info_ValueForKey (ent->client->pers.userinfo, "gender");	if (info[0] != 'f' && info[0] != 'F' && info[0] != 'm' && info[0] != 'M')		return true;	return false;} void ClientObituary (edict_t *self, edict_t */*inflictor*/, edict_t *attacker){	int			mod;	char		*message;	char		*message2;	qboolean	ff; 	if (coop->value && attacker->client)		meansOfDeath |= MOD_FRIENDLY_FIRE; 	if (deathmatch->value || coop->value)	{		ff = meansOfDeath & MOD_FRIENDLY_FIRE;		mod = meansOfDeath & ~MOD_FRIENDLY_FIRE;		message = NULL;		message2 = ""; 		switch (mod)		{		case MOD_SUICIDE:			message = "suicides";			break;		case MOD_FALLING:			message = "cratered";			break;		case MOD_CRUSH:			message = "was squished";			break;		case MOD_WATER:			message = "sank like a rock";			break;		case MOD_SLIME:			message = "melted";			break;		case MOD_LAVA:			message = "does a back flip into the lava";			break;		case MOD_EXPLOSIVE:		case MOD_BARREL:			message = "blew up";			break;		case MOD_EXIT:			message = "found a way out";			break;		case MOD_TARGET_LASER:			message = "saw the light";			break;		case MOD_TARGET_BLASTER:			message = "got blasted";			break;		case MOD_BOMB:		case MOD_SPLASH:		case MOD_TRIGGER_HURT:			message = "was in the wrong place";			break;		}		if (attacker == self)		{			switch (mod)			{			case MOD_HELD_GRENADE:				message = "tried to put the pin back in";				break;			case MOD_HG_SPLASH:			case MOD_G_SPLASH:				if (IsNeutral(self))					message = "tripped on its own grenade";				else if (IsFemale(self))					message = "tripped on her own grenade";				else					message = "tripped on his own grenade";				break;			case MOD_R_SPLASH:				if (IsNeutral(self))					message = "blew itself up";				else if (IsFemale(self))					message = "blew herself up";				else					message = "blew himself up";				break;			case MOD_BFG_BLAST:				message = "should have used a smaller gun";				break;			default:				if (IsNeutral(self))					message = "killed itself";				else if (IsFemale(self))					message = "killed herself";				else					message = "killed himself";				break;			}		}		if (message)		{			gi.bprintf (PRINT_MEDIUM, "%s %s.\n", self->client->pers.netname, message);			if (deathmatch->value)				self->client->resp.score--;			self->enemy = NULL;			return;		} 		self->enemy = attacker;		if (attacker && attacker->client)		{			switch (mod)			{			case MOD_BLASTER:				message = "was blasted by";				break;			case MOD_SHOTGUN:				message = "was gunned down by";				break;			case MOD_SSHOTGUN:				message = "was blown away by";				message2 = "'s super shotgun";				break;			case MOD_MACHINEGUN:				message = "was machinegunned by";				break;			case MOD_CHAINGUN:				message = "was cut in half by";				message2 = "'s chaingun";				break;			case MOD_GRENADE:				message = "was popped by";				message2 = "'s grenade";				break;			case MOD_G_SPLASH:				message = "was shredded by";				message2 = "'s shrapnel";				break;			case MOD_ROCKET:				message = "ate";				message2 = "'s rocket";				break;			case MOD_R_SPLASH:				message = "almost dodged";				message2 = "'s rocket";				break;			case MOD_HYPERBLASTER:				message = "was melted by";				message2 = "'s hyperblaster";				break;			case MOD_RAILGUN:				message = "was railed by";				break;			case MOD_BFG_LASER:				message = "saw the pretty lights from";				message2 = "'s BFG";				break;			case MOD_BFG_BLAST:				message = "was disintegrated by";				message2 = "'s BFG blast";				break;			case MOD_BFG_EFFECT:				message = "couldn't hide from";				message2 = "'s BFG";				break;			case MOD_HANDGRENADE:				message = "caught";				message2 = "'s handgrenade";				break;			case MOD_HG_SPLASH:				message = "didn't see";				message2 = "'s handgrenade";				break;			case MOD_HELD_GRENADE:				message = "feels";				message2 = "'s pain";				break;			case MOD_TELEFRAG:				message = "tried to invade";				message2 = "'s personal space";				break;			}			if (message)			{				gi.bprintf (PRINT_MEDIUM,"%s %s %s%s\n", self->client->pers.netname, message, attacker->client->pers.netname, message2);				if (deathmatch->value)				{					if (ff)						attacker->client->resp.score--;					else						attacker->client->resp.score++;				}				return;			}		}	} 	gi.bprintf (PRINT_MEDIUM,"%s died.\n", self->client->pers.netname);	if (deathmatch->value)		self->client->resp.score--;}  void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf); void TossClientWeapon (edict_t *self){	gitem_t		*item;	edict_t		*drop;	qboolean	quad;	float		spread; 	if (!deathmatch->value)		return; 	item = self->client->pers.weapon;	if (! self->client->pers.inventory[self->client->ammo_index] )		item = NULL;	if (item && (strcmp (item->pickup_name, "Blaster") == 0))		item = NULL; 	if (!((int)(dmflags->value) & DF_QUAD_DROP))		quad = false;	else		quad = (self->client->quad_framenum > (level.framenum + 10)); 	if (item && quad)		spread = 22.5;	else		spread = 0.0; 	if (item)	{		self->client->v_angle[YAW] -= spread;		drop = Drop_Item (self, item);		self->client->v_angle[YAW] += spread;		drop->spawnflags = DROPPED_PLAYER_ITEM;	} 	if (quad)	{		self->client->v_angle[YAW] += spread;		drop = Drop_Item (self, FindItemByClassname ("item_quad"));		self->client->v_angle[YAW] -= spread;		drop->spawnflags |= DROPPED_PLAYER_ITEM; 		drop->touch = Touch_Item;		drop->nextthink = level.time + (self->client->quad_framenum - level.framenum) * FRAMETIME;		drop->think = G_FreeEdict;	}}  /*==================LookAtKiller==================*/void LookAtKiller (edict_t *self, edict_t *inflictor, edict_t *attacker){	vec3_t		dir; 	if (attacker && attacker != WORLD && attacker != self)	{		VectorSubtract (attacker->s.origin, self->s.origin, dir);	}	else if (inflictor && inflictor != WORLD && inflictor != self)	{		VectorSubtract (inflictor->s.origin, self->s.origin, dir);	}	else	{		self->client->killer_yaw = self->s.angles[YAW];		return;	} 	if (dir[0])		self->client->killer_yaw = 180/M_PI*atan2(dir[1], dir[0]);	else {		self->client->killer_yaw = 0;		if (dir[1] > 0)			self->client->killer_yaw = 90;		else if (dir[1] < 0)			self->client->killer_yaw = -90;	}	if (self->client->killer_yaw < 0)		self->client->killer_yaw += 360;	 } /*==================player_die==================*/void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t /*point*/){	int		n; 	VectorClear (self->avelocity); 	self->takedamage = DAMAGE_YES;	self->movetype = MOVETYPE_TOSS; 	self->s.modelindex2 = 0;	// remove linked weapon model 	self->s.angles[0] = 0;	self->s.angles[2] = 0; 	self->s.sound = 0;

Lines 1–500 of 1785.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t