]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mutators/mutator/sandbox/sandbox.qc
Cleanup server mutators: remove IMPLEMENTATION macro
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / sandbox / sandbox.qc
index 22127ad31f8680b6a51120dcca30129452eb214d..577e29c6b07c21b497a1b93391cdade5525e280e 100644 (file)
@@ -34,7 +34,7 @@ float object_count;
 .string material;
 
 .float touch_timer;
-void sandbox_ObjectFunction_Touch(entity this)
+void sandbox_ObjectFunction_Touch(entity this, entity toucher)
 {
        // apply material impact effects
 
@@ -46,7 +46,7 @@ void sandbox_ObjectFunction_Touch(entity this)
 
        // make particle count and sound volume depend on impact speed
        float intensity;
-       intensity = vlen(this.velocity) + vlen(other.velocity);
+       intensity = vlen(this.velocity) + vlen(toucher.velocity);
        if(intensity) // avoid divisions by 0
                intensity /= 2; // average the two velocities
        if (!(intensity >= autocvar_g_sandbox_object_material_velocity_min))
@@ -80,7 +80,7 @@ void sandbox_ObjectFunction_Think(entity this)
                        this.realowner = it;
                        break;
                }
-               this.realowner = world;
+               this.realowner = NULL;
        ));
 
        this.nextthink = time;
@@ -91,22 +91,22 @@ void sandbox_ObjectFunction_Think(entity this)
 .float old_solid, old_movetype;
 entity sandbox_ObjectEdit_Get(entity this, float permissions)
 {
-       // Returns the traced entity if the player can edit it, and world if not.
+       // Returns the traced entity if the player can edit it, and NULL if not.
        // If permissions if false, the object is returned regardless of editing rights.
        // Attached objects are SOLID_NOT and do not get traced.
 
        crosshair_trace_plusvisibletriggers(this);
        if(vdist(this.origin - trace_ent.origin, >, autocvar_g_sandbox_editor_distance_edit))
-               return world; // out of trace range
+               return NULL; // out of trace range
        if(trace_ent.classname != "object")
-               return world; // entity is not an object
+               return NULL; // entity is not an object
        if(!permissions)
                return trace_ent; // don't check permissions, anyone can edit this object
        if(trace_ent.crypto_idfp == "")
                return trace_ent; // the player who spawned this object did not have an UID, so anyone can edit it
        if (!(trace_ent.realowner != this && autocvar_g_sandbox_editor_free < 2))
                return trace_ent; // object does not belong to the player, and players can only edit their own objects on this server
-       return world;
+       return NULL;
 }
 
 void sandbox_ObjectEdit_Scale(entity e, float f)
@@ -129,8 +129,8 @@ void sandbox_ObjectAttach_Set(entity e, entity parent, string s)
        sandbox_ObjectAttach_Remove(e);
 
        e.old_solid = e.solid; // persist solidity
-       e.old_movetype = e.movetype; // persist physics
-       e.movetype = MOVETYPE_FOLLOW;
+       e.old_movetype = e.move_movetype; // persist physics
+       set_movetype(e, MOVETYPE_FOLLOW);
        e.solid = SOLID_NOT;
        e.takedamage = DAMAGE_NO;
 
@@ -142,25 +142,23 @@ void sandbox_ObjectAttach_Remove(entity e)
 {
        // detaches any object attached to e
 
-       entity head;
-       for(head = world; (head = find(head, classname, "object")); )
+       FOREACH_ENTITY_ENT(owner, e,
        {
-               if(head.owner == e)
-               {
-                       vector org;
-                       org = gettaginfo(head, 0);
-                       setattachment(head, world, "");
-                       head.owner = world;
-
-                       // objects change origin and angles when detached, so apply previous position
-                       setorigin(head, org);
-                       head.angles = e.angles; // don't allow detached objects to spin or roll
-
-                       head.solid = head.old_solid; // restore persisted solidity
-                       head.movetype = head.old_movetype; // restore persisted physics
-                       head.takedamage = DAMAGE_AIM;
-               }
-       }
+               if(it.classname != "object") continue;
+
+               vector org;
+               org = gettaginfo(it, 0);
+               setattachment(it, NULL, "");
+               it.owner = NULL;
+
+               // objects change origin and angles when detached, so apply previous position
+               setorigin(it, org);
+               it.angles = e.angles; // don't allow detached objects to spin or roll
+
+               it.solid = it.old_solid; // restore persisted solidity
+               set_movetype(it, it.old_movetype); // restore persisted physics
+               it.takedamage = DAMAGE_AIM;
+       });
 }
 
 entity sandbox_ObjectSpawn(entity this, float database)
@@ -171,7 +169,7 @@ entity sandbox_ObjectSpawn(entity this, float database)
        e.takedamage = DAMAGE_AIM;
        e.damageforcescale = 1;
        e.solid = SOLID_BBOX; // SOLID_BSP would be best, but can lag the server badly
-       e.movetype = MOVETYPE_TOSS;
+       set_movetype(e, MOVETYPE_TOSS);
        e.frame = 0;
        e.skin = 0;
        e.material = string_null;
@@ -212,15 +210,15 @@ 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 = world));
+       FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && it.object_attach == e, LAMBDA(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;    }
        if(e.netname)   {       strunzone(e.netname);   e.netname = string_null;        }
        if(e.message)   {       strunzone(e.message);   e.message = string_null;        }
        if(e.message2)  {       strunzone(e.message2);  e.message2 = string_null;       }
-       remove(e);
-       e = world;
+       delete(e);
+       e = NULL;
 
        object_count -= 1;
 }
@@ -234,7 +232,7 @@ string sandbox_ObjectPort_Save(entity e, float database)
        string s;
        entity head;
 
-       for(head = world; (head = find(head, classname, "object")); )
+       for(head = NULL; (head = find(head, classname, "object")); )
        {
                // the main object needs to be first in the array [0] with attached objects following
                float slot, physics, solidity;
@@ -242,7 +240,7 @@ string sandbox_ObjectPort_Save(entity e, float database)
                {
                        slot = 0;
                        solidity = head.solid; // applied solidity is normal solidity for children
-                       physics = head.movetype; // applied physics are normal physics for parents
+                       physics = head.move_movetype; // applied physics are normal physics for parents
                }
                else if(head.owner == e) // child object, list them in order
                {
@@ -308,7 +306,7 @@ entity sandbox_ObjectPort_Load(entity this, string s, float database)
 {
        // load object properties, and spawn a new object with them
        float n, i;
-       entity e = world, parent = world;
+       entity e = NULL, parent = NULL;
 
        // separate objects between the ; symbols
        n = tokenizebyseparator(s, "; ");
@@ -349,7 +347,8 @@ entity sandbox_ObjectPort_Load(entity this, string s, float database)
                e.frame = stof(argv(argv_num)); ++argv_num;
                sandbox_ObjectEdit_Scale(e, stof(argv(argv_num)));      ++argv_num;
                e.solid = e.old_solid = stof(argv(argv_num));   ++argv_num;
-               e.movetype = e.old_movetype = stof(argv(argv_num));     ++argv_num;
+               e.old_movetype = stof(argv(argv_num));  ++argv_num;
+               set_movetype(e, e.old_movetype);
                e.damageforcescale = stof(argv(argv_num));      ++argv_num;
                if(e.material)  strunzone(e.material);  if(argv(argv_num) != "")        e.material = strzone(argv(argv_num));   else    e.material = string_null;       ++argv_num;
                if(database)
@@ -384,10 +383,10 @@ 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 = world; (head = find(head, classname, "object")); )
+       for(head = NULL; (head = find(head, classname, "object")); )
        {
                // attached objects are persisted separately, ignore them here
-               if(head.owner != world)
+               if(head.owner != NULL)
                        continue;
 
                // use a line of text for each object, listing all properties
@@ -462,7 +461,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                switch(argv(1))
                {
                        entity e;
-                       float i;
+                       int j;
                        string s;
 
                        // ---------------- COMMAND: HELP ----------------
@@ -530,7 +529,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                        // ---------------- COMMAND: OBJECT, REMOVE ----------------
                        case "object_remove":
                                e = sandbox_ObjectEdit_Get(player, true);
-                               if(e != world)
+                               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"));
@@ -548,7 +547,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                        case "copy":
                                                // copies customizable properties of the selected object to the clipboard cvar
                                                e = sandbox_ObjectEdit_Get(player, autocvar_g_sandbox_editor_free); // can we copy objects we can't edit?
-                                               if(e != world)
+                                               if(e != NULL)
                                                {
                                                        s = sandbox_ObjectPort_Save(e, false);
                                                        s = strreplace("\"", "\\\"", s);
@@ -594,7 +593,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                        case "get":
                                                // select e as the object as meant to be attached
                                                e = sandbox_ObjectEdit_Get(player, true);
-                                               if(e != world)
+                                               if(e != NULL)
                                                {
                                                        player.object_attach = e;
                                                        print_to(player, "^2SANDBOX - INFO: ^7Object selected for attachment");
@@ -603,7 +602,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                                print_to(player, "^1SANDBOX - WARNING: ^7Object could not be selected for attachment. Make sure you are facing an object that you have edit rights over");
                                                return true;
                                        case "set":
-                                               if(player.object_attach == world)
+                                               if(player.object_attach == NULL)
                                                {
                                                        print_to(player, "^1SANDBOX - WARNING: ^7No object selected for attachment. Please select an object to be attached first.");
                                                        return true;
@@ -611,10 +610,10 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
 
                                                // attaches the previously selected object to e
                                                e = sandbox_ObjectEdit_Get(player, true);
-                                               if(e != world)
+                                               if(e != NULL)
                                                {
                                                        sandbox_ObjectAttach_Set(player.object_attach, e, argv(3));
-                                                       player.object_attach = world; // object was attached, no longer keep it scheduled for attachment
+                                                       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"));
@@ -625,7 +624,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                        case "remove":
                                                // removes e if it was attached
                                                e = sandbox_ObjectEdit_Get(player, true);
-                                               if(e != world)
+                                               if(e != NULL)
                                                {
                                                        sandbox_ObjectAttach_Remove(e);
                                                        print_to(player, "^2SANDBOX - INFO: ^7Child objects detached successfully");
@@ -647,7 +646,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                }
 
                                e = sandbox_ObjectEdit_Get(player, true);
-                               if(e != world)
+                               if(e != NULL)
                                {
                                        switch(argv(2))
                                        {
@@ -685,13 +684,13 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                                        switch(argv(3))
                                                        {
                                                                case "0": // static
-                                                                       e.movetype = MOVETYPE_NONE;
+                                                                       set_movetype(e, MOVETYPE_NONE);
                                                                        break;
                                                                case "1": // movable
-                                                                       e.movetype = MOVETYPE_TOSS;
+                                                                       set_movetype(e, MOVETYPE_TOSS);
                                                                        break;
                                                                case "2": // physical
-                                                                       e.movetype = MOVETYPE_PHYSICS;
+                                                                       set_movetype(e, MOVETYPE_PHYSICS);
                                                                        break;
                                                                default:
                                                                        break;
@@ -704,8 +703,8 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                                        if(e.material)  strunzone(e.material);
                                                        if(argv(3))
                                                        {
-                                                               for (i = 1; i <= 5; i++) // precache material sounds, 5 in total
-                                                                       precache_sound(strcat("object/impact_", argv(3), "_", ftos(i), ".wav"));
+                                                               for (j = 1; j <= 5; j++) // precache material sounds, 5 in total
+                                                                       precache_sound(strcat("object/impact_", argv(3), "_", ftos(j), ".wav"));
                                                                e.material = strzone(argv(3));
                                                        }
                                                        else
@@ -737,7 +736,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                        return true;
                                }
                                e = sandbox_ObjectEdit_Get(player, true);
-                               if(e != world)
+                               if(e != NULL)
                                {
                                        // update the owner's name
                                        // Do this before checking if you're already the owner and skipping if such, so we
@@ -767,7 +766,7 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                        case "object_info":
                                // prints public information about the object to the player
                                e = sandbox_ObjectEdit_Get(player, false);
-                               if(e != world)
+                               if(e != NULL)
                                {
                                        switch(argv(2))
                                        {
@@ -783,20 +782,18 @@ MUTATOR_HOOKFUNCTION(sandbox, SV_ParseClientCommand)
                                                case "attachments":
                                                        // this should show the same info as 'mesh' but for attachments
                                                        s = "";
-                                                       entity head;
-                                                       i = 0;
-                                                       for(head = world; (head = find(head, classname, "object")); )
+                                                       j = 0;
+                                                       FOREACH_ENTITY_ENT(owner, e,
                                                        {
-                                                               if(head.owner == e)
-                                                               {
-                                                                       ++i; // start from 1
-                                                                       gettaginfo(e, head.tag_index);
-                                                                       s = strcat(s, "^1attachment ", ftos(i), "^7 has mesh \"^3", head.model, "^7\" at animation frame ^3", ftos(head.frame));
-                                                                       s = strcat(s, "^7 and is attached to bone \"^5", gettaginfo_name, "^7\", ");
-                                                               }
-                                                       }
-                                                       if(i) // object contains attachments
-                                                               print_to(player, strcat("^2SANDBOX - INFO: ^7Object contains the following ^1", ftos(i), "^7 attachment(s): ", s));
+                                                               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));
+                                                               s = strcat(s, "^7 and is attached to bone \"^5", gettaginfo_name, "^7\", ");
+                                                       });
+                                                       if(j) // object contains attachments
+                                                               print_to(player, strcat("^2SANDBOX - INFO: ^7Object contains the following ^1", ftos(j), "^7 attachment(s): ", s));
                                                        else
                                                                print_to(player, "^2SANDBOX - INFO: ^7Object contains no attachments");
                                                        return true;