r2304 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Apr 13 18:31:29 EDT 2007


Author: div0
Date: 2007-04-13 18:31:29 -0400 (Fri, 13 Apr 2007)
New Revision: 2304

Added:
   trunk/data/qcsrc/server/waypointsprites.qc
Log:
sorry, forgot this file


Added: trunk/data/qcsrc/server/waypointsprites.qc
===================================================================
--- trunk/data/qcsrc/server/waypointsprites.qc	                        (rev 0)
+++ trunk/data/qcsrc/server/waypointsprites.qc	2007-04-13 22:31:29 UTC (rev 2304)
@@ -0,0 +1,300 @@
+float waypointsprite_normdistance;
+float waypointsprite_minscale;
+float waypointsprite_fadedistance;
+float waypointsprite_minalpha;
+float waypointsprite_distancealphaexponent;
+float waypointsprite_timealphaexponent;
+float waypointsprite_deployed_lifetime;
+float waypointsprite_deadlifetime;
+float waypointsprite_limitedrange;
+
+..entity owned_by_field;
+
+void WaypointSprite_Init()
+{
+	waypointsprite_fadedistance = vlen(world.maxs - world.mins);
+	waypointsprite_normdistance = cvar("g_waypointsprite_normdistance");
+	waypointsprite_minscale = cvar("g_waypointsprite_minscale");
+	waypointsprite_minalpha = cvar("g_waypointsprite_minalpha");
+	waypointsprite_distancealphaexponent = cvar("g_waypointsprite_distancealphaexponent");
+	waypointsprite_timealphaexponent = cvar("g_waypointsprite_timealphaexponent");
+	waypointsprite_deployed_lifetime = cvar("g_waypointsprite_deployed_lifetime");
+	waypointsprite_deadlifetime = cvar("g_waypointsprite_deadlifetime");
+	waypointsprite_limitedrange = cvar("g_waypointsprite_limitedrange");
+
+	precache_model("models/sprites/bluebase.sp2");
+	precache_model("models/sprites/flagcarrier.sp2");
+	precache_model("models/sprites/here.sp2");
+	precache_model("models/sprites/helpme.sp2");
+	precache_model("models/sprites/redbase.sp2");
+	precache_model("models/sprites/waypoint.sp2");
+	precache_model("models/sprites/danger.sp2");
+}
+
+void WaypointSprite_InitClient(entity e)
+{
+	stuffcmd(e, "\nalias \"g_waypointsprite_personal\" \"impulse 30\"\n alias \"g_waypointsprite_personal_p\" \"impulse 31\"\n alias \"g_waypointsprite_personal_d\" \"impulse 32\"\n alias \"g_waypointsprite_team_helpme\" \"impulse 33\"\n alias \"g_waypointsprite_team_here\" \"impulse 34\"\n alias \"g_waypointsprite_team_here_p\" \"impulse 35\"\n alias \"g_waypointsprite_team_here_d\" \"impulse 36\"\n alias \"g_waypointsprite_team_danger\" \"impulse 37\"\n alias \"g_waypointsprite_team_danger_p\" \"impulse 38\"\n alias \"g_waypointsprite_team_danger_d\" \"impulse 39\"\n alias \"g_waypointsprite_clear_personal\" \"impulse 47\"\n alias \"g_waypointsprite_clear\" \"impulse 48\"\n alias \"g_waypointsprite_toggle\" \"impulse 49\"\n");
+}
+
+void WaypointSprite_Kill(entity wp)
+{
+	if(!wp)
+		return;
+	if(wp.owner)
+		wp.owner.(wp.owned_by_field) = world;
+	remove(wp);
+}
+
+void WaypointSprite_Disown(entity wp, float fadetime)
+{
+	if(!wp)
+		return;
+	if(wp.owner)
+	{
+		if(wp.aiment == wp.owner)
+		{
+			wp.view_ofs = wp.view_ofs + wp.aiment.origin;
+			wp.aiment = world;
+		}
+		wp.owner.(wp.owned_by_field) = world;
+		wp.owner = world;
+
+		if(!wp.health)
+		{
+			wp.health = fadetime;
+			wp.teleport_time = time + fadetime;
+		}
+		else if(fadetime < (wp.teleport_time - time))
+		{
+			// accelerate the waypoint's dying
+			// ensure:
+			//   (wp.teleport_time - time) / wp.health stays
+			//   wp.teleport_time = time + fadetime
+			float current_fadetime;
+			current_fadetime = wp.teleport_time - time;
+			wp.teleport_time = time + fadetime;
+			wp.health = wp.health * fadetime / current_fadetime;
+		}
+	}
+}
+
+void WaypointSprite_Think()
+{
+	float doremove;
+
+	doremove = FALSE;
+
+	if(self.health)
+		if(time >= self.teleport_time)
+			doremove = TRUE;
+
+	if(doremove)
+		WaypointSprite_Kill(self);
+	else
+		self.nextthink = time;
+}
+
+float WaypointSprite_CustomizeEntityForClient()
+{
+	vector realorigin, porigin;
+	float distancealpha, timealpha;
+	float distance;
+
+	if(self.health)
+	{
+		timealpha = bound(0, (self.teleport_time - time) / self.health, 1);
+		if(timealpha == 0)
+			return FALSE;
+		timealpha = pow(timealpha, waypointsprite_timealphaexponent);
+	}
+	else
+		timealpha = 1;
+
+	if(self.enemy)
+		if(self.enemy != other)
+			return FALSE;
+	if(self.team)
+	{
+		if(self.team != other.team)
+			return FALSE;
+		if(other.classname != "player")
+			return FALSE;
+	}
+
+	// do not draw to yourself when attached
+	if(self.aiment)
+		if(other == self.aiment)
+			return FALSE;
+
+	if(self.currentammo) // hidable?
+		if(other.cvar_cl_hidewaypoints) // wants to hide;
+			return FALSE;
+
+	porigin = other.origin + other.view_ofs_z * '0 0 1';
+	realorigin = self.aiment.origin + self.view_ofs;
+	self.origin = realorigin;
+
+	distance = vlen(realorigin - porigin);
+
+	if(self.max_health)
+		if(distance >= self.max_health)
+			return FALSE;
+
+	self.scale = max(1, distance / waypointsprite_normdistance) * waypointsprite_minscale;
+
+	if(self.max_health > waypointsprite_normdistance)
+	{
+		// alpha 1 at normdistance, alpha 0 at maxdistance
+		distancealpha = bound(0, (self.max_health - distance) / (self.max_health - waypointsprite_normdistance), 1);
+		distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
+	}
+	else if(self.max_health)
+	{
+		// alpha 1 if visible
+		distancealpha = 1;
+	}
+	else
+	{
+		// alpha 1 at normdistance, alpha minalpha at fadedistance
+		distancealpha = bound(0, (waypointsprite_fadedistance - distance) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1);
+		distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
+		distancealpha = distancealpha * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
+	}
+
+	self.alpha = timealpha * distancealpha;
+
+	return TRUE;
+}
+
+entity WaypointSprite_Spawn(
+	string spr, // sprite
+	float lifetime, float maxdistance, // lifetime, max distance
+	entity ref, vector ofs, // position
+	entity showto, float t, // show to whom? Use a flag to indicate a team
+	entity own, .entity ownfield, // remove when own gets killed
+	float hideable // true when it should be controlled by cl_hidewaypoints
+)
+{
+	entity wp;
+	wp = spawn();
+	wp.classname = "sprite_waypoint";
+	wp.teleport_time = time + lifetime;
+	wp.health = lifetime;
+	wp.view_ofs = ofs;
+	wp.aiment = ref;
+	wp.enemy = showto;
+	wp.team = t;
+	wp.owner = own;
+	wp.currentammo = hideable;
+	if(own)
+	{
+		if(own.ownfield)
+			remove(own.ownfield);
+		own.ownfield = wp;
+		wp.owned_by_field = ownfield;
+	}
+	wp.max_health = maxdistance;
+	wp.customizeentityforclient = WaypointSprite_CustomizeEntityForClient;
+	wp.think = WaypointSprite_Think;
+	wp.nextthink = time;
+	wp.effects = EF_NODEPTHTEST;
+	setmodel(wp, strcat("models/sprites/", spr, ".sp2"));
+	return wp;
+}
+
+entity WaypointSprite_SpawnFixed(
+	string spr,
+	vector ofs
+)
+{
+	return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, world, enemy, TRUE);
+}
+
+.entity waypointsprite_deployed_fixed;
+entity WaypointSprite_DeployFixed(
+	string spr,
+	float limited_range,
+	vector ofs
+)
+{
+	float t, maxdistance;
+	if(teams_matter)
+		t = self.team;
+	else
+		t = 0;
+	if(limited_range)
+		maxdistance = waypointsprite_limitedrange;
+	else
+		maxdistance = 0;
+	return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
+}
+
+.entity waypointsprite_deployed_personal;
+entity WaypointSprite_DeployPersonal(
+	string spr,
+	vector ofs
+)
+{
+	return WaypointSprite_Spawn(spr, 0, 0, world, ofs, self, 0, self, waypointsprite_deployed_personal, FALSE);
+}
+
+.entity waypointsprite_attached;
+.entity waypointsprite_attachedforcarrier;
+entity WaypointSprite_Attach(
+	string spr,
+	float limited_range
+)
+{
+	float t, maxdistance;
+	if(self.waypointsprite_attachedforcarrier)
+		return world; // can't attach to FC
+	if(teams_matter)
+		t = self.team;
+	else
+		t = 0;
+	if(limited_range)
+		maxdistance = waypointsprite_limitedrange;
+	else
+		maxdistance = 0;
+	return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
+}
+
+entity WaypointSprite_AttachCarrier(
+	string spr,
+	entity carrier
+)
+{
+	WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
+	return WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
+}
+
+void WaypointSprite_DetachCarrier(entity carrier)
+{
+	WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, 1);
+}
+
+void WaypointSprite_ClearPersonal()
+{
+	WaypointSprite_Kill(self.waypointsprite_deployed_personal);
+}
+
+void WaypointSprite_ClearOwned()
+{
+	WaypointSprite_Kill(self.waypointsprite_deployed_fixed);
+	WaypointSprite_Kill(self.waypointsprite_deployed_personal);
+	WaypointSprite_Kill(self.waypointsprite_attached);
+}
+
+void WaypointSprite_PlayerDead()
+{
+	WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
+	WaypointSprite_DetachCarrier(self);
+}
+
+void WaypointSprite_PlayerGone()
+{
+	WaypointSprite_Disown(self.waypointsprite_deployed_fixed, waypointsprite_deadlifetime);
+	WaypointSprite_Kill(self.waypointsprite_deployed_personal);
+	WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
+	WaypointSprite_DetachCarrier(self);
+}




More information about the nexuiz-commits mailing list