beams.inc
Original include source with line numbers.
| 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 | |