]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/client.qc
more warpzone fixes - now angled warpzones work too
[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         float pd;
52         entity e;
53         warpzone_saved = 0;
54         warpzone_saved_origin = warpzone_fixview_origin;
55         warpzone_saved_angles = warpzone_fixview_angles;
56
57         for(e = world; (e = find(e, classname, "warpzone_to")); )
58         {
59                 if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin, warpzone_fixview_origin, e, world))
60                 {
61                         warpzone_saved = 1;
62                         warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin;
63                         warpzone_fixview_angles = WarpZone_TransformVAngles(e.warpzone_transform, warpzone_fixview_angles);
64                         break;
65                 }
66         }
67
68         // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
69         float nearclip = 2;
70         for(e = world; (e = find(e, classname, "warpzone_to")); )
71         {
72                 if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip, e, world))
73                 {
74                         fixedmakevectors(e.enemy.avelocity);
75                         pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
76                         if(pd >= 0 && pd < nearclip)
77                         {
78                                 warpzone_saved = 1;
79                                 warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd);
80                                 pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
81                         }
82                 }
83         }
84
85         if(warpzone_saved)
86         {
87                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
88                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
89         }
90 }
91 void WarpZone_UnFixView()
92 {
93         if(warpzone_saved)
94         {
95                 warpzone_fixview_origin = warpzone_saved_origin;
96                 warpzone_fixview_angles = warpzone_saved_angles;
97                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
98                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
99         }
100 }