1 ..entity owned_by_field;
6 .float(entity) waypointsprite_visible_for_player;
8 void WaypointSprite_UpdateSprites(entity e, string m1, string m2, string m3)
27 void WaypointSprite_UpdateOrigin(entity e, vector o)
33 void WaypointSprite_UpdateRule(entity e, float t, float r)
40 void WaypointSprite_UpdateTeamRadar(entity e, float icon, vector col)
42 e.cnt = (icon & 0x7F);
47 void WaypointSprite_Ping(entity e)
53 void WaypointSprite_FadeOutIn(entity e, float t)
58 e.teleport_time = time + t;
60 else if(t < (e.teleport_time - time))
62 // accelerate the waypoint's dying
64 // (e.teleport_time - time) / wp.health stays
65 // e.teleport_time = time + fadetime
66 float current_fadetime;
67 current_fadetime = e.teleport_time - time;
68 e.teleport_time = time + t;
69 e.health = e.health * t / current_fadetime;
75 float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
76 void WaypointSprite_Init()
78 waypointsprite_limitedrange = cvar("g_waypointsprite_limitedrange");
79 waypointsprite_deployed_lifetime = cvar("g_waypointsprite_deployed_lifetime");
80 waypointsprite_deadlifetime = cvar("g_waypointsprite_deadlifetime");
82 void WaypointSprite_InitClient(entity e)
86 void WaypointSprite_Kill(entity wp)
91 wp.owner.(wp.owned_by_field) = world;
95 void WaypointSprite_Disown(entity wp, float fadetime)
101 if(wp.exteriormodeltoclient == wp.owner)
102 wp.exteriormodeltoclient = world;
103 wp.owner.(wp.owned_by_field) = world;
106 WaypointSprite_FadeOutIn(wp, fadetime);
110 void WaypointSprite_Think()
118 if(time >= self.teleport_time)
122 if(self.exteriormodeltoclient)
123 WaypointSprite_UpdateOrigin(self, self.exteriormodeltoclient.origin + self.view_ofs);
126 WaypointSprite_Kill(self);
128 self.nextthink = time; // WHY?!?
131 float WaypointSprite_visible_for_player(entity e)
133 // personal waypoints
135 if(self.enemy != other)
139 if(self.team && self.rule == SPRITERULE_DEFAULT)
141 if(self.team != other.team)
143 if(other.classname != "player")
150 float WaypointSprite_Customize()
152 // this is not in SendEntity because it shall run every frame, not just every update
154 return self.waypointsprite_visible_for_player(other);
157 float WaypointSprite_SendEntity(entity to, float sendflags)
159 WriteByte(MSG_ENTITY, ENT_CLIENT_WAYPOINT);
160 WriteByte(MSG_ENTITY, sendflags);
161 WriteCoord(MSG_ENTITY, self.origin_x);
162 WriteCoord(MSG_ENTITY, self.origin_y);
163 WriteCoord(MSG_ENTITY, self.origin_z);
167 WriteByte(MSG_ENTITY, self.team);
168 WriteByte(MSG_ENTITY, self.rule);
172 WriteString(MSG_ENTITY, self.model);
175 WriteString(MSG_ENTITY, self.model2);
178 WriteString(MSG_ENTITY, self.model3);
182 WriteCoord(MSG_ENTITY, self.health);
183 WriteCoord(MSG_ENTITY, self.teleport_time);
184 WriteShort(MSG_ENTITY, self.max_health); // maxdist
189 if(self.exteriormodeltoclient == to)
191 WriteByte(MSG_ENTITY, f);
196 WriteByte(MSG_ENTITY, self.cnt); // icon on radar
197 WriteByte(MSG_ENTITY, self.colormod_x * 255.0);
198 WriteByte(MSG_ENTITY, self.colormod_y * 255.0);
199 WriteByte(MSG_ENTITY, self.colormod_z * 255.0);
205 entity WaypointSprite_Spawn(
206 string spr, // sprite
207 float lifetime, float maxdistance, // lifetime, max distance
208 entity ref, vector ofs, // position
209 entity showto, float t, // show to whom? Use a flag to indicate a team
210 entity own, .entity ownfield, // remove when own gets killed
211 float hideable // true when it should be controlled by cl_hidewaypoints
216 wp.classname = "sprite_waypoint";
217 wp.teleport_time = time + lifetime;
218 wp.health = lifetime;
219 wp.exteriormodeltoclient = ref;
227 wp.currentammo = hideable;
231 remove(own.ownfield);
233 wp.owned_by_field = ownfield;
235 wp.max_health = maxdistance;
236 wp.think = WaypointSprite_Think;
238 wp.effects = EF_NODEPTHTEST | EF_LOWPRECISION;
241 wp.SendEntity = WaypointSprite_SendEntity;
242 wp.customizeentityforclient = WaypointSprite_Customize;
243 wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player;
247 entity WaypointSprite_SpawnFixed(
254 return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE);
257 .entity waypointsprite_deployed_fixed;
258 entity WaypointSprite_DeployFixed(
264 float t, maxdistance;
270 maxdistance = waypointsprite_limitedrange;
273 return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
276 .entity waypointsprite_deployed_personal;
277 entity WaypointSprite_DeployPersonal(
282 return WaypointSprite_Spawn(spr, 0, 0, world, ofs, self, 0, self, waypointsprite_deployed_personal, FALSE);
285 .entity waypointsprite_attached;
286 .entity waypointsprite_attachedforcarrier;
287 entity WaypointSprite_Attach(
292 float t, maxdistance;
293 if(self.waypointsprite_attachedforcarrier)
294 return world; // can't attach to FC
300 maxdistance = waypointsprite_limitedrange;
303 return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
306 entity WaypointSprite_AttachCarrier(
311 WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
312 return WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
315 void WaypointSprite_DetachCarrier(entity carrier)
317 WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, waypointsprite_deadlifetime);
320 void WaypointSprite_ClearPersonal()
322 WaypointSprite_Kill(self.waypointsprite_deployed_personal);
325 void WaypointSprite_ClearOwned()
327 WaypointSprite_Kill(self.waypointsprite_deployed_fixed);
328 WaypointSprite_Kill(self.waypointsprite_deployed_personal);
329 WaypointSprite_Kill(self.waypointsprite_attached);
332 void WaypointSprite_PlayerDead()
334 WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
335 WaypointSprite_DetachCarrier(self);
338 void WaypointSprite_PlayerGone()
340 WaypointSprite_Disown(self.waypointsprite_deployed_fixed, waypointsprite_deadlifetime);
341 WaypointSprite_Kill(self.waypointsprite_deployed_personal);
342 WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
343 WaypointSprite_DetachCarrier(self);