X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fspawnfunc.qh;h=e0605c93840599e8f928f359ce1f6b02cccd7016;hb=90b55a65862014d4147a4cc951e2c89e1139cb4e;hp=7a30916def11c40e296fa461198f8652224c99f8;hpb=10e9136856420e9238e2487e23d30f2d161f46d0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/spawnfunc.qh b/qcsrc/lib/spawnfunc.qh index 7a30916de..e0605c938 100644 --- a/qcsrc/lib/spawnfunc.qh +++ b/qcsrc/lib/spawnfunc.qh @@ -1,5 +1,4 @@ -#ifndef SPAWNFUNC_H -#define SPAWNFUNC_H +#pragma once /** If this global exists, only functions with spawnfunc_ name prefix qualify as spawn functions */ noref bool require_spawnfunc_prefix; @@ -21,25 +20,36 @@ noref bool require_spawnfunc_prefix; #define _spawnfunc_checktypes(fld) \ if (fieldname == #fld) \ - if (!entityfieldassignablefromeditor(i)) LOG_FATALF("Entity field '%s' cannot be whitelisted\n", fieldname); + if (!entityfieldassignablefromeditor(i)) LOG_FATALF("Entity field '%s' cannot be whitelisted", fieldname); #else #define _spawnfunc_checktypes(fld) #endif #define _spawnfunc_check(fld) \ if (fieldname == #fld) continue; - bool __spawnfunc_unreachable_workaround = true; + noref bool __spawnfunc_expecting; + noref entity __spawnfunc_expect; + noref bool __spawnfunc_unreachable_workaround = true; #define spawnfunc_1(id) spawnfunc_2(id, FIELDS_UNION) #define spawnfunc_2(id, whitelist) \ void __spawnfunc_##id(entity this); \ [[accumulate]] void spawnfunc_##id(entity this) \ { \ - this = self; \ - if (!this.sourceLocFile) \ + if (__spawnfunc_expecting) \ { \ - this.sourceLocFile = __FILE__; \ - this.sourceLocLine = __LINE__; \ + /* engine call */ \ + __spawnfunc_expecting = false; \ + this = __spawnfunc_expect; \ + __spawnfunc_expect = NULL; \ + } \ + else \ + { \ + assert(this); \ + } \ + if (!this.sourceLoc) \ + { \ + this.sourceLoc = __FILE__ ":" STR(__LINE__); \ } \ if (!this.spawnfunc_checked) \ { \ @@ -52,7 +62,7 @@ noref bool require_spawnfunc_prefix; if (fieldname == "") continue; \ FIELDS_COMMON(_spawnfunc_check) \ whitelist(_spawnfunc_check) \ - LOG_WARNINGF(_("Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, please file an issue.\n"), #id, fieldname, value); \ + LOG_WARNF(_("Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, please file an issue."), #id, fieldname, value); \ } \ this.spawnfunc_checked = true; \ } \ @@ -74,12 +84,12 @@ noref bool require_spawnfunc_prefix; #define FIELDS_COMMON(fld) \ FIELD_SCALAR(fld, classname) \ + FIELD_SCALAR(fld, sourceLoc) \ FIELD_SCALAR(fld, spawnfunc_checked) \ + FIELD_VEC(fld, origin) \ /**/ #define FIELDS_UNION(fld) \ - FIELD_SCALAR(fld, sourceLocFile) \ - FIELD_SCALAR(fld, sourceLocLine) \ FIELD_SCALAR(fld, Version) \ FIELD_SCALAR(fld, ammo_cells) \ FIELD_SCALAR(fld, ammo_nails) \ @@ -124,26 +134,29 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, loddistance1) \ FIELD_SCALAR(fld, lodmodel1) \ FIELD_SCALAR(fld, ltime) \ + FIELD_SCALAR(fld, map) \ FIELD_SCALAR(fld, mdl) \ FIELD_SCALAR(fld, message2) \ FIELD_SCALAR(fld, message) \ FIELD_SCALAR(fld, modelindex) \ FIELD_SCALAR(fld, modelscale) \ FIELD_SCALAR(fld, model) \ + FIELD_SCALAR(fld, monsterid) \ FIELD_SCALAR(fld, monster_moveflags) \ + FIELD_SCALAR(fld, monster_name) \ FIELD_SCALAR(fld, movetype) \ + FIELD_SCALAR(fld, move_movetype) \ FIELD_SCALAR(fld, netname) \ FIELD_SCALAR(fld, nextthink) \ FIELD_SCALAR(fld, noalign) \ FIELD_SCALAR(fld, noise1) \ FIELD_SCALAR(fld, noise2) \ FIELD_SCALAR(fld, noise) \ - FIELD_SCALAR(fld, ok_item) \ FIELD_SCALAR(fld, phase) \ FIELD_SCALAR(fld, platmovetype) \ - FIELD_SCALAR(fld, pickup_anyway) \ FIELD_SCALAR(fld, race_place) \ FIELD_SCALAR(fld, radius) \ + FIELD_SCALAR(fld, respawntimestart) \ FIELD_SCALAR(fld, respawntimejitter) \ FIELD_SCALAR(fld, respawntime) \ FIELD_SCALAR(fld, restriction) \ @@ -153,8 +166,10 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, sound1) \ FIELD_SCALAR(fld, sounds) \ FIELD_SCALAR(fld, spawnflags) \ + FIELD_SCALAR(fld, spawnmob) \ FIELD_SCALAR(fld, speed) \ FIELD_SCALAR(fld, strength) \ + FIELD_SCALAR(fld, style) \ FIELD_SCALAR(fld, target2) \ FIELD_SCALAR(fld, target3) \ FIELD_SCALAR(fld, target4) \ @@ -171,18 +186,19 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, warpzone_fadeend) \ FIELD_SCALAR(fld, warpzone_fadestart) \ FIELD_SCALAR(fld, weapon) \ + FIELD_SCALAR(fld, worldtype) \ FIELD_VEC(fld, absmax) \ FIELD_VEC(fld, absmin) \ FIELD_VEC(fld, angles) \ FIELD_VEC(fld, avelocity) \ + FIELD_VEC(fld, color) \ + FIELD_VEC(fld, mangle) \ FIELD_VEC(fld, maxs) \ FIELD_VEC(fld, maxs) \ FIELD_VEC(fld, mins) \ FIELD_VEC(fld, modelscale_vec) \ - FIELD_VEC(fld, origin) \ FIELD_VEC(fld, velocity) \ /**/ - #define spawnfunc(...) EVAL(OVERLOAD(spawnfunc, __VA_ARGS__)) - -#endif + #define spawnfunc(...) EVAL_spawnfunc(OVERLOAD(spawnfunc, __VA_ARGS__)) + #define EVAL_spawnfunc(...) __VA_ARGS__