]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/client.qc
warpzonelib - the beginning
[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         print(vtos(AnglesTransform_Apply(self.warpzone_transform, '0 0 1')), "\n");
38
39         self.flags = FL_CAMERA;
40         self.drawmask = MASK_NORMAL;
41
42         // link me
43         //setmodel(self, self.model);
44         setorigin(self, self.origin);
45         setsize(self, self.mins, self.maxs);
46 }
47
48 float warpzone_saved;
49 vector warpzone_saved_origin;
50 vector warpzone_saved_angles;
51 void WarpZone_FixView()
52 {
53         entity e;
54         float roll;
55         warpzone_saved = 0;
56         for(e = world; (e = find(e, classname, "warpzone_to")); )
57         {
58                 //print(sprintf("does %s (%s to %s) touch %s?\n", e.model, vtos(e.absmin), vtos(e.absmax), vtos(pmove_org)));
59                 if(BoxTouchesBrush(pmove_org, pmove_org, e, world))
60                 {
61                         warpzone_saved_origin = warpzone_fixview_origin;
62                         warpzone_saved_angles = warpzone_fixview_angles;
63                         warpzone_saved = 1;
64                         roll = warpzone_fixview_angles_z;
65                         warpzone_fixview_angles_z = 0;
66                         warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin;
67                         warpzone_fixview_angles = AnglesTransform_Normalize(AnglesTransform_ApplyToVAngles(e.warpzone_transform, warpzone_fixview_angles), TRUE);
68                         warpzone_fixview_angles_z = roll;
69                         R_SetView(VF_ORIGIN, warpzone_fixview_origin);
70                         R_SetView(VF_ANGLES, warpzone_fixview_angles);
71                         break;
72                 }
73         }
74 }
75 void WarpZone_UnFixView()
76 {
77         if(warpzone_saved)
78         {
79                 warpzone_fixview_origin = warpzone_saved_origin;
80                 warpzone_fixview_angles = warpzone_saved_angles;
81                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
82                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
83         }
84 }