X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Fsandbox%2Fsv_sandbox.qc;h=93dc602f0299df56c21597ea6cf966e951d2db78;hb=81062a39c99785039ceee2dcd187fed9352a08c5;hp=d0739c2e4443a4e2e1820079bb7a6a7eb581dbb1;hpb=e424ba544c41fc40b241b17bd7c1d9c2fc930705;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/mutator/sandbox/sv_sandbox.qc b/qcsrc/common/mutators/mutator/sandbox/sv_sandbox.qc index d0739c2e4..93dc602f0 100644 --- a/qcsrc/common/mutators/mutator/sandbox/sv_sandbox.qc +++ b/qcsrc/common/mutators/mutator/sandbox/sv_sandbox.qc @@ -75,14 +75,14 @@ void sandbox_ObjectFunction_Think(entity this) // since if the owning player disconnects, the object's owner should also be reset. // bots can't have objects - FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), LAMBDA( + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), { if(this.crypto_idfp == it.crypto_idfp) { this.realowner = it; break; } this.realowner = NULL; - )); + }); this.nextthink = time; @@ -143,12 +143,9 @@ void sandbox_ObjectAttach_Remove(entity e) { // detaches any object attached to e - FOREACH_ENTITY_ENT(owner, e, + IL_EACH(g_sandbox_objects, it.owner == e, { - if(it.classname != "object") continue; - - vector org; - org = gettaginfo(it, 0); + vector org = gettaginfo(it, 0); setattachment(it, NULL, ""); it.owner = NULL; @@ -167,6 +164,7 @@ entity sandbox_ObjectSpawn(entity this, float database) // spawn a new object with default properties entity e = new(object); + IL_PUSH(g_sandbox_objects, e); e.takedamage = DAMAGE_AIM; e.damageforcescale = 1; e.solid = SOLID_BBOX; // SOLID_BSP would be best, but can lag the server badly @@ -211,7 +209,7 @@ void sandbox_ObjectRemove(entity e) sandbox_ObjectAttach_Remove(e); // detach child objects // if the object being removed has been selected for attachment by a player, unset it - FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it.object_attach == e, LAMBDA(it.object_attach = NULL)); + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it.object_attach == e, { it.object_attach = NULL; }); if(e.material) { strunzone(e.material); e.material = string_null; } if(e.crypto_idfp) { strunzone(e.crypto_idfp); e.crypto_idfp = string_null; } @@ -226,30 +224,28 @@ void sandbox_ObjectRemove(entity e) string port_string[MAX_STORAGE_ATTACHMENTS]; // fteqcc crashes if this isn't defined as a global -string sandbox_ObjectPort_Save(entity e, float database) +string sandbox_ObjectPort_Save(entity e, bool database) { // save object properties, and return them as a string - float i = 0; - string s; - entity head; + int o = 0; - for(head = NULL; (head = find(head, classname, "object")); ) - { + // order doesn't really matter, as we're writing the file fresh + IL_EACH(g_sandbox_objects, it == e || it.owner == e, LAMBDA( // the main object needs to be first in the array [0] with attached objects following - float slot, physics, solidity; - if(head == e) // this is the main object, place it first + int slot, physics, solidity; + if(it == e) // this is the main object, place it first { slot = 0; - solidity = head.solid; // applied solidity is normal solidity for children - physics = head.move_movetype; // applied physics are normal physics for parents + solidity = it.solid; // applied solidity is normal solidity for children + physics = it.move_movetype; // applied physics are normal physics for parents } - else if(head.owner == e) // child object, list them in order + else if(it.owner == e) // child object, list them in order { - i += 1; // children start from 1 - slot = i; - solidity = head.old_solid; // persisted solidity is normal solidity for children - physics = head.old_movetype; // persisted physics are normal physics for children - gettaginfo(head.owner, head.tag_index); // get the name of the tag our object is attached to, used further below + o += 1; // children start from 1 + slot = o; + solidity = it.old_solid; // persisted solidity is normal solidity for children + physics = it.old_movetype; // persisted physics are normal physics for children + gettaginfo(it.owner, it.tag_index); // get the name of the tag our object is attached to, used further below } else continue; @@ -258,46 +254,55 @@ string sandbox_ObjectPort_Save(entity e, float database) if(slot) { // properties stored only for child objects - if(gettaginfo_name) port_string[slot] = strcat(port_string[slot], "\"", gettaginfo_name, "\" "); else port_string[slot] = strcat(port_string[slot], "\"\" "); // none + if(gettaginfo_name) + port_string[slot] = strcat(port_string[slot], "\"", gettaginfo_name, "\" "); + else + port_string[slot] = strcat(port_string[slot], "\"\" "); // none } else { // properties stored only for parent objects if(database) { - port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", head.origin), " "); - port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", head.angles), " "); + port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", it.origin), " "); + port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", it.angles), " "); } } // properties stored for all objects - port_string[slot] = strcat(port_string[slot], "\"", head.model, "\" "); - port_string[slot] = strcat(port_string[slot], ftos(head.skin), " "); - port_string[slot] = strcat(port_string[slot], ftos(head.alpha), " "); - port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", head.colormod), " "); - port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", head.glowmod), " "); - port_string[slot] = strcat(port_string[slot], ftos(head.frame), " "); - port_string[slot] = strcat(port_string[slot], ftos(head.scale), " "); + port_string[slot] = strcat(port_string[slot], "\"", it.model, "\" "); + port_string[slot] = strcat(port_string[slot], ftos(it.skin), " "); + port_string[slot] = strcat(port_string[slot], ftos(it.alpha), " "); + port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", it.colormod), " "); + port_string[slot] = strcat(port_string[slot], sprintf("\"%.9v\"", it.glowmod), " "); + port_string[slot] = strcat(port_string[slot], ftos(it.frame), " "); + port_string[slot] = strcat(port_string[slot], ftos(it.scale), " "); port_string[slot] = strcat(port_string[slot], ftos(solidity), " "); port_string[slot] = strcat(port_string[slot], ftos(physics), " "); - port_string[slot] = strcat(port_string[slot], ftos(head.damageforcescale), " "); - if(head.material) port_string[slot] = strcat(port_string[slot], "\"", head.material, "\" "); else port_string[slot] = strcat(port_string[slot], "\"\" "); // none + port_string[slot] = strcat(port_string[slot], ftos(it.damageforcescale), " "); + if(it.material) + port_string[slot] = strcat(port_string[slot], "\"", it.material, "\" "); + else + port_string[slot] = strcat(port_string[slot], "\"\" "); // none if(database) { // properties stored only for the database - if(head.crypto_idfp) port_string[slot] = strcat(port_string[slot], "\"", head.crypto_idfp, "\" "); else port_string[slot] = strcat(port_string[slot], "\"\" "); // none + if(it.crypto_idfp) + port_string[slot] = strcat(port_string[slot], "\"", it.crypto_idfp, "\" "); + else + port_string[slot] = strcat(port_string[slot], "\"\" "); // none port_string[slot] = strcat(port_string[slot], "\"", e.netname, "\" "); port_string[slot] = strcat(port_string[slot], "\"", e.message, "\" "); port_string[slot] = strcat(port_string[slot], "\"", e.message2, "\" "); } - } + )); // now apply the array to a simple string, with the ; symbol separating objects - s = ""; - for(i = 0; i <= MAX_STORAGE_ATTACHMENTS; ++i) + string s = ""; + for(int j = 0; j <= MAX_STORAGE_ATTACHMENTS; ++j) { - if(port_string[i]) - s = strcat(s, port_string[i], "; "); - port_string[i] = string_null; // fully clear the string + if(port_string[j]) + s = strcat(s, port_string[j], "; "); + port_string[j] = string_null; // fully clear the string } return s; @@ -375,7 +380,6 @@ entity sandbox_ObjectPort_Load(entity this, string s, float database) void sandbox_Database_Save() { // saves all objects to the database file - entity head; string file_name; float file_get; @@ -384,15 +388,11 @@ void sandbox_Database_Save() fputs(file_get, strcat("// sandbox storage \"", autocvar_g_sandbox_storage_name, "\" for map \"", GetMapname(), "\" last updated ", strftime(true, "%d-%m-%Y %H:%M:%S"))); fputs(file_get, strcat(" containing ", ftos(object_count), " objects\n")); - for(head = NULL; (head = find(head, classname, "object")); ) + IL_EACH(g_sandbox_objects, !it.owner, // attached objects are persisted separately, ignore them here { - // attached objects are persisted separately, ignore them here - if(head.owner != NULL) - continue; - // use a line of text for each object, listing all properties - fputs(file_get, strcat(sandbox_ObjectPort_Save(head, true), "\n")); - } + fputs(file_get, strcat(sandbox_ObjectPort_Save(it, true), "\n")); + }); fclose(file_get); } @@ -407,7 +407,7 @@ void sandbox_Database_Load() if(file_get < 0) { if(autocvar_g_sandbox_info > 0) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7could not find storage file ^3", file_name, "^7, no objects were loaded\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7could not find storage file ^3", file_name, "^7, no objects were loaded"); } else { @@ -432,7 +432,7 @@ void sandbox_Database_Load() } } if(autocvar_g_sandbox_info > 0) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7successfully loaded storage file ^3", file_name, "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7successfully loaded storage file ^3", file_name); } fclose(file_get); } @@ -524,7 +524,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) _setmodel(e, argv(2)); if(autocvar_g_sandbox_info > 0) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7", player.netname, " spawned an object at origin ^3", vtos(e.origin), "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7", player.netname, " spawned an object at origin ^3", vtos(e.origin)); return true; // ---------------- COMMAND: OBJECT, REMOVE ---------------- @@ -533,7 +533,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) if(e != NULL) { if(autocvar_g_sandbox_info > 0) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7", player.netname, " removed an object at origin ^3", vtos(e.origin), "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7", player.netname, " removed an object at origin ^3", vtos(e.origin)); sandbox_ObjectRemove(e); return true; } @@ -582,7 +582,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) print_to(player, "^2SANDBOX - INFO: ^7Object pasted successfully"); if(autocvar_g_sandbox_info > 0) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7", player.netname, " pasted an object at origin ^3", vtos(e.origin), "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7", player.netname, " pasted an object at origin ^3", vtos(e.origin)); return true; } return true; @@ -617,7 +617,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) player.object_attach = NULL; // object was attached, no longer keep it scheduled for attachment print_to(player, "^2SANDBOX - INFO: ^7Object attached successfully"); if(autocvar_g_sandbox_info > 1) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7", player.netname, " attached objects at origin ^3", vtos(e.origin), "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7", player.netname, " attached objects at origin ^3", vtos(e.origin)); return true; } print_to(player, "^1SANDBOX - WARNING: ^7Object could not be attached to the parent. Make sure you are facing an object that you have edit rights over"); @@ -630,7 +630,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) sandbox_ObjectAttach_Remove(e); print_to(player, "^2SANDBOX - INFO: ^7Child objects detached successfully"); if(autocvar_g_sandbox_info > 1) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7", player.netname, " detached objects at origin ^3", vtos(e.origin), "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7", player.netname, " detached objects at origin ^3", vtos(e.origin)); return true; } print_to(player, "^1SANDBOX - WARNING: ^7Child objects could not be detached. Make sure you are facing an object that you have edit rights over"); @@ -721,7 +721,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) e.message2 = strzone(strftime(true, "%d-%m-%Y %H:%M:%S")); if(autocvar_g_sandbox_info > 1) - LOG_INFO(strcat("^3SANDBOX - SERVER: ^7", player.netname, " edited property ^3", argv(2), " ^7of an object at origin ^3", vtos(e.origin), "\n")); + LOG_INFO("^3SANDBOX - SERVER: ^7", player.netname, " edited property ^3", argv(2), " ^7of an object at origin ^3", vtos(e.origin)); return true; } @@ -784,10 +784,8 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand) // this should show the same info as 'mesh' but for attachments s = ""; j = 0; - FOREACH_ENTITY_ENT(owner, e, + IL_EACH(g_sandbox_objects, it.owner == e, { - if(it.classname != "object") continue; - ++j; // start from 1 gettaginfo(e, it.tag_index); s = strcat(s, "^1attachment ", ftos(j), "^7 has mesh \"^3", it.model, "^7\" at animation frame ^3", ftos(it.frame));