X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Flib%2Fspawnfunc.qh;h=8c7911233d8d29400e9900f83d86c55a8477f44c;hp=d3198b3ce4c7666bf986564916b9d9678b3dc097;hb=d9a350cc651d9259dd2ead8f17578b764d888e14;hpb=bc3f297ed082b23fb33dd0d8f5dcd33bb0198507 diff --git a/qcsrc/lib/spawnfunc.qh b/qcsrc/lib/spawnfunc.qh index d3198b3ce..8c7911233 100644 --- a/qcsrc/lib/spawnfunc.qh +++ b/qcsrc/lib/spawnfunc.qh @@ -1,5 +1,8 @@ #pragma once +// remove this ifdef when client or menu will actually make use of this stuff +#ifdef SVQC + /** If this global exists, only functions with spawnfunc_ name prefix qualify as spawn functions */ noref bool require_spawnfunc_prefix; .bool spawnfunc_checked; @@ -81,58 +84,6 @@ noref bool require_spawnfunc_prefix; e.__spawnfunc_constructor(e); } - noref bool __spawnfunc_first; - - #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) \ - { \ - if (!__spawnfunc_first) { \ - __spawnfunc_first = true; \ - static_init_early(); \ - } \ - bool dospawn = true; \ - if (__spawnfunc_expecting > 1) { __spawnfunc_expecting = false; } \ - else if (__spawnfunc_expecting) { \ - /* engine call */ \ - if (!g_spawn_queue) { g_spawn_queue = IL_NEW(); } \ - __spawnfunc_expecting = false; \ - this = __spawnfunc_expect; \ - __spawnfunc_expect = NULL; \ - dospawn = false; \ - } else { \ - /* userland call */ \ - assert(this); \ - } \ - if (!this.sourceLoc) { \ - this.sourceLoc = __FILE__ ":" STR(__LINE__); \ - } \ - if (!this.spawnfunc_checked) { \ - for (int i = 0, n = numentityfields(); i < n; ++i) { \ - string value = getentityfieldstring(i, this); \ - string s = entityfieldname(i); \ - whitelist(_spawnfunc_checktypes) \ - if (value == "") continue; \ - if (s == "") continue; \ - FIELDS_COMMON(_spawnfunc_check) \ - whitelist(_spawnfunc_check) \ - LOG_WARNF(_("Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, please file an issue."), #id, s, value); \ - } \ - this.spawnfunc_checked = true; \ - if (this) { \ - /* not worldspawn, delay spawn */ \ - __spawnfunc_defer(this, __spawnfunc_##id); \ - } else { \ - /* world might not be "worldspawn" */ \ - this.__spawnfunc_constructor = __spawnfunc_##id; \ - } \ - } \ - if (dospawn) { __spawnfunc_##id(this); } \ - if (__spawnfunc_unreachable_workaround) return; \ - } \ - void __spawnfunc_##id(entity this) - #define FIELD_SCALAR(fld, n) \ fld(n) #define FIELD_VEC(fld, n) \ @@ -195,14 +146,18 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, health) \ FIELD_SCALAR(fld, height) \ FIELD_SCALAR(fld, impulse) \ + FIELD_SCALAR(fld, invincible_finished) \ + FIELD_SCALAR(fld, item_pickupsound) \ FIELD_SCALAR(fld, killtarget) \ FIELD_SCALAR(fld, lerpfrac) \ FIELD_SCALAR(fld, light_lev) \ FIELD_SCALAR(fld, lip) \ FIELD_SCALAR(fld, loddistance1) \ FIELD_SCALAR(fld, lodmodel1) \ + FIELD_SCALAR(fld, lodmodel2) \ FIELD_SCALAR(fld, ltime) \ FIELD_SCALAR(fld, map) \ + FIELD_SCALAR(fld, max_health) \ FIELD_SCALAR(fld, mdl) \ FIELD_SCALAR(fld, message2) \ FIELD_SCALAR(fld, message) \ @@ -224,6 +179,7 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, phase) \ FIELD_SCALAR(fld, platmovetype) \ FIELD_SCALAR(fld, race_place) \ + FIELD_SCALAR(fld, strength_finished) \ FIELD_SCALAR(fld, radius) \ FIELD_SCALAR(fld, respawntimestart) \ FIELD_SCALAR(fld, respawntimejitter) \ @@ -248,8 +204,12 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, target_range) \ FIELD_SCALAR(fld, team) \ FIELD_SCALAR(fld, trigger_reverse) \ + FIELD_SCALAR(fld, turret_scale_aim) \ + FIELD_SCALAR(fld, turret_scale_ammo) \ + FIELD_SCALAR(fld, turret_scale_damage) \ FIELD_SCALAR(fld, turret_scale_health) \ FIELD_SCALAR(fld, turret_scale_range) \ + FIELD_SCALAR(fld, turret_scale_refire) \ FIELD_SCALAR(fld, turret_scale_respawn) \ FIELD_SCALAR(fld, volume) \ FIELD_SCALAR(fld, wait) \ @@ -273,5 +233,62 @@ noref bool require_spawnfunc_prefix; FIELD_VEC(fld, velocity) \ /**/ - #define spawnfunc(...) EVAL_spawnfunc(OVERLOAD(spawnfunc, __VA_ARGS__)) - #define EVAL_spawnfunc(...) __VA_ARGS__ +ERASEABLE +void _checkWhitelisted(entity this, string id) +{ + for (int i = 0, n = numentityfields(); i < n; ++i) + { + string value = getentityfieldstring(i, this); + string s = entityfieldname(i); + FIELDS_UNION(_spawnfunc_checktypes) + if (value == "") continue; + if (s == "") continue; + FIELDS_COMMON(_spawnfunc_check) + FIELDS_UNION(_spawnfunc_check) + LOG_WARNF(_("Entity field %s.%s (%s) is not whitelisted. If you believe this is an error, please file an issue."), id, s, value); + } +} + +noref bool __spawnfunc_first; + +#define spawnfunc(id) \ + void __spawnfunc_##id(entity this); \ + ACCUMULATE void spawnfunc_##id(entity this) \ + { \ + if (!__spawnfunc_first) { \ + __spawnfunc_first = true; \ + static_init_early(); \ + } \ + bool dospawn = true; \ + if (__spawnfunc_expecting > 1) { __spawnfunc_expecting = 0; } \ + else if (__spawnfunc_expecting) { \ + /* engine call */ \ + if (!g_spawn_queue) { g_spawn_queue = IL_NEW(); } \ + __spawnfunc_expecting = 0; \ + this = __spawnfunc_expect; \ + __spawnfunc_expect = NULL; \ + dospawn = false; \ + } else { \ + /* userland call */ \ + assert(this); \ + } \ + if (!this.sourceLoc) { \ + this.sourceLoc = __FILE__":"STR(__LINE__); \ + } \ + if (!this.spawnfunc_checked) { \ + _checkWhitelisted(this, #id); \ + this.spawnfunc_checked = true; \ + if (this) { \ + /* not worldspawn, delay spawn */ \ + __spawnfunc_defer(this, __spawnfunc_##id); \ + } else { \ + /* world might not be "worldspawn" */ \ + this.__spawnfunc_constructor = __spawnfunc_##id; \ + } \ + } \ + if (dospawn) { __spawnfunc_##id(this); } \ + if (__spawnfunc_unreachable_workaround) return; \ + } \ + void __spawnfunc_##id(entity this) + +#endif