]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/client.qc
nex also supports warpzones now
[divverent/nexuiz.git] / data / qcsrc / warpzonelib / client.qc
1 void WarpZone_Read(float isnew)
2 {
3         if not(self.enemy)
4         {
5                 self.enemy = spawn();
6                 self.enemy.classname = "warpzone_from";
7         }
8         self.classname = "trigger_warpzone";
9         self.origin_x = ReadCoord();
10         self.origin_y = ReadCoord();
11         self.origin_z = ReadCoord();
12         self.modelindex = ReadShort();
13         self.mins_x = ReadCoord();
14         self.mins_y = ReadCoord();
15         self.mins_z = ReadCoord();
16         self.maxs_x = ReadCoord();
17         self.maxs_y = ReadCoord();
18         self.maxs_z = ReadCoord();
19         self.enemy.oldorigin_x = ReadCoord();
20         self.enemy.oldorigin_y = ReadCoord();
21         self.enemy.oldorigin_z = ReadCoord();
22         self.enemy.avelocity_x = ReadCoord();
23         self.enemy.avelocity_y = ReadCoord();
24         self.enemy.avelocity_z = ReadCoord();
25         self.oldorigin_x = ReadCoord();
26         self.oldorigin_y = ReadCoord();
27         self.oldorigin_z = ReadCoord();
28         self.avelocity_x = ReadCoord();
29         self.avelocity_y = ReadCoord();
30         self.avelocity_z = ReadCoord();
31
32         self.avelocity = AnglesTransform_TurnDirectionFR(self.avelocity);
33
34         // for common code
35         self.warpzone_origin = self.enemy.oldorigin;
36         self.enemy.warpzone_origin = self.oldorigin;
37         self.warpzone_transform = AnglesTransform_Divide(self.avelocity, self.enemy.avelocity);
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         float pd;
54         entity e;
55         warpzone_saved = 0;
56         warpzone_saved_origin = warpzone_fixview_origin;
57         warpzone_saved_angles = warpzone_fixview_angles;
58
59         e = WarpZone_Find(warpzone_fixview_origin, warpzone_fixview_origin);
60         if(e)
61         {
62                 warpzone_saved = 1;
63                 warpzone_fixview_origin = WarpZone_TransformOrigin(e, warpzone_fixview_origin);
64                 warpzone_fixview_angles = WarpZone_TransformVAngles(e, warpzone_fixview_angles);
65         }
66
67         // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
68         float nearclip = 1;
69         e = WarpZone_Find(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip);
70         if(e)
71         {
72                 fixedmakevectors(e.enemy.avelocity);
73                 pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
74                 if(pd >= 0 && pd < nearclip)
75                 {
76                         warpzone_saved = 1;
77                         warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd);
78                         pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
79                 }
80         }
81
82         if(warpzone_saved)
83         {
84                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
85                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
86         }
87 }
88 void WarpZone_UnFixView()
89 {
90         if(warpzone_saved)
91         {
92                 warpzone_fixview_origin = warpzone_saved_origin;
93                 warpzone_fixview_angles = warpzone_saved_angles;
94                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
95                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
96         }
97 }