]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/client.qc
make warpzonelib depend less on Nexuiz
[divverent/nexuiz.git] / data / qcsrc / warpzonelib / client.qc
1 float FL_CAMERA = 8192;
2 .vector warpzone_transform;
3 void WarpZone_Read(float isnew)
4 {
5         if not(self.enemy)
6         {
7                 self.enemy = spawn();
8                 self.enemy.classname = "warpzone_from";
9         }
10         self.classname = "warpzone_to";
11         self.origin_x = ReadCoord();
12         self.origin_y = ReadCoord();
13         self.origin_z = ReadCoord();
14         self.modelindex = ReadShort();
15         self.mins_x = ReadCoord();
16         self.mins_y = ReadCoord();
17         self.mins_z = ReadCoord();
18         self.maxs_x = ReadCoord();
19         self.maxs_y = ReadCoord();
20         self.maxs_z = ReadCoord();
21         self.enemy.oldorigin_x = ReadCoord();
22         self.enemy.oldorigin_y = ReadCoord();
23         self.enemy.oldorigin_z = ReadCoord();
24         self.enemy.avelocity_x = ReadCoord();
25         self.enemy.avelocity_y = ReadCoord();
26         self.enemy.avelocity_z = ReadCoord();
27         self.oldorigin_x = ReadCoord();
28         self.oldorigin_y = ReadCoord();
29         self.oldorigin_z = ReadCoord();
30         self.avelocity_x = ReadCoord();
31         self.avelocity_y = ReadCoord();
32         self.avelocity_z = ReadCoord();
33
34         self.avelocity = AnglesTransform_TurnDirectionFR(self.avelocity);
35         self.warpzone_transform = AnglesTransform_Divide(self.avelocity, self.enemy.avelocity);
36
37         self.flags = FL_CAMERA;
38         self.drawmask = MASK_NORMAL;
39
40         // link me
41         //setmodel(self, self.model);
42         setorigin(self, self.origin);
43         setsize(self, self.mins, self.maxs);
44 }
45
46 float warpzone_saved;
47 vector warpzone_saved_origin;
48 vector warpzone_saved_angles;
49 void WarpZone_FixView()
50 {
51         entity e;
52         float roll;
53         warpzone_saved = 0;
54         for(e = world; (e = find(e, classname, "warpzone_to")); )
55         {
56                 //print(sprintf("does %s (%s to %s) touch %s?\n", e.model, vtos(e.absmin), vtos(e.absmax), vtos(pmove_org)));
57                 if(WarpZoneLib_BoxTouchesBrush(pmove_org, pmove_org, e, world))
58                 {
59                         warpzone_saved_origin = warpzone_fixview_origin;
60                         warpzone_saved_angles = warpzone_fixview_angles;
61                         warpzone_saved = 1;
62                         roll = warpzone_fixview_angles_z;
63                         warpzone_fixview_angles_z = 0;
64                         warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin;
65                         warpzone_fixview_angles = WarpZone_TransformVAngles(e.warpzone_transform, warpzone_fixview_angles);
66                         warpzone_fixview_angles_z = roll;
67                         R_SetView(VF_ORIGIN, warpzone_fixview_origin);
68                         R_SetView(VF_ANGLES, warpzone_fixview_angles);
69                         break;
70                 }
71         }
72 }
73 void WarpZone_UnFixView()
74 {
75         if(warpzone_saved)
76         {
77                 warpzone_fixview_origin = warpzone_saved_origin;
78                 warpzone_fixview_angles = warpzone_saved_angles;
79                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
80                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
81         }
82 }