X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fspawnfunc.qh;h=d3198b3ce4c7666bf986564916b9d9678b3dc097;hb=60b0e81cdaed847a7aac9d234f219937ab9462b2;hp=e30e565fd3259a6916d36d5c230d7165bae4dd1c;hpb=85c03a17f9f8004118717560a0b01b6614d3ef8d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/spawnfunc.qh b/qcsrc/lib/spawnfunc.qh index e30e565fd..d3198b3ce 100644 --- a/qcsrc/lib/spawnfunc.qh +++ b/qcsrc/lib/spawnfunc.qh @@ -19,13 +19,13 @@ noref bool require_spawnfunc_prefix; } #define _spawnfunc_checktypes(fld) \ - if (fieldname == #fld) \ - if (!entityfieldassignablefromeditor(i)) LOG_FATALF("Entity field '%s' cannot be whitelisted", fieldname); + if (s == #fld) \ + if (!entityfieldassignablefromeditor(i)) LOG_FATALF("Entity field '%s' cannot be whitelisted", s); #else #define _spawnfunc_checktypes(fld) #endif #define _spawnfunc_check(fld) \ - if (fieldname == #fld) continue; + if (s == #fld) continue; noref int __spawnfunc_expecting; noref entity __spawnfunc_expect; @@ -36,6 +36,10 @@ noref bool require_spawnfunc_prefix; #define SPAWNFUNC_INTERNAL_FIELDS(X) \ X(string, classname, "spawnfunc") \ + X(string, target, string_null) \ + X(string, target2, string_null) \ + X(string, target3, string_null) \ + X(string, target4, string_null) \ X(string, targetname, string_null) \ /**/ @@ -57,7 +61,9 @@ noref bool require_spawnfunc_prefix; g_map_entities = IL_NEW(); \ IL_EACH(g_spawn_queue, true, __spawnfunc_spawn(it)); \ MACRO_END - +#ifdef SVQC + void _SV_OnEntityPreSpawnFunction(entity this); +#endif void __spawnfunc_spawn(entity prototype) { entity e = new(clone); @@ -66,14 +72,26 @@ noref bool require_spawnfunc_prefix; #define X(T, fld, def) { e.fld = e.__spawnfunc_##fld; e.__spawnfunc_##fld = def; } SPAWNFUNC_INTERNAL_FIELDS(X); #undef X +#ifdef SVQC + _SV_OnEntityPreSpawnFunction(e); + if (wasfreed(e)) { + return; + } +#endif 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) \ + 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) { \ @@ -93,13 +111,13 @@ noref bool require_spawnfunc_prefix; if (!this.spawnfunc_checked) { \ for (int i = 0, n = numentityfields(); i < n; ++i) { \ string value = getentityfieldstring(i, this); \ - string fieldname = entityfieldname(i); \ + string s = entityfieldname(i); \ whitelist(_spawnfunc_checktypes) \ if (value == "") continue; \ - if (fieldname == "") 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, fieldname, value); \ + 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) { \ @@ -138,12 +156,14 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, ammo_cells) \ FIELD_SCALAR(fld, ammo_nails) \ FIELD_SCALAR(fld, ammo_rockets) \ + FIELD_SCALAR(fld, antiwall_flag) \ FIELD_SCALAR(fld, armorvalue) \ FIELD_SCALAR(fld, atten) \ FIELD_SCALAR(fld, bgmscriptdecay) \ FIELD_SCALAR(fld, bgmscriptsustain) \ FIELD_SCALAR(fld, bgmscript) \ FIELD_SCALAR(fld, button0) \ + FIELD_SCALAR(fld, chmap) \ FIELD_SCALAR(fld, cnt) \ FIELD_SCALAR(fld, colormap) \ FIELD_SCALAR(fld, count) \ @@ -151,6 +171,8 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, cvarfilter) \ FIELD_SCALAR(fld, debrisdamageforcescale) \ FIELD_SCALAR(fld, debrisfadetime) \ + FIELD_SCALAR(fld, debrismovetype) \ + FIELD_SCALAR(fld, debrisskin) \ FIELD_SCALAR(fld, debristimejitter) \ FIELD_SCALAR(fld, debristime) \ FIELD_SCALAR(fld, debris) \ @@ -161,10 +183,12 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, dmg_force) \ FIELD_SCALAR(fld, dmg_radius) \ FIELD_SCALAR(fld, effects) \ + FIELD_SCALAR(fld, falloff) \ FIELD_SCALAR(fld, flags) \ FIELD_SCALAR(fld, fog) \ FIELD_SCALAR(fld, frags) \ FIELD_SCALAR(fld, frame) \ + FIELD_SCALAR(fld, gametype) \ FIELD_SCALAR(fld, gametypefilter) \ FIELD_SCALAR(fld, geomtype) \ FIELD_SCALAR(fld, gravity) \ @@ -195,6 +219,7 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, noalign) \ FIELD_SCALAR(fld, noise1) \ FIELD_SCALAR(fld, noise2) \ + FIELD_SCALAR(fld, noise3) \ FIELD_SCALAR(fld, noise) \ FIELD_SCALAR(fld, phase) \ FIELD_SCALAR(fld, platmovetype) \ @@ -222,6 +247,7 @@ noref bool require_spawnfunc_prefix; FIELD_SCALAR(fld, target_random) \ FIELD_SCALAR(fld, target_range) \ FIELD_SCALAR(fld, team) \ + FIELD_SCALAR(fld, trigger_reverse) \ FIELD_SCALAR(fld, turret_scale_health) \ FIELD_SCALAR(fld, turret_scale_range) \ FIELD_SCALAR(fld, turret_scale_respawn) \ @@ -235,10 +261,13 @@ noref bool require_spawnfunc_prefix; FIELD_VEC(fld, absmin) \ FIELD_VEC(fld, angles) \ FIELD_VEC(fld, avelocity) \ + FIELD_VEC(fld, beam_color)\ + FIELD_VEC(fld, debrisavelocityjitter) \ + FIELD_VEC(fld, debrisvelocity) \ + FIELD_VEC(fld, debrisvelocityjitter) \ 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, velocity) \