AMXX-BG.INFO beams.inc Raw include

beams.inc

Original include source with line numbers.

Back Download .inc
1 /* AMX Mod X
2 * Beam entities include by KORD_12.7.
3 *
4 * Version 1.3 (last update: 4, may (05), 2013)
5 *
6 * http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community
7 *
8 * This file is provided as is (no warranties)
9 */
10
11 #if defined _beams_included
12 #endinput
13 #endif
14 #define _beams_included
15
16 #include <engine>
17 #include <fakemeta>
18 #include <xs>
19
20
21 // These functions are here to show the way beams are encoded as entities.
22 // Encoding beams as entities simplifies their management in the client/server architecture.
23
24
25 // Beam types
26 enum _:Beam_Types
27 {
28 BEAM_POINTS,
29 BEAM_ENTPOINT,
30 BEAM_ENTS,
31 BEAM_HOSE
32 };
33
34 // Beam flags
35 #define BEAM_FSINE 0x10
36 #define BEAM_FSOLID 0x20
37 #define BEAM_FSHADEIN 0x40
38 #define BEAM_FSHADEOUT 0x80
39
40
41 #define Beam_SetType(%0,%1) set_pev(%0, pev_rendermode, (pev(%0, pev_rendermode) & 0xF0) | %1 & 0x0F)
42 /* stock Beam_SetType(const iBeamEntity, const iType)
43 return set_pev(iBeamEntity, pev_rendermode, (pev(iBeamEntity, pev_rendermode) & 0xF0) | iType & 0x0F); */
44
45 #define Beam_SetFlags(%0,%1) set_pev(%0, pev_rendermode, (pev(%0, pev_rendermode) & 0x0F) | %1 & 0xF0)
46 /* stock Beam_SetFlags(const iBeamEntity, const iType)
47 return set_pev(iBeamEntity, pev_rendermode, (pev(iBeamEntity, pev_rendermode) & 0x0F) | iType & 0xF0); */
48
49 #define Beam_SetStartPos(%0,%1) set_pev(%0, pev_origin, %1)
50 /* stock Beam_SetStartPos(const iBeamEntity, const Float: flVecStart[3])
51 return set_pev(iBeamEntity, pev_origin, flVecStart); */
52
53 #define Beam_SetEndPos(%0,%1) set_pev(%0, pev_angles, %1)
54 /* stock Beam_SetEndPos(const iBeamEntity, const Float: flVecEnd[3])
55 return set_pev(iBeamEntity, pev_angles, flVecEnd); */
56
57 #define Beam_SetStartEntity(%0,%1) \
58 set_pev(%0, pev_sequence, (%1 & 0x0FFF) | ((pev(%0, pev_sequence) & 0xF000) << 12)); \
59 set_pev(%0, pev_owner, %1) \
60 /* stock Beam_SetStartEntity(const iBeamEntity, const iEntityIndex) */
61
62 #define Beam_SetEndEntity(%0,%1) \
63 set_pev(%0, pev_skin, (%1 & 0x0FFF) | ((pev(%0, pev_skin) & 0xF000) << 12)); \
64 set_pev(%0, pev_aiment, %1) \
65 /* stock Beam_SetEndEntity(const iBeamEntity, const iEntityIndex) */
66
67 #define Beam_SetStartAttachment(%0,%1) set_pev(%0, pev_sequence, (pev(%0, pev_sequence) & 0x0FFF) | ((%1 & 0xF) << 12))
68 /* stock Beam_SetStartAttachment(const iBeamEntity, const iAttachment)
69 return set_pev(iBeamEntity, pev_sequence, (pev(iBeamEntity, pev_sequence) & 0x0FFF) | ((iAttachment & 0xF) << 12)); */
70
71 #define Beam_SetEndAttachment(%0,%1) set_pev(%0, pev_skin, (pev(%0, pev_skin) & 0x0FFF) | ((%1 & 0xF) << 12))
72 /* stock Beam_SetEndAttachment(const iBeamEntity, const iAttachment)
73 return set_pev(iBeamEntity, pev_skin, (pev(iBeamEntity, pev_skin) & 0x0FFF) | ((iAttachment & 0xF) << 12)); */
74
75 #define Beam_SetTexture(%0,%1) set_pev(%0, pev_modelindex, %1)
76 /* stock Beam_SetTexture(const iBeamEntity, const iSpriteIndex)
77 return set_pev(iBeamEntity, pev_modelindex, iSpriteIndex); */
78
79 #define Beam_SetWidth(%0,%1) set_pev(%0, pev_scale, %1)
80 /* stock Beam_SetWidth(const iBeamEntity, const Float: flWidth)
81 return set_pev(iBeamEntity, pev_scale, flWidth); */
82
83 #define Beam_SetNoise(%0,%1) set_pev(%0, pev_body, %1)
84 /* stock Beam_SetNoise(const iBeamEntity, const iNoise)
85 return set_pev(iBeamEntity, pev_body, iNoise); */
86
87 #define Beam_SetColor(%0,%1) set_pev(%0, pev_rendercolor, %1)
88 /* stock Beam_SetColor(const iBeamEntity, const Float: flColor[3])
89 return set_pev(iBeamEntity, pev_rendercolor, flColor); */
90
91 #define Beam_SetBrightness(%0,%1) set_pev(%0, pev_renderamt, %1)
92 /* stock Beam_SetBrightness(const iBeamEntity, const Float: flBrightness)
93 return set_pev(iBeamEntity, pev_renderamt, flBrightness); */
94
95 #define Beam_SetFrame(%0,%1) set_pev(%0, pev_frame, %1)
96 /* stock Beam_SetFrame(const iBeamEntity, const Float: flFrame)
97 return set_pev(iBeamEntity, pev_frame, flFrame); */
98
99 #define Beam_SetScrollRate(%0,%1) set_pev(%0, pev_animtime, %1)
100 /* stock Beam_SetScrollRate(const iBeamEntity, const Float: flSpeed)
101 return set_pev(iBeamEntity, pev_animtime, flSpeed); */
102
103 #define Beam_GetType(%0) (pev(%0, pev_rendermode) & 0x0F)
104 /* stock Beam_GetType(const iBeamEntity)
105 return pev(iBeamEntity, pev_rendermode) & 0x0F; */
106
107 #define Beam_GetFlags(%0) (pev(%0, pev_rendermode) & 0xF0)
108 /* stock Beam_GetFlags(const iBeamEntity)
109 return pev(iBeamEntity, pev_rendermode) & 0xF0; */
110
111 #define Beam_GetStartEntity(%0) (pev(%0, pev_sequence) & 0xFFF)
112 /* stock Beam_GetStartEntity(const iBeamEntity)
113 return pev(iBeamEntity, pev_sequence) & 0xFFF; */
114
115 #define Beam_GetEndEntity(%0) (pev(%0, pev_skin) & 0xFFF)
116 /* stock Beam_GetEndEntity(const iBeamEntity)
117 return pev(iBeamEntity, pev_skin) & 0xFFF; */
118
119 stock Beam_GetStartPos(const iBeamEntity, Float: vecStartPos[3])
120 {
121 static iEntity; iEntity = Beam_GetStartEntity(iBeamEntity);
122
123 if (Beam_GetType(iBeamEntity) == BEAM_ENTS && pev_valid(iEntity))
124 {
125 pev(iEntity, pev_origin, vecStartPos);
126 return;
127 }
128
129 pev(iBeamEntity, pev_origin, vecStartPos);
130 }
131
132 stock Beam_GetEndPos(const iBeamEntity, Float: vecEndPos[3])
133 {
134 static iType;
135 static iEntity;
136
137 iType = Beam_GetType(iBeamEntity);
138
139 if (iType == BEAM_POINTS || iType == BEAM_HOSE)
140 {
141 pev(iBeamEntity, pev_angles, vecEndPos);
142 return;
143 }
144
145 iEntity = Beam_GetEndEntity(iBeamEntity);
146
147 if (pev_valid(iEntity))
148 {
149 pev(iEntity, pev_origin, vecEndPos);
150 return;
151 }
152
153 pev(iBeamEntity, pev_angles, vecEndPos);
154 }
155
156 #define Beam_GetTexture(%0) pev(%0, pev_modelindex)
157 /* stock Beam_GetTexture(const iBeamEntity)
158 return pev(iBeamEntity, pev_modelindex); */
159
160 #define Beam_GetWidth(%0) entity_get_float(%0, EV_FL_scale)
161 /* stock Float: Beam_GetWidth(const iBeamEntity)
162 return entity_get_float(iBeamEntity, EV_FL_scale); */
163
164 #define Beam_GetNoise(%0) pev(%0, pev_body)
165 /* stock Beam_GetNoise(const iBeamEntity)
166 return pev(iBeamEntity, pev_body); */
167
168 #define Beam_GetColor(%0,%1) pev(%0, pev_rendercolor,%1)
169 /* stock Beam_GetColor(const iBeamEntity, Float: flRGB[3])
170 return pev(iBeamEntity, pev_rendercolor, flRGB); */
171
172 #define Beam_GetBrightness(%0) entity_get_float(%0, EV_FL_renderamt)
173 /* stock Float: Beam_GetBrightness(const iBeamEntity)
174 return entity_get_float(iBeamEntity, EV_FL_renderamt); */
175
176 #define Beam_GetFrame(%0) entity_get_float(%0, EV_FL_frame)
177 /* stock Float: Beam_GetFrame(const iBeamEntity)
178 return entity_get_float(iBeamEntity, EV_FL_frame); */
179
180 #define Beam_GetScrollRate(%0) entity_get_float(%0, EV_FL_animtime)
181 /* stock Float: Beam_GetScrollRate(const iBeamEntity)
182 return entity_get_float(iBeamEntity, EV_FL_animtime); */
183
184 stock Beam_Create(const szSpriteName[], const Float: flWidth)
185 {
186 static iBeamEntity, iszAllocStringCached;
187 if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "beam")))
188 {
189 iBeamEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
190 }
191
192 if (!pev_valid(iBeamEntity))
193 {
194 return FM_NULLENT;
195 }
196
197 Beam_Init(iBeamEntity, szSpriteName, flWidth);
198 return iBeamEntity;
199 }
200
201 stock Beam_Init(const iBeamEntity, const szSpriteName[], const Float: flWidth)
202 {
203 set_pev(iBeamEntity, pev_flags, pev(iBeamEntity, pev_flags) | FL_CUSTOMENTITY);
204
205 Beam_SetColor(iBeamEntity, Float: {255.0, 255.0, 255.0});
206 Beam_SetBrightness(iBeamEntity, 255.0);
207 Beam_SetNoise(iBeamEntity, 0);
208 Beam_SetFrame(iBeamEntity, 0.0);
209 Beam_SetScrollRate(iBeamEntity, 0.0);
210 Beam_SetWidth(iBeamEntity, flWidth);
211
212 engfunc(EngFunc_SetModel, iBeamEntity, szSpriteName);
213
214 set_pev(iBeamEntity, pev_skin, 0);
215 set_pev(iBeamEntity, pev_sequence, 0);
216 set_pev(iBeamEntity, pev_rendermode, 0);
217 }
218
219 stock Beam_PointsInit(const iBeamEntity, const Float: flVecStart[3], const Float: flVecEnd[3])
220 {
221 Beam_SetType(iBeamEntity, BEAM_POINTS);
222 Beam_SetStartPos(iBeamEntity, flVecStart);
223 Beam_SetEndPos(iBeamEntity, flVecEnd);
224 Beam_SetStartAttachment(iBeamEntity, 0);
225 Beam_SetEndAttachment(iBeamEntity, 0);
226 Beam_RelinkBeam(iBeamEntity);
227 }
228
229 stock Beam_HoseInit(const iBeamEntity, const Float: flVecStart[3], const Float: flVecDirection[3])
230 {
231 Beam_SetType(iBeamEntity, BEAM_HOSE);
232 Beam_SetStartPos(iBeamEntity, flVecStart);
233 Beam_SetEndPos(iBeamEntity, flVecDirection);
234 Beam_SetStartAttachment(iBeamEntity, 0);
235 Beam_SetEndAttachment(iBeamEntity, 0);
236 Beam_RelinkBeam(iBeamEntity);
237 }
238
239 stock Beam_PointEntInit(const iBeamEntity, const Float: flVecStart[3], const iEndIndex)
240 {
241 Beam_SetType(iBeamEntity, BEAM_ENTPOINT);
242 Beam_SetStartPos(iBeamEntity, flVecStart);
243 Beam_SetEndEntity(iBeamEntity, iEndIndex);
244 Beam_SetStartAttachment(iBeamEntity, 0);
245 Beam_SetEndAttachment(iBeamEntity, 0);
246 Beam_RelinkBeam(iBeamEntity);
247 }
248
249 stock Beam_EntsInit(const iBeamEntity, const iStartIndex, const iEndIndex)
250 {
251 Beam_SetType(iBeamEntity, BEAM_ENTS);
252 Beam_SetStartEntity(iBeamEntity, iStartIndex);
253 Beam_SetEndEntity(iBeamEntity, iEndIndex);
254 Beam_SetStartAttachment(iBeamEntity, 0);
255 Beam_SetEndAttachment(iBeamEntity, 0);
256 Beam_RelinkBeam(iBeamEntity);
257 }
258
259 stock Beam_RelinkBeam(const iBeamEntity)
260 {
261 static Float: vecMins[3];
262 static Float: vecMaxs[3];
263
264 static Float: vecOrigin[3];
265 static Float: vecEndPos[3];
266 static Float: vecStartPos[3];
267
268 pev(iBeamEntity, pev_origin, vecOrigin);
269
270 Beam_GetStartPos(iBeamEntity, vecStartPos);
271 Beam_GetEndPos(iBeamEntity, vecEndPos);
272
273 vecMins[0] = floatmin(vecStartPos[0], vecEndPos[0]);
274 vecMins[1] = floatmin(vecStartPos[1], vecEndPos[1]);
275 vecMins[2] = floatmin(vecStartPos[2], vecEndPos[2]);
276
277 vecMaxs[0] = floatmax(vecStartPos[0], vecEndPos[0]);
278 vecMaxs[1] = floatmax(vecStartPos[1], vecEndPos[1]);
279 vecMaxs[2] = floatmax(vecStartPos[2], vecEndPos[2]);
280
281 xs_vec_sub(vecMins, vecOrigin, vecMins);
282 xs_vec_sub(vecMaxs, vecOrigin, vecMaxs);
283
284 set_pev(iBeamEntity, pev_mins, vecMins);
285 set_pev(iBeamEntity, pev_maxs, vecMaxs);
286
287 engfunc(EngFunc_SetSize, iBeamEntity, vecMins, vecMaxs);
288 engfunc(EngFunc_SetOrigin, iBeamEntity, vecOrigin);
289 }
290