AMXX-BG.INFO minigames_spawns.inc Raw include

minigames_spawns.inc

Original include source with line numbers.

Back Download .inc
1 #if defined _superspawns_included
2 #endinput
3 #endif
4 #define _superspawns_included
5
6 #include <amxmodx>
7 #include <amxmisc>
8 #include <fakemeta>
9 #include <engine>
10 #include <cellarray>
11 #include <xs>
12
13 #define SS_VERSION "1.0"
14 #define SS_MIN_DISTANCE 500.0
15 #define SS_MAX_LOOPS 100000
16
17 new Array:g_vecSsOrigins
18 new Array:g_vecSsSpawns
19 new g_iSsTime
20
21 new const g_szStarts[][] = { "info_player_start", "info_player_deathmatch" }
22 new const Float:g_flOffsets[] = { 3500.0, 3500.0, 1500.0 }
23
24 public SsInit(Float:mindist)
25 {
26 new cmd[32]
27 format(cmd, 15, "_ss_dump%c%c%c%c", random_num('A', 'Z'), random_num('A', 'Z'), random_num('A', 'Z'), random_num('A', 'Z'))
28 register_cvar("sv_superspawns", SS_VERSION, (FCVAR_SERVER|FCVAR_SPONLY))
29 register_concmd(cmd, "SsDump")
30
31 g_vecSsOrigins = ArrayCreate(3, 1)
32 g_vecSsSpawns = ArrayCreate(3, 1)
33 }
34
35 stock SsClean()
36 {
37 g_flSsMinDist = 0.0
38 ArrayClear(g_vecSsOrigins)
39 ArrayClear(g_vecSsSpawns)
40 ArrayClear(g_vecSsUsed)
41 }
42
43 new g_intLastorigin;
44 stock SsGetOrigin(Float:origin[3])
45 {
46 new intFails, intRandomnum, intSize = ArraySize(g_vecSsOrigins);
47
48 gotoFindRandomOrigin:
49
50 intRandomnum = random(intSize);
51 if(g_intLastorigin == intRandomnum)
52 {
53 intFails++
54
55 if(intFails > 5)
56 return false;
57
58 goto gotoFindRandomOrigin;
59 }
60
61 g_intLastorigin = intRandomnum;
62
63 ArrayGetArray(g_vecSsOrigins, g_intLastorigin, origin)
64 return true;
65 }
66
67 public SsDump()
68 {
69 new Float:origin[3]
70 new count = ArraySize(g_vecSsOrigins)
71 server_print("-------------------------------------------------------")
72 for(new i = 0; i < count; i++)
73 {
74 ArrayGetArray(g_vecSsOrigins, i, origin)
75 server_print("Origin: %f %f %f", origin[0], origin[1], origin[2])
76 }
77 server_print("-------------------------------------------------------")
78 server_print("Number of origins: %i", count)
79 server_print("Time: %i", g_iSsTime)
80 server_print("-------------------------------------------------------")
81 }
82
83 public SsScan()
84 {
85 new start, Float:origin[3], starttime
86 starttime = get_systime()
87 for(start = 0; start < sizeof(g_szStarts); start++)
88 {
89 server_print("Searching for %s", g_szStarts[start])
90 new ent
91 if((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", g_szStarts[start])))
92 {
93 new counter
94 pev(ent, pev_origin, origin)
95 ArrayPushArray(g_vecSsSpawns, origin)
96 while(counter < SS_MAX_LOOPS)
97 {
98 counter = GetLocation(origin, counter)
99 }
100 }
101 }
102 g_iSsTime = get_systime()
103 g_iSsTime -= starttime
104 }
105
106 GetLocation(Float:start[3], &counter)
107 {
108 new Float:end[3]
109 for(new i = 0; i < 3; i++)
110 {
111 end[i] += random_float(0.0 - g_flOffsets[i], g_flOffsets[i])
112 }
113
114 if(IsValid(start, end))
115 {
116 start[0] = end[0]
117 start[1] = end[1]
118 start[2] = end[2]
119 ArrayPushArray(g_vecSsOrigins, end)
120 }
121 counter++
122 return counter
123 }
124
125 IsValid(Float:start[3], Float:end[3])
126 {
127 SetFloor(end)
128 end[2] += 36.0
129 new point = engfunc(EngFunc_PointContents, end)
130 if(point == CONTENTS_EMPTY)
131 {
132 if(CheckPoints(end) && CheckDistance(end) && CheckVisibility(start, end))
133 {
134 if(!trace_hull(end, HULL_LARGE, -1))
135 {
136 return true
137 }
138 }
139 }
140 return false
141 }
142
143 CheckVisibility(Float:start[3], Float:end[3])
144 {
145 new tr
146 engfunc(EngFunc_TraceLine, start, end, IGNORE_GLASS, -1, tr)
147 return (get_tr2(tr, TR_pHit) < 0)
148 }
149
150 SetFloor(Float:start[3])
151 {
152 new tr, Float:end[3]
153 end[0] = start[0]
154 end[1] = start[1]
155 end[2] = -99999.9
156 engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr)
157 get_tr2(tr, TR_vecEndPos, start)
158 }
159
160 CheckPoints(Float:origin[3])
161 {
162 new Float:data[3], tr, point
163 data[0] = origin[0]
164 data[1] = origin[1]
165 data[2] = 99999.9
166 engfunc(EngFunc_TraceLine, origin, data, DONT_IGNORE_MONSTERS, -1, tr)
167 get_tr2(tr, TR_vecEndPos, data)
168 point = engfunc(EngFunc_PointContents, data)
169 if(point == CONTENTS_SKY && get_distance_f(origin, data) < 250.0)
170 {
171 return false
172 }
173 data[2] = -99999.9
174 engfunc(EngFunc_TraceLine, origin, data, DONT_IGNORE_MONSTERS, -1, tr)
175 get_tr2(tr, TR_vecEndPos, data)
176 point = engfunc(EngFunc_PointContents, data)
177 if(point < CONTENTS_SOLID)
178 return false
179
180 return true
181 }
182
183 CheckDistance(Float:origin[3])
184 {
185 new Float:dist, Float:data[3]
186 new count = ArraySize(g_vecSsSpawns)
187 for(new i = 0; i < count; i++)
188 {
189 ArrayGetArray(g_vecSsSpawns, i, data)
190 dist = get_distance_f(origin, data)
191 if(dist < SS_MIN_DISTANCE)
192 return false
193 }
194
195 count = ArraySize(g_vecSsOrigins)
196 for(new i = 0; i < count; i++)
197 {
198 ArrayGetArray(g_vecSsOrigins, i, data)
199 dist = get_distance_f(origin, data)
200 if(dist < SS_MIN_DISTANCE)
201 return false
202 }
203
204 return true
205 }
206 /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
207 *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n{\\ colortbl ;\\ red0\\ green0\\ blue0;}\n\\ viewkind4\\ uc1\\ pard\\ cf1\\ lang2067\\ f0\\ fs16 \n\\ par }
208 */
209