]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/pathlib/movenode.qc
Initial checkout of Vore Tournament 0.1.alpha.
[voretournament/voretournament.git] / data / qcsrc / server / pathlib / movenode.qc
1 vector pathlib_wateroutnode(vector start,vector end)\r
2 {\r
3     vector surface;\r
4 \r
5     pathlib_movenode_goodnode = 0;\r
6 \r
7     end_x = fsnap(end_x, pathlib_gridsize);\r
8     end_y = fsnap(end_y, pathlib_gridsize);\r
9 \r
10     traceline(end + ('0 0 0.25' * pathlib_gridsize),end - ('0 0 1' * pathlib_gridsize),MOVE_WORLDONLY,self);\r
11     end = trace_endpos;\r
12 \r
13     if not(pointcontents(end - '0 0 1') == CONTENT_SOLID)\r
14         return end;\r
15 \r
16     for(surface = start ; surface_z < (end_z + 32); ++surface_z)\r
17     {\r
18         if(pointcontents(surface) == CONTENT_EMPTY)\r
19             break;\r
20     }\r
21 \r
22     if(pointcontents(surface + '0 0 1') != CONTENT_EMPTY)\r
23         return end;\r
24 \r
25     tracebox(start + '0 0 64', movenode_boxmin,movenode_boxmax, end + '0 0 64', MOVE_WORLDONLY, self);\r
26     if(trace_fraction == 1)\r
27         pathlib_movenode_goodnode = 1;\r
28 \r
29     if(fabs(surface_z - end_z) > 32)\r
30         pathlib_movenode_goodnode = 0;\r
31 \r
32     return end;\r
33 }\r
34 \r
35 vector pathlib_swimnode(vector start,vector end)\r
36 {\r
37     pathlib_movenode_goodnode = 0;\r
38 \r
39     if(pointcontents(start) != CONTENT_WATER)\r
40         return end;\r
41 \r
42     end_x = fsnap(end_x, pathlib_gridsize);\r
43     end_y = fsnap(end_y, pathlib_gridsize);\r
44 \r
45     if(pointcontents(end) == CONTENT_EMPTY)\r
46         return pathlib_wateroutnode( start, end);\r
47 \r
48     tracebox(start, movenode_boxmin,movenode_boxmax, end, MOVE_WORLDONLY, self);\r
49     if(trace_fraction == 1)\r
50         pathlib_movenode_goodnode = 1;\r
51 \r
52     return end;\r
53 }\r
54 \r
55 vector pathlib_flynode(vector start,vector end)\r
56 {\r
57     pathlib_movenode_goodnode = 0;\r
58 \r
59     end_x = fsnap(end_x, pathlib_gridsize);\r
60     end_y = fsnap(end_y, pathlib_gridsize);\r
61 \r
62     tracebox(start, movenode_boxmin,movenode_boxmax, end, MOVE_WORLDONLY, self);\r
63     if(trace_fraction == 1)\r
64         pathlib_movenode_goodnode = 1;\r
65 \r
66     return end;\r
67 }\r
68 \r
69 vector pathlib_walknode(vector start,vector end,float doedge)\r
70 {\r
71     vector direction,point,last_point,s,e;\r
72     float steps, distance, i;\r
73 \r
74     pathlib_movenode_goodnode = 0;\r
75 \r
76     end_x = fsnap(end_x,pathlib_gridsize);\r
77     end_y = fsnap(end_y,pathlib_gridsize);\r
78     start_x = fsnap(start_x,pathlib_gridsize);\r
79     start_y = fsnap(start_y,pathlib_gridsize);\r
80 \r
81     // Find the floor\r
82     traceline(start + movenode_stepup, start - movenode_maxdrop,MOVE_WORLDONLY,self);\r
83     if(trace_fraction == 1.0)\r
84         return trace_endpos;\r
85 \r
86     start = trace_endpos;\r
87 \r
88     // Find the direcion, without Z\r
89     s   = start; e   = end;\r
90     //e_z = 0; s_z = 0;\r
91     direction = normalize(e - s);\r
92 \r
93     distance  = vlen(start - end);\r
94     steps     = rint(distance / movenode_stepsize);\r
95 \r
96     last_point = start;\r
97     for(i = 1; i < steps; ++i)\r
98     {\r
99         point = last_point + (direction * movenode_stepsize);\r
100         traceline(point + movenode_stepup,point - movenode_maxdrop,MOVE_WORLDONLY,self);\r
101         if(trace_fraction == 1.0)\r
102             return trace_endpos;\r
103 \r
104         last_point = trace_endpos;\r
105     }\r
106 \r
107     point = last_point + (direction * movenode_stepsize);\r
108     point_x = fsnap(point_x,pathlib_gridsize);\r
109     point_y = fsnap(point_y,pathlib_gridsize);\r
110 \r
111     //dprint("end_x:  ",ftos(end_x),  "  end_y:  ",ftos(end_y),"\n");\r
112     //dprint("point_x:",ftos(point_x),"  point_y:",ftos(point_y),"\n\n");\r
113 \r
114     traceline(point + movenode_stepup, point - movenode_maxdrop,MOVE_WORLDONLY,self);\r
115     if(trace_fraction == 1.0)\r
116         return trace_endpos;\r
117 \r
118     last_point = trace_endpos;\r
119 \r
120     tracebox(start + movenode_boxup, movenode_boxmin,movenode_boxmax, last_point + movenode_boxup, MOVE_WORLDONLY, self);\r
121     if(trace_fraction != 1.0)\r
122         return trace_endpos;\r
123 \r
124     pathlib_movenode_goodnode = 1;\r
125     return last_point;\r
126 }\r