]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/vehicles/racer.qc
vehicles server & client code, disabled by default. see vehicles/vehicles.qh
[divverent/nexuiz.git] / data / qcsrc / server / vehicles / racer.qc
1 #define RACER_MIN '-40 -40 0'\r
2 #define RACER_MAX '40 40 44'\r
3 \r
4 void racer_exit(float eject);\r
5 void racer_enter();\r
6 \r
7 float  jetfromtag_power;
8 float  jetfromtag_normpower;
9 float  jetfromtag_nosolid;\r
10 vector jetfromtag_origin;
11 \r
12 vector jetfromtag(string tagname,float jet_length,float air_power,float solid_power)\r
13 {\r
14     vector force_dir;
15     float  air_frac, solid_frac, air_pwr, solid_pwr;\r
16 \r
17     jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
18     v_forward = normalize(v_forward);
19     //dprint("dd:",vtos(v_forward)," - ",vtos(force_dir),"\n");
20 \r
21     force_dir = jetfromtag_origin - v_forward * jet_length;\r
22     traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);\r
23     //te_lightning1(world,jetfromtag_origin,force_dir);
24 \r
25     solid_frac = 1 - trace_fraction;\r
26     air_frac   = trace_fraction;
27
28     if(solid_frac < 0.1)
29         jetfromtag_nosolid += 1;
30
31     //if(solid_frac < 0.5)
32         //solid_frac = solid_frac * solid_frac;
33         //solid_frac = solid_frac * 1.5;
34
35     solid_pwr = solid_frac * solid_power;
36     air_pwr   = air_frac * air_power;
37
38     //float pmax;\r
39     //pmax = air_power+solid_power;\r
40     //pmax = min(pmax,max(self.velocity_z * cvar("g_vehicle_racer_powerfac"),800));\r
41     //jetfromtag_power     = min(solid_pwr + air_pwr,max(self.velocity_z * cvar("g_vehicle_racer_powerfac"),800));\r
42     jetfromtag_power     = solid_pwr + air_pwr;
43     jetfromtag_normpower = jetfromtag_power / (air_power+solid_power);
44     if(trace_fraction == 1)
45         return v_forward;\r
46     else\r
47         return v_forward * (jetfromtag_power + cvar("g_vehicle_racer_power_min"));\r
48 \r
49     // - (v_forward * cvar("g_vehicle_racer_springk"));
50 }\r
51 \r
52 /*\r
53 vector jetfromtag2(string tagname,float jet_length,float air_power,float solid_power)\r
54 {\r
55     vector force_dir;
56     float  solid_frac, solid_pwr;\r
57 \r
58     jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
59     v_forward = normalize(v_forward);
60 \r
61     force_dir = jetfromtag_origin - v_forward * jet_length;\r
62     traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);\r
63 \r
64     if(trace_fraction == 1)\r
65     {\r
66         jetfromtag_power     = 0;\r
67         jetfromtag_normpower = 0;\r
68         return v_forward * 0.1;\r
69     }\r
70 \r
71     float pwr_up,pwr_down;\r
72 \r
73     pwr_up = (1 - trace_fraction);\r
74     pwr_down = (trace_fraction * -1);\r
75 \r
76     jetfromtag_power = pwr_up + pwr_down;\r
77     jetfromtag_normpower = jetfromtag_power / solid_power;\r
78     return v_forward * jetfromtag_power;\r
79 \r
80 \r
81
82 }\r
83 */\r
84 \r
85 void racer_align4point(float spring_length,float spring_up,float blendrate)\r
86 {\r
87     vector fl_org,fl_force,fr_org,fr_force,bl_org,bl_force,br_org,br_force;
88     vector push_vector,align;\r
89     //vector c1,c2;\r
90     float fl_push, fr_push, bl_push, br_push;\r
91
92     jetfromtag_nosolid = 0;\r
93
94     fr_force = jetfromtag("tag_engine_fr",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));\r
95     fr_org   = jetfromtag_origin; fr_push = jetfromtag_normpower;
96 \r
97     fl_force = jetfromtag("tag_engine_fl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
98     fl_org   = jetfromtag_origin; fl_push = jetfromtag_normpower;
99
100     br_force = jetfromtag("tag_engine_br",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
101     br_org   = jetfromtag_origin; br_push = jetfromtag_normpower;
102 \r
103     bl_force = jetfromtag("tag_engine_bl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
104     bl_org   = jetfromtag_origin; bl_push = jetfromtag_normpower;
105
106     push_vector = fr_force + fl_force + br_force + bl_force;
107     //c1 = (fr_org + fl_org + br_org + bl_org) - (self.origin *4);
108
109     /*\r
110     vector vtmp;
111     vtmp =  normalize((fr_org + fr_force) - self.origin);
112     vtmp += normalize((br_org + br_force) - self.origin);
113     vtmp += normalize((fl_org + fl_force) - self.origin);
114     vtmp += normalize((bl_org + bl_force) - self.origin);
115     //vtmp = vtmp * 0.25;
116     */
117     //dprint("a1:",vtos(vtmp)," a2",vtos(vtmp - self.angles),"\n");
118     align = align;\r
119 \r
120     align_x = (fl_push - bl_push);
121     align_x += (fr_push - br_push);
122     align_x *= 360;
123 \r
124     align_z = (fl_push - fr_push);
125     align_z += (bl_push - br_push);
126     align_z *= 360;
127
128     self.angles_x *= 0.96;
129     self.angles_z *= 0.96;
130
131     self.angles_x += align_x * frametime;
132     self.angles_z += align_z * frametime;
133     //c1 = normalize(self.velocity);
134     //c2 = normalize(push_vector - self.velocity);
135    // dprint("VR: ",vtos(c2),"\n");
136     //if(c2_z == -1)
137     //    push_vector_z *= 5;
138
139     self.velocity =  self.velocity + (push_vector * frametime);
140     self.velocity_z -= sv_gravity * frametime;\r
141 }\r
142 \r
143 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
144 {\r
145     self.velocity += force;\r
146 }\r
147 \r
148 float racer_pplug()\r
149 {\r
150     entity player,racer;\r
151     float ftmp,ftmp2;\r
152 \r
153 \r
154     player = self;\r
155     racer = self.vehicle;\r
156     player.fixangle = FALSE;\r
157 \r
158     player.BUTTON_ZOOM = 0;\r
159     player.BUTTON_CROUCH = 0;\r
160 \r
161     self = racer;\r
162 \r
163     if(player.BUTTON_USE)\r
164     {\r
165         self = racer;\r
166         racer_exit(0);\r
167         self = player;\r
168         return 0;\r
169     }\r
170 \r
171     racer.angles_x *= -1;\r
172     makevectors(racer.angles);\r
173     racer.angles_x *= -1;\r
174 \r
175     // Turn Body\r
176     ftmp = cvar("g_vehicle_racer_turnspeed") / server_fps;\r
177     ftmp2 = ftmp * -1;\r
178 \r
179     ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);\r
180 \r
181     //if(racer.flags & FL_ONGROUND)\r
182     {\r
183         racer.angles_y = safeangle(racer.angles_y + ftmp);\r
184         //player.angles = racer.angles;\r
185         if(player.BUTTON_JUMP)\r
186         {\r
187             player.BUTTON_JUMP = 0;\r
188             racer.velocity  = racer.velocity  + v_forward * 250 + v_up * 600;\r
189         }\r
190         else\r
191         {\r
192             if(vlen(player.movement) == 0)\r
193             {\r
194                 self = racer;\r
195                 //movelib_beak_simple(cvar("g_vehicle_racer_speed_stop"));\r
196                 ftmp = self.velocity_z;\r
197                 self.velocity = self.velocity - self.velocity * cvar("g_vehicle_racer_speed_stop");\r
198                 self.velocity_z = ftmp;\r
199             }\r
200             else\r
201             {\r
202 \r
203                 if(player.movement_x != 0)\r
204                 {\r
205                     if(player.movement_x > 0)\r
206                     {\r
207                         player.movement_x = 1;\r
208                     }\r
209                     else if(player.movement_x < 0)\r
210                     {\r
211                         player.movement_x = -1;\r
212                     }\r
213                 }\r
214 \r
215                 if(player.movement_y != 0)\r
216                 {\r
217                     if(player.movement_y < 0)\r
218                     {\r
219                         player.movement_y = -1;\r
220                     }\r
221                     else if(player.movement_y > 0)\r
222                     {\r
223                         player.movement_y = 1;\r
224                     }\r
225                 }\r
226 \r
227                 self = racer;\r
228                 self.velocity  = self.velocity + ((v_right * player.movement_y) * cvar("g_vehicle_racer_speed_strafe")) * frametime;\r
229                 self.velocity  = self.velocity + ((v_forward * player.movement_x) * cvar("g_vehicle_racer_speed_forward")) * frametime;\r
230             }\r
231         }\r
232         self = racer;\r
233     }
234 \r
235     vector df;
236     df = vlen(self.velocity) * cvar("g_vehicle_racer_downforce") * v_up;
237     //te_lightning1(self,self.origin,self.origin - df);
238     self.velocity = self.velocity - df;
239 \r
240     player.movement = racer.velocity;\r
241     self = racer;\r
242     racer_align4point(cvar("g_vehicle_racer_springlength"),100,cvar("g_vehicle_racer_inert"));\r
243 \r
244     if(cvar("g_vehicle_racer_drag"))\r
245         self.velocity  = movelib_dragvec(cvar("g_vehicle_racer_drag"),cvar("g_vehicle_racer_dragexp"));
246
247
248
249     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;\r
250     self = player;\r
251     setorigin(player,racer.origin);\r
252     player.velocity = racer.velocity;\r
253 \r
254     //player.v_angle = racer.angles;\r
255     //player.v_angle_x *= -1;
256 \r
257     /*
258     msg_entity = player;\r
259     player.angles = racer.angles;\r
260     //player.fixangle = TRUE;\r
261     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES\r
262     //WriteAngle(MSG_ONE, player.v_angle_x - (racer.angles_x * -1));    // tilt\r
263     WriteAngle(MSG_ONE, racer.angles_x * -1);    // tilt\r
264     WriteAngle(MSG_ONE, player.v_angle_y);    // yaw\r
265     WriteAngle(MSG_ONE, (racer.angles_z + player.v_angle_z) * 0.5);    // flip\r
266     */\r
267 \r
268     return 1;\r
269 }\r
270 \r
271 void racer_think()\r
272 {\r
273     //if(self.flags & FL_ONGROUND)\r
274     //{\r
275         movelib_beak_simple(cvar("g_vehicle_racer_speed_stop"));\r
276         //racer_align4point(300,100);\r
277     //}\r
278     self.nextthink = time;\r
279 }\r
280 \r
281 void racer_enter()\r
282 {\r
283     self.owner = other;\r
284     self.owner.angles = self.angles;\r
285 \r
286     //setattachment(other,self,"");\r
287     self.nextthink = 0;\r
288     self.think = SUB_Null;\r
289     self.owner.takedamage     = DAMAGE_NO;\r
290     self.owner.solid          = SOLID_NOT;\r
291     self.owner.movetype       = MOVETYPE_NOCLIP;\r
292     //setsize(self.owner,spiderbot_MIN,spiderbot_MAX);\r
293     self.owner.alpha          = -1;\r
294     self.owner.PlayerPhysplug = racer_pplug;\r
295     self.owner.vehicle        = self;\r
296     self.owner.event_damage   = SUB_Null;\r
297     //self.event_damage         = vehicle_stdproc_damage ;\r
298     //self.colormap             = self.owner.colormap;\r
299     //self.tur_head.colormap    = self.owner.colormap;\r
300     //self.vehicle_hudmodel.viewmodelforclient = self.owner;\r
301     //self.owner.hud            = HUD_SPIDEBOT;\r
302     //self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));\r
303     //self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));\r
304 \r
305     //setorigin(self.owner,self.origin);\r
306     //setattachment(self.owner,self,"");\r
307     //setorigin(self.owner,'0 0 0');\r
308 \r
309     msg_entity = other;\r
310     WriteByte (MSG_ONE, SVC_SETVIEWPORT);\r
311     WriteEntity( MSG_ONE, self.vehicle_viewport);\r
312 \r
313     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES\r
314     WriteAngle(MSG_ONE,  self.angles_x);    // tilt\r
315     WriteAngle(MSG_ONE,  self.angles_y);    // yaw\r
316     WriteAngle(MSG_ONE,  self.angles_z);    // flip\r
317 \r
318     //self.owner.view_ofs = '0 0 0';\r
319     //self.tur_head.nodrawtoclient = self.owner;\r
320 }\r
321 \r
322 void racer_exit(float eject)\r
323 {\r
324     self.velocity = '0 0 0';\r
325 \r
326     msg_entity = self.owner;\r
327     WriteByte (MSG_ONE, SVC_SETVIEWPORT);\r
328     WriteEntity( MSG_ONE, self.owner);\r
329 \r
330     //setattachment(self.owner,world,"");\r
331     self.think = racer_think;\r
332     self.nextthink = time;\r
333 \r
334     self.owner.takedamage     = DAMAGE_AIM;\r
335     self.owner.solid          = SOLID_SLIDEBOX;\r
336     self.owner.movetype       = MOVETYPE_WALK;\r
337 \r
338     setsize(self.owner,PL_MIN,PL_MAX);\r
339 \r
340     self.owner.alpha          = 1;\r
341     self.owner.PlayerPhysplug = SUB_Null;\r
342     self.owner.vehicle        = world;\r
343         self.owner.view_ofs       = PL_VIEW_OFS;\r
344         //self.owner.hud            = HUD_NORMAL;\r
345         self.owner.event_damage   = PlayerDamage;\r
346 \r
347         //self.colormap            = 1024;\r
348         //self.tur_head.colormap = 1024;\r
349 \r
350         //self.vehicle_hudmodel.viewmodelforclient = self;\r
351         //self.tur_head.nodrawtoclient             = self;\r
352 \r
353     setattachment(self.owner,world,"");\r
354 \r
355         if(eject)\r
356         {\r
357             makevectors(self.angles);\r
358             setorigin(self.owner,self.origin + v_forward * 100);\r
359             self.owner.velocity = (v_up + v_forward * 0.25) * 750;\r
360         }\r
361         else\r
362         setorigin(self.owner,self.origin - v_forward * 200);\r
363 \r
364     self.owner = world;\r
365 }\r
366 \r
367 \r
368 void racer_touch()\r
369 {\r
370     if(self.owner)\r
371     {\r
372         if(vlen(self.velocity) == 0)\r
373             return;\r
374 \r
375         if(other.classname != "player")\r
376             return;\r
377 \r
378         vector a;\r
379         a = normalize(other.origin - self.origin);\r
380         a = a - normalize(self.velocity);\r
381         //dprint("a:",vtos(a),"\n");\r
382 \r
383         return;\r
384     }\r
385 \r
386     if(other.classname != "player")\r
387         return;\r
388 \r
389     if(other.deadflag != DEAD_NO)\r
390         return;\r
391 \r
392     if(other.vehicle != world)\r
393         return;\r
394 \r
395     racer_enter();\r
396 }\r
397 \r
398 /*\r
399 float spiderbot_customizeentityforclient()\r
400 {\r
401     if(self.deadflag == DEAD_DEAD)\r
402         return FALSE;\r
403     if(self.owner == other)\r
404         self.tur_head.alpha = -1;\r
405     else\r
406         self.tur_head.alpha = 1;\r
407     return TRUE;\r
408 }\r
409 */\r
410 \r
411 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);\r
412 void racer_spawn()\r
413 {\r
414     self.think = racer_think;\r
415     self.nextthink = time;\r
416 \r
417     //self.vehicle_health = CCVAR("_health");\r
418     //self.vehicle_shield = CCVAR("_shield");\r
419     //self.event_damage = vehicle_stdproc_damage;\r
420     //self.event_damage = spiderbot_damage;\r
421     //self.iscreature = TRUE;\r
422     self.scale = 0.5;\r
423     self.movetype   = MOVETYPE_FLY;\r
424     self.solid      = SOLID_SLIDEBOX;\r
425     //self.takedamage = DAMAGE_AIM;\r
426     self.touch      = racer_touch;\r
427     //self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;\r
428     self.alpha = 1;\r
429     //self.tur_head.angles = '0 0 0';\r
430         //self.colormap = 1024;\r
431         //self.tur_head.colormap = 1024;\r
432         self.deadflag    = DEAD_NO;\r
433     self.bot_attack = TRUE;\r
434     setorigin(self,self.origin + '0 0 128');\r
435     setsize(self,RACER_MIN*0.5,RACER_MAX*0.5);\r
436     setorigin(self,self.tur_aimpos);\r
437     pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);\r
438 }\r
439 \r
440 void racer_blowup()\r
441 {\r
442     /*\r
443     sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);\r
444     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);\r
445 \r
446     //RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
447     RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);\r
448 \r
449     self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;\r
450     self.nextthink  = time + 10;\r
451     self.think      = spiderbot_spawn;\r
452 \r
453     setorigin(self,self.tur_aimpos);\r
454     */\r
455 }\r
456 \r
457 void racer_die()\r
458 {\r
459 \r
460     /*\r
461     self.health = 0;\r
462     self.event_damage = SUB_Null;\r
463     self.iscreature = FALSE;\r
464     self.solid      = SOLID_NOT;\r
465     self.takedamage = DAMAGE_NO;\r
466     self.touch      = SUB_Null;\r
467     self.nextthink  = time + random() * 2;\r
468     self.think      = spiderbot_blowup;\r
469     self.deadflag    = DEAD_DEAD;\r
470         self.vehicle_hudmodel.viewmodelforclient = self;\r
471         self.frame = 0;\r
472         self.tur_head.frame = 0;\r
473         */\r
474 }\r
475 \r
476 void racer_dinit()\r
477 {\r
478 \r
479     server_fps = (1 / sys_ticrate);\r
480 \r
481     /*\r
482     addstat(STAT_HUD, AS_INT,  hud);\r
483         addstat(STAT_SPIDERBOT_ROCKETS, AS_INT,   rockets);\r
484         addstat(STAT_SPIDERBOT_RELOAD,  AS_FLOAT, rockets_reload);\r
485         addstat(STAT_SPIDERBOT_HEAT,    AS_FLOAT, vehicle_heat);\r
486         addstat(STAT_SPIDERBOT_HEALTH,  AS_FLOAT, vehicle_health);\r
487         addstat(STAT_SPIDERBOT_SHIELD,  AS_FLOAT, vehicle_shield);\r
488         */\r
489 \r
490     if (self.netname == "")      self.netname     = "Race PoD";\r
491 \r
492     self.vehicle_viewport = spawn();\r
493     self.event_damage = racer_damage;\r
494     //self.gravity = 2;\r
495     //self.vehicle_hudmodel = spawn();\r
496     //self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;\r
497     //self.cvar_basename = "g_vehicle_spiderbot";\r
498 \r
499     setmodel (self.vehicle_viewport, "models/null.md3");\r
500     setmodel(self,"models/racers/waka.dpm");\r
501 \r
502     setattachment(self.vehicle_viewport,self,"");\r
503     //self.tur_head.customizeentityforclient = spiderbot_customizeentityforclient;\r
504 \r
505     setorigin(self.vehicle_viewport,'-400 0 40  ');\r
506     self.tur_aimpos = self.origin;\r
507     racer_spawn();\r
508 \r
509     //self.vehicle_die = spiderbot_die;\r
510     //self.vehicle_exit = spiderbot_exit;\r
511 }\r
512 \r
513 void spawnfunc_racer()\r
514 {\r
515     g_turrets_common_precash();\r
516 \r
517     precache_model ( "models/racers/waka.dpm");\r
518 \r
519     self.think = racer_dinit;\r
520     self.nextthink = time + 0.5;\r
521 }\r
522 /*\r
523 onClipEvent (load) {\r
524         // inertia relates to the quantity of energy that\r
525         // the spring will carry\r
526         // inertia = 1 would mean that the spring doesn't\r
527         // loose any energy, and that it will oscillate\r
528         // forever\r
529         inertia = 0.9 ;\r
530 \r
531         // k relates to the spring, and how "hard" it will be.\r
532         // The higher k the faster the mass will come back.\r
533         k = 0.1 ;\r
534 }\r
535 \r
536 onClipEvent (enterFrame) {\r
537 \r
538         // We calculate the distance to the mouse\r
539         x = -this._x + _root._xmouse ;\r
540         y = -this._y + _root._ymouse ;\r
541 \r
542         //We calculate the amount by which the mass will to move\r
543         xp = xp * inertia + x*k ;\r
544         yp = yp * inertia + y*k ;\r
545 \r
546         //We move it\r
547         _x += xp ;\r
548         _y += yp ;\r
549 }\r
550 */\r
551 \r
552 /*\r
553 .float inertia;\r
554 .float k;\r
555 .float mass;\r
556 .entity springtarget;\r
557 //.float dt;\r
558 void func_spring_think()\r
559 {\r
560 \r
561     float deltatime;\r
562     deltatime = time - other.lastpushtime;\r
563     if (pushdeltatime > 0.15) pushdeltatime = 0;\r
564     other.lastpushtime = time;\r
565     if(!pushdeltatime) return;\r
566 \r
567 \r
568     vector dist;\r
569     //vector move;\r
570     dist = (self.springtarget.origin *-1) + self.origin;\r
571     dist = '-1 -1 -1' * vlen(self.springtarget.origin - self.origin);\r
572     self.springtarget.velocity_x *= self.inertia + dist_x * self.k;\r
573     self.springtarget.velocity_y *= self.inertia + dist_y * self.k;\r
574     self.springtarget.velocity_z *= self.inertia + dist_z * self.k;\r
575 \r
576     self.nextthink = time;\r
577 }\r
578 \r
579 void func_spring_init()\r
580 {\r
581     self.springtarget = find(world, targetname, self.target);\r
582     if(!self.springtarget)\r
583     {\r
584         objerror("func_spring cant find its .target!\n");\r
585         remove(self);\r
586         return;\r
587     }\r
588     self.think = func_spring_think;\r
589     self.nextthink = time;\r
590 }\r
591 \r
592 void springtarget_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
593 {\r
594     dprint("Smack!\n");\r
595     self.velocity = self.velocity +force;\r
596 }\r
597 \r
598 void spawnfunc_func_springtarget()\r
599 {\r
600         self.mdl = self.model;\r
601         setmodel(self, self.mdl);\r
602 \r
603         self.effects |= EF_LOWPRECISION;\r
604         setsize (self, self.mins , self.maxs);\r
605     self.movetype = MOVETYPE_BOUNCE;\r
606     setorigin(self,self.origin);\r
607     self.solid = SOLID_BSP;\r
608     self.takedamage = DAMAGE_YES;\r
609     self.event_damage = springtarget_damage;\r
610     dprint("spawnfunc_func_springtarget!\n");\r
611 }\r
612 \r
613 void spawnfunc_func_spring()\r
614 {\r
615     if(self.target == "")\r
616     {\r
617         objerror("func_spring w/o target!\n");\r
618         //remove(self);\r
619         return;\r
620     }\r
621 \r
622     if(!self.inertia)\r
623         self.inertia = 0.9;\r
624 \r
625     if(!self.k)\r
626         self.k = 0.1;\r
627 \r
628     if(!self.mass)\r
629         self.mass = 1;\r
630 \r
631         self.mdl = self.model;\r
632         setmodel(self, self.mdl);\r
633 \r
634         self.effects |= EF_LOWPRECISION;\r
635         setsize (self, self.mins , self.maxs);\r
636         self.movetype = MOVETYPE_FLY;\r
637         self.think = func_spring_init;\r
638         self.nextthink = time +1;\r
639         dprint("spawnfunc_func_spring!\n");\r
640 \r
641 }\r
642 */\r