X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fspawnfunc.qh;h=e29939909734c14f241d15bb1e449552b492f0c9;hb=9f8d64e1af8f145060dc78d5c161fa1bde604686;hp=e2a25cbc76ef3ec1b8e2f674b1793f0d2eccc744;hpb=f24c1ab39321a756bb76d1699a775fe1e42040ab;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/spawnfunc.qh b/qcsrc/lib/spawnfunc.qh index e2a25cbc7..e29939909 100644 --- a/qcsrc/lib/spawnfunc.qh +++ b/qcsrc/lib/spawnfunc.qh @@ -6,6 +6,9 @@ /** If this global exists, only functions with spawnfunc_ name prefix qualify as spawn functions */ noref bool require_spawnfunc_prefix; .bool spawnfunc_checked; +/** Not for production use, provides access to a dump of the entity's fields when it is parsed from map data */ +noref string __fullspawndata; +.string fullspawndata; // Optional type checking; increases compile time too much to be enabled by default #if 0 @@ -146,12 +149,16 @@ 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, invisibility_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) \ @@ -173,9 +180,17 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, noise2) \ FIELD_SCALAR(fld, noise3) \ FIELD_SCALAR(fld, noise) \ + FIELD_SCALAR(fld, notcpm) \ + FIELD_SCALAR(fld, notfree) \ + FIELD_SCALAR(fld, notsingle) \ + FIELD_SCALAR(fld, notta) \ + FIELD_SCALAR(fld, notteam) \ + FIELD_SCALAR(fld, notvq3) \ FIELD_SCALAR(fld, phase) \ FIELD_SCALAR(fld, platmovetype) \ FIELD_SCALAR(fld, race_place) \ + FIELD_SCALAR(fld, speed_finished) \ + FIELD_SCALAR(fld, strength_finished) \ FIELD_SCALAR(fld, radius) \ FIELD_SCALAR(fld, respawntimestart) \ FIELD_SCALAR(fld, respawntimejitter) \ @@ -200,8 +215,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) \ @@ -241,6 +260,10 @@ void _checkWhitelisted(entity this, string id) } } +// this function simply avoids expanding IL_NEW during compilation +// for each spawning entity +void g_spawn_queue_spawn() { g_spawn_queue = IL_NEW(); } + noref bool __spawnfunc_first; #define spawnfunc(id) \ @@ -255,7 +278,7 @@ noref bool __spawnfunc_first; if (__spawnfunc_expecting > 1) { __spawnfunc_expecting = 0; } \ else if (__spawnfunc_expecting) { \ /* engine call */ \ - if (!g_spawn_queue) { g_spawn_queue = IL_NEW(); } \ + if (!g_spawn_queue) g_spawn_queue_spawn(); \ __spawnfunc_expecting = 0; \ this = __spawnfunc_expect; \ __spawnfunc_expect = NULL; \ @@ -267,11 +290,20 @@ noref bool __spawnfunc_first; if (!this.sourceLoc) { \ this.sourceLoc = __FILE__":"STR(__LINE__); \ } \ + this.classname = #id; \ if (!this.spawnfunc_checked) { \ _checkWhitelisted(this, #id); \ + if (__fullspawndata) { \ + /* not supported in old DP */ \ + /* must be read inside the real spawnfunc */ \ + this.fullspawndata = __fullspawndata; \ + } \ this.spawnfunc_checked = true; \ if (this) { \ /* not worldspawn, delay spawn */ \ + /* clear some dangerous fields (TODO: properly support these in the map!) */ \ + this.think = func_null; \ + this.nextthink = 0; \ __spawnfunc_defer(this, __spawnfunc_##id); \ } else { \ /* world might not be "worldspawn" */ \