/** 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
bool entityfieldassignablefromeditor(int i)
bool autocvar_g_weaponswitch_debug;
bool autocvar_g_weaponswitch_debug_alternate;
bool autocvar_g_allow_checkpoints;
-bool autocvar_sv_q3defragcompat_changehitbox = false;
+bool autocvar_sv_q3compat_changehitbox;
+ int autocvar_sv_clones;
+ bool autocvar_g_footsteps;
+ float autocvar_sv_maxidle;
+ bool autocvar_sv_maxidle_spectatorsareidle;
+ int autocvar_sv_maxidle_slots;
+ bool autocvar_sv_maxidle_slots_countbots;
+ bool autocvar_sv_autotaunt;
+ bool autocvar_g_warmup_allguns;
+ bool autocvar_g_warmup_allow_timeout;
+ float autocvar_g_weaponspreadfactor;
+ float autocvar_g_weaponforcefactor;
+ float autocvar_g_weapondamagefactor;
+ float autocvar_g_weaponratefactor;
+ float autocvar_g_weaponspeedfactor;
+ float autocvar_sv_foginterval;
+ bool autocvar_sv_ready_restart_repeatable;
+ bool autocvar_g_jetpack;
+ bool autocvar_sv_taunt;
+ bool autocvar_sv_ready_restart;
}
return 0;
}
- .bool pushable;
- bool isPushable(entity e)
- {
- if(e.pushable)
- return true;
- if(IS_VEHICLE(e))
- return false;
- if(e.iscreature)
- return true;
- if (Item_IsLoot(e))
- {
- return true;
- }
- switch(e.classname)
- {
- case "body":
- return true;
- case "bullet": // antilagged bullets can't hit this either
- return false;
- }
- if (e.projectiledeathtype)
- return true;
- return false;
- }
-
+
+string GetField_fullspawndata(entity e, string f, ...)
+/* Retrieves the value of a map entity field from fullspawndata
+ * This bypasses field value changes made by the engine,
+ * eg string-to-float and escape sequence substitution.
+ *
+ * Avoids the need to declare fields just to read them once :)
+ *
+ * Returns the last instance of the field to match DarkPlaces behaviour.
+ * Path support: converts \ to / and tests the file if a third (bool, true) arg is passed.
+ * Returns string_null if the entity does not have the field, or the file is not in the VFS.
+ *
+ * FIXME: entities with //comments are not supported.
+ */
+{
+ string v = string_null;
+
+ if (!e.fullspawndata)
+ {
+ LOG_WARNF("^1EDICT %s (classname %s) has no fullspawndata, engine lacks support?", ftos(num_for_edict(e)), e.classname);
+ return v;
+ }
+
+ if (strstrofs(e.fullspawndata, "//", 0) >= 0)
+ {
+ // tokenize and tokenize_console return early if "//" is reached,
+ // which can leave an odd number of tokens and break key:value pairing.
+ LOG_WARNF("^1EDICT %s fullspawndata contains unsupported //comment^7%s", ftos(num_for_edict(e)), e.fullspawndata);
+ return v;
+ }
+
+ //print(sprintf("%s(EDICT %s, FIELD %s)\n", __FUNC__, ftos(num_for_edict(e)), f));
+ //print(strcat("FULLSPAWNDATA:", e.fullspawndata, "\n"));
+
+ // tokenize treats \ as an escape, but tokenize_console returns the required literal
+ for (int t = tokenize_console(e.fullspawndata) - 3; t > 0; t -= 2)
+ {
+ //print(sprintf("\tTOKEN %s:%s\t%s:%s\n", ftos(t), ftos(t + 1), argv(t), argv(t + 1)));
+ if (argv(t) == f)
+ {
+ v = argv(t + 1);
+ break;
+ }
+ }
+
+ //print(strcat("RESULT: ", v, "\n\n"));
+
+ if (v && ...(0, bool) == true)
+ {
+ v = strreplace("\\", "/", v);
+ if (whichpack(v) == "")
+ return string_null;
+ }
+
+ return v;
+}