]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/client.qc
MinstaNex now can shoot through warpzones... using warpzone-aware tracebox and trailp...
[divverent/nexuiz.git] / data / qcsrc / warpzonelib / client.qc
1 .vector warpzone_transform;
2 void WarpZone_Read(float isnew)
3 {
4         if not(self.enemy)
5         {
6                 self.enemy = spawn();
7                 self.enemy.classname = "warpzone_from";
8         }
9         self.classname = "trigger_warpzone";
10         self.origin_x = ReadCoord();
11         self.origin_y = ReadCoord();
12         self.origin_z = ReadCoord();
13         self.modelindex = ReadShort();
14         self.mins_x = ReadCoord();
15         self.mins_y = ReadCoord();
16         self.mins_z = ReadCoord();
17         self.maxs_x = ReadCoord();
18         self.maxs_y = ReadCoord();
19         self.maxs_z = ReadCoord();
20         self.enemy.oldorigin_x = ReadCoord();
21         self.enemy.oldorigin_y = ReadCoord();
22         self.enemy.oldorigin_z = ReadCoord();
23         self.enemy.avelocity_x = ReadCoord();
24         self.enemy.avelocity_y = ReadCoord();
25         self.enemy.avelocity_z = ReadCoord();
26         self.oldorigin_x = ReadCoord();
27         self.oldorigin_y = ReadCoord();
28         self.oldorigin_z = ReadCoord();
29         self.avelocity_x = ReadCoord();
30         self.avelocity_y = ReadCoord();
31         self.avelocity_z = ReadCoord();
32
33         self.avelocity = AnglesTransform_TurnDirectionFR(self.avelocity);
34         self.warpzone_transform = AnglesTransform_Divide(self.avelocity, self.enemy.avelocity);
35
36         self.flags = FL_CAMERA;
37         self.drawmask = MASK_NORMAL;
38
39         // link me
40         //setmodel(self, self.model);
41         setorigin(self, self.origin);
42         setsize(self, self.mins, self.maxs);
43 }
44
45 float warpzone_saved;
46 vector warpzone_saved_origin;
47 vector warpzone_saved_angles;
48 void WarpZone_FixView()
49 {
50         float pd;
51         entity e;
52         warpzone_saved = 0;
53         warpzone_saved_origin = warpzone_fixview_origin;
54         warpzone_saved_angles = warpzone_fixview_angles;
55
56         e = WarpZone_Find(warpzone_fixview_origin, warpzone_fixview_origin);
57         if(e)
58         {
59                 warpzone_saved = 1;
60                 warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin;
61                 warpzone_fixview_angles = WarpZone_TransformVAngles(e.warpzone_transform, warpzone_fixview_angles);
62                 break;
63         }
64
65         // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
66         float nearclip = 1;
67         e = WarpZone_Find(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip);
68         if(e)
69         {
70                 fixedmakevectors(e.enemy.avelocity);
71                 pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
72                 if(pd >= 0 && pd < nearclip)
73                 {
74                         warpzone_saved = 1;
75                         warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd);
76                         pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward;
77                 }
78         }
79
80         if(warpzone_saved)
81         {
82                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
83                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
84         }
85 }
86 void WarpZone_UnFixView()
87 {
88         if(warpzone_saved)
89         {
90                 warpzone_fixview_origin = warpzone_saved_origin;
91                 warpzone_fixview_angles = warpzone_saved_angles;
92                 R_SetView(VF_ORIGIN, warpzone_fixview_origin);
93                 R_SetView(VF_ANGLES, warpzone_fixview_angles);
94         }
95 }