1 float waypointsprite_normdistance;
2 float waypointsprite_minscale;
3 float waypointsprite_fadedistance;
4 float waypointsprite_minalpha;
5 float waypointsprite_distancealphaexponent;
6 float waypointsprite_timealphaexponent;
7 float waypointsprite_deployed_lifetime;
8 float waypointsprite_deadlifetime;
9 float waypointsprite_limitedrange;
11 ..entity owned_by_field;
13 void WaypointSprite_Init()
15 waypointsprite_fadedistance = vlen(world.maxs - world.mins);
16 waypointsprite_normdistance = cvar("g_waypointsprite_normdistance");
17 waypointsprite_minscale = cvar("g_waypointsprite_minscale");
18 waypointsprite_minalpha = cvar("g_waypointsprite_minalpha");
19 waypointsprite_distancealphaexponent = cvar("g_waypointsprite_distancealphaexponent");
20 waypointsprite_timealphaexponent = cvar("g_waypointsprite_timealphaexponent");
21 waypointsprite_deployed_lifetime = cvar("g_waypointsprite_deployed_lifetime");
22 waypointsprite_deadlifetime = cvar("g_waypointsprite_deadlifetime");
23 waypointsprite_limitedrange = cvar("g_waypointsprite_limitedrange");
25 precache_model("models/sprites/bluebase.sp2");
26 precache_model("models/sprites/flagcarrier.sp2");
27 precache_model("models/sprites/here.sp2");
28 precache_model("models/sprites/helpme.sp2");
29 precache_model("models/sprites/redbase.sp2");
30 precache_model("models/sprites/waypoint.sp2");
31 precache_model("models/sprites/danger.sp2");
34 void WaypointSprite_InitClient(entity e)
36 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");
39 void WaypointSprite_Kill(entity wp)
44 wp.owner.(wp.owned_by_field) = world;
48 void WaypointSprite_Disown(entity wp, float fadetime)
54 if(wp.aiment == wp.owner)
56 wp.view_ofs = wp.view_ofs + wp.aiment.origin;
59 wp.owner.(wp.owned_by_field) = world;
65 wp.teleport_time = time + fadetime;
67 else if(fadetime < (wp.teleport_time - time))
69 // accelerate the waypoint's dying
71 // (wp.teleport_time - time) / wp.health stays
72 // wp.teleport_time = time + fadetime
73 float current_fadetime;
74 current_fadetime = wp.teleport_time - time;
75 wp.teleport_time = time + fadetime;
76 wp.health = wp.health * fadetime / current_fadetime;
81 void WaypointSprite_Think()
88 if(time >= self.teleport_time)
92 WaypointSprite_Kill(self);
94 self.nextthink = time;
97 float WaypointSprite_CustomizeEntityForClient()
99 vector realorigin, porigin;
100 float distancealpha, timealpha;
105 timealpha = bound(0, (self.teleport_time - time) / self.health, 1);
108 timealpha = pow(timealpha, waypointsprite_timealphaexponent);
114 if(self.enemy != other)
118 if(self.team != other.team)
120 if(other.classname != "player")
124 // do not draw to yourself when attached
126 if(other == self.aiment)
129 if(self.currentammo) // hidable?
130 if(other.cvar_cl_hidewaypoints) // wants to hide;
133 porigin = other.origin + other.view_ofs_z * '0 0 1';
134 realorigin = self.aiment.origin + self.view_ofs;
135 self.origin = realorigin;
137 distance = vlen(realorigin - porigin);
140 if(distance >= self.max_health)
143 self.scale = max(1, distance / waypointsprite_normdistance) * waypointsprite_minscale;
145 if(self.max_health > waypointsprite_normdistance)
147 // alpha 1 at normdistance, alpha 0 at maxdistance
148 distancealpha = bound(0, (self.max_health - distance) / (self.max_health - waypointsprite_normdistance), 1);
149 distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
151 else if(self.max_health)
153 // alpha 1 if visible
158 // alpha 1 at normdistance, alpha minalpha at fadedistance
159 distancealpha = bound(0, (waypointsprite_fadedistance - distance) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1);
160 distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
161 distancealpha = distancealpha * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
164 self.alpha = timealpha * distancealpha;
169 entity WaypointSprite_Spawn(
170 string spr, // sprite
171 float lifetime, float maxdistance, // lifetime, max distance
172 entity ref, vector ofs, // position
173 entity showto, float t, // show to whom? Use a flag to indicate a team
174 entity own, .entity ownfield, // remove when own gets killed
175 float hideable // true when it should be controlled by cl_hidewaypoints
180 wp.classname = "sprite_waypoint";
181 wp.teleport_time = time + lifetime;
182 wp.health = lifetime;
188 wp.currentammo = hideable;
192 remove(own.ownfield);
194 wp.owned_by_field = ownfield;
196 wp.max_health = maxdistance;
197 wp.customizeentityforclient = WaypointSprite_CustomizeEntityForClient;
198 wp.think = WaypointSprite_Think;
200 wp.effects = EF_NODEPTHTEST;
201 setmodel(wp, strcat("models/sprites/", spr, ".sp2"));
205 entity WaypointSprite_SpawnFixed(
210 return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, world, enemy, TRUE);
213 .entity waypointsprite_deployed_fixed;
214 entity WaypointSprite_DeployFixed(
220 float t, maxdistance;
226 maxdistance = waypointsprite_limitedrange;
229 return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
232 .entity waypointsprite_deployed_personal;
233 entity WaypointSprite_DeployPersonal(
238 return WaypointSprite_Spawn(spr, 0, 0, world, ofs, self, 0, self, waypointsprite_deployed_personal, FALSE);
241 .entity waypointsprite_attached;
242 .entity waypointsprite_attachedforcarrier;
243 entity WaypointSprite_Attach(
248 float t, maxdistance;
249 if(self.waypointsprite_attachedforcarrier)
250 return world; // can't attach to FC
256 maxdistance = waypointsprite_limitedrange;
259 return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
262 entity WaypointSprite_AttachCarrier(
267 WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
268 return WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
271 void WaypointSprite_DetachCarrier(entity carrier)
273 WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, 1);
276 void WaypointSprite_ClearPersonal()
278 WaypointSprite_Kill(self.waypointsprite_deployed_personal);
281 void WaypointSprite_ClearOwned()
283 WaypointSprite_Kill(self.waypointsprite_deployed_fixed);
284 WaypointSprite_Kill(self.waypointsprite_deployed_personal);
285 WaypointSprite_Kill(self.waypointsprite_attached);
288 void WaypointSprite_PlayerDead()
290 WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
291 WaypointSprite_DetachCarrier(self);
294 void WaypointSprite_PlayerGone()
296 WaypointSprite_Disown(self.waypointsprite_deployed_fixed, waypointsprite_deadlifetime);
297 WaypointSprite_Kill(self.waypointsprite_deployed_personal);
298 WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
299 WaypointSprite_DetachCarrier(self);