]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/sandbox.qc
Add a maximum number of objects each player can place at a time. By default, players...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / sandbox.qc
index ff98edbf260ee42ef6997dcc9df370357f572bc8..6a9a7ed5869c1774c486a7dbad13467429eb3db3 100644 (file)
@@ -1,5 +1,6 @@
 .string object_clipboard;
 .entity object_attach;
+.float object_count;
 .float material;
 
 const float MATERIAL_NONE = 0;
@@ -74,10 +75,13 @@ void sandbox_EditObject_Scale(entity e, float f)
        }
 }
 
+.float old_movetype;
 void sandbox_AttachObject_Set(entity e, entity parent, string s)
 {
        // attaches e to parent on string s
 
+       e.old_movetype = e.movetype; // persist this
+
        e.movetype = MOVETYPE_FOLLOW;
        e.solid = SOLID_NOT;
        e.takedamage = DAMAGE_NO;
@@ -95,7 +99,7 @@ void sandbox_AttachObject_Remove(entity e)
        {
                if(head.owner == e)
                {
-                       head.movetype = MOVETYPE_TOSS;
+                       head.movetype = head.old_movetype; // revert to previous physics
                        head.solid = SOLID_BBOX;
                        head.takedamage = DAMAGE_AIM;
 
@@ -133,9 +137,19 @@ entity sandbox_SpawnObject()
        setorigin(e, trace_endpos);
        e.angles_y = self.v_angle_y;
 
+       self.object_count += 1;
+
        return e;
 }
 
+void sandbox_RemoveObject(entity e)
+{
+       remove(e);
+       e = world;
+
+       self.object_count -= 1;
+}
+
 string sandbox_Storage_Save(entity e)
 {
        // save object properties
@@ -196,6 +210,11 @@ MUTATOR_HOOKFUNCTION(sandbox_PlayerCommand)
                                print_to(self, "^7\"^2remove_object^7\" removes the object the player is looking at. Players can only remove their own objects");
                                print_to(self, "^7\"^2duplicate_object_copy^7\" copies the object the player is looking at. Players can only copy their own objects");
                                print_to(self, "^7\"^2duplicate_object_paste^7\" pastes the copied object in front of the player");
+                               print_to(self, "^7\"^2attach_object ^3property value^7\" attaches one object to another. Players can only attach their own objects");
+                               print_to(self, "^7Attachment properties for ^2attach_object^7:");
+                               print_to(self, "^3get ^7- selects the object you are facing as the object to be attached");
+                               print_to(self, "^3set value ^7- attaches the previously selected object to the object you are facing, on the specified bone");
+                               print_to(self, "^3remove ^7- detaches all objects from the object you are facing");
                                print_to(self, "^7\"^2edit_object ^3property value^7\" edits the given property of the object. Players can only edit their own objects");
                                print_to(self, "^7Object properties for ^2edit_object^7:");
                                print_to(self, "^3skin value ^7- changes the skin of the object");
@@ -242,7 +261,11 @@ MUTATOR_HOOKFUNCTION(sandbox_PlayerCommand)
 
                        // ---------------- COMMAND: SPAWN OBJECT ----------------
                        case "spawn_object":
-                               // don't allow spawning objects without a model
+                               if(self.object_count >= autocvar_g_sandbox_maxplayerobjects)
+                               {
+                                       print_to(self, strcat("WARNING: Cannot spawn any more objects. Each player may have up to ^3", ftos(autocvar_g_sandbox_maxplayerobjects), " ^7objects at a time"));
+                                       return TRUE;
+                               }
                                if(cmd_argc < 3)
                                {
                                        print_to(self, "WARNING: Attempted to spawn an object without specifying a model. Please specify the path to your model file after the 'spawn_object' command");
@@ -269,8 +292,7 @@ MUTATOR_HOOKFUNCTION(sandbox_PlayerCommand)
                                {
                                        if(autocvar_g_sandbox_info)
                                                print(strcat(self.netname, " removed an object at origin ", vtos(e.origin), "\n"));
-                                       remove(e);
-                                       e = world;
+                                       sandbox_RemoveObject(e);
                                        return TRUE;
                                }
 
@@ -304,6 +326,11 @@ MUTATOR_HOOKFUNCTION(sandbox_PlayerCommand)
                                        print_to(self, "WARNING: No object in clipboard. You must copy an object before you can paste it");
                                        return TRUE;
                                }
+                               if(self.object_count >= autocvar_g_sandbox_maxplayerobjects)
+                               {
+                                       print_to(self, strcat("WARNING: Cannot spawn any more objects. Each player may have up to ^3", ftos(autocvar_g_sandbox_maxplayerobjects), " ^7objects at a time"));
+                                       return TRUE;
+                               }
 
                                e = sandbox_SpawnObject();
                                sandbox_Storage_Load(e, self.object_clipboard);