]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/gamecommand.qc
effectindexdump added
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / gamecommand.qc
index 007a74a68965d79cfbff7dd14a48719e7a82abf9..8c9dc0ece1c4738233402007302cfadc39d025a8 100644 (file)
@@ -638,7 +638,7 @@ void GameCommand_adminmsg(float request, string command)
        {
                case GC_REQUEST_HELP:
                        print("  adminmsg - Send an admin message to a client directly\n");
-                       break;
+                       return;
                        
                case GC_REQUEST_COMMAND:
                        if(argc >= 3 && argc <= 4) {
@@ -671,7 +671,7 @@ void GameCommand_adminmsg(float request, string command)
                                        }
                                }
                                if(!n) { print("Client not found\n"); } 
-                               break;
+                               return;
                        } 
                        
                default:
@@ -691,11 +691,11 @@ void GameCommand_allready(float request)
        {
                case GC_REQUEST_HELP:
                        print("  allready - Restart the server and reset the players\n");
-                       break;
+                       return;
                        
                case GC_REQUEST_COMMAND:
                        ReadyRestart();
-                       break;
+                       return;
                        
                default:
                case GC_REQUEST_USAGE:
@@ -705,7 +705,7 @@ void GameCommand_allready(float request)
        }
 }
 
-void GameCommand_allspec(float request)
+void GameCommand_allspec(float request) // todo: Add ability to provide a reason string
 {
        entity client;
        float i;
@@ -713,7 +713,7 @@ void GameCommand_allspec(float request)
        {
                case GC_REQUEST_HELP:
                        print("  allspec - Force all players to spectate\n");
-                       break;
+                       return;
                        
                case GC_REQUEST_COMMAND:
                        FOR_EACH_PLAYER(client)
@@ -722,7 +722,7 @@ void GameCommand_allspec(float request)
                                ++i;
                        }
                        if(i) { bprint(strcat("Successfully forced all players to spectate (", ftos(i), ")\n")); } // should a message be added if no players were found? 
-                       break;
+                       return;
                        
                default:
                case GC_REQUEST_USAGE:
@@ -732,7 +732,7 @@ void GameCommand_allspec(float request)
        }
 }
 
-void GameCommand_anticheat(float request, string command)
+void GameCommand_anticheat(float request, string command) // FIXME: player entity is never found
 {
        entity client;
        float argc = tokenize_console(command);
@@ -742,7 +742,7 @@ void GameCommand_anticheat(float request, string command)
        {
                case GC_REQUEST_HELP:
                        print("  anticheat - Create an anticheat report for a client\n");
-                       break;
+                       return;
                        
                case GC_REQUEST_COMMAND:
                        if((entno < 1) | (entno > maxclients)) {
@@ -756,12 +756,12 @@ void GameCommand_anticheat(float request, string command)
                        }
                        self = client;
                        anticheat_report();
-                       break;
+                       return;
                        
                default:
                case GC_REQUEST_USAGE:
                        print("\nUsage: sv_cmd anticheat clientnumber\n");
-                       print("  Where clientnumber is the entity number\n");
+                       print("  where clientnumber is player entity number.\n");
                        return;
        }
 }
@@ -771,8 +771,8 @@ void GameCommand_bbox(float request)
        switch(request)
        {
                case GC_REQUEST_HELP:
-                       print("  bbox - Print large amounts of information about bboxes\n");
-                       break;
+                       print("  bbox - Print detailed information about world size\n");
+                       return;
                        
                case GC_REQUEST_COMMAND:
                        print("Original size: ", ftos(world.absmin_x), " ", ftos(world.absmin_y), " ", ftos(world.absmin_z));
@@ -848,7 +848,7 @@ void GameCommand_bbox(float request)
                                print(" ", ftos(trace_endpos_z));
                                
                        print("\n");
-                       break;
+                       return;
                        
                default:
                case GC_REQUEST_USAGE:
@@ -858,6 +858,378 @@ void GameCommand_bbox(float request)
        }
 }
 
+void GameCommand_bot_cmd(float request, string command) // what a mess... old old code.
+{
+       entity bot;
+       float argc = tokenize_console(command);
+       
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  bot_cmd - Control and send commands to bots\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       if(argv(1) == "reset")
+                       {
+                               bot_resetqueues();
+                               return;
+                       }
+                       else if(argv(1) == "load" && argc == 3)
+                       {
+                               float fh, i;
+                               string s;
+                               fh = fopen(argv(2), FILE_READ);
+                               if(fh < 0)
+                               {
+                                       print("cannot open the file\n");
+                                       return;
+                               }
+
+                               i = 0;
+                               while((s = fgets(fh)))
+                               {
+                                       argc = tokenize_console(s);
+
+                                       if(argc >= 3 && argv(0) == "sv_cmd" && argv(1) == "bot_cmd")
+                                       {
+                                               // let's start at token 2 so we can skip sv_cmd bot_cmd
+                                               bot = find_bot_by_number(stof(argv(2)));
+                                               if(bot == world)
+                                                       bot = find_bot_by_name(argv(2));
+                                               if(bot)
+                                                       bot_queuecommand(bot, strcat(argv(3), " ", argv(4)));
+                                       }
+                                       else
+                                               localcmd(strcat(s, "\n"));
+
+                                       ++i;
+                               }
+                               print(ftos(i), " commands read\n");
+                               fclose(fh);
+                               return;
+                       }
+                       else if(argv(1) == "help")
+                       {
+                               if(argv(2))
+                                       bot_cmdhelp(argv(2));
+                               else
+                                       bot_list_commands();
+                               return;
+                       }
+                       else if(argc >= 3) // this comes last
+                       {
+                               bot = find_bot_by_number(stof(argv(1)));
+                               if(bot == world)
+                                       bot = find_bot_by_name(argv(1));
+                               if(bot)
+                               {
+                                       print(strcat("Command '", (argv(2), " ", argv(3)), "' sent to bot ", bot.netname, "\n"));
+                                       bot_queuecommand(bot, strcat(argv(2), " ", argv(3)));
+                                       return;
+                               }
+                               else
+                                       print(strcat("Error: Can't find bot with the name or id '", argv(1),"' - Did you mistype the command?\n")); // don't return so that usage is shown
+                       }
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd bot_cmd client command [argument]\n");
+                       print("  'client' can be either the name or entity id of the bot\n");
+                       print("  For full list of commands, see bot_cmd help [command].\n");
+                       print("Examples: bot_cmd <id> cc \"say something\"\n");
+                       print("          bot_cmd <id> presskey jump\n");
+                       return;
+       }
+}
+
+void GameCommand_cointoss(float request) // todo: Perhaps add the ability to give your own arguments to pick between? (Like player names)
+{
+       entity client;
+       float choice = (random() > 0.5);
+       
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  cointoss - Flip a virtual coin and give random result\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       FOR_EACH_CLIENT(client)
+                               centerprint(client, strcat("^3Throwing coin... Result: ", (choice ? "^1HEADS^3!\n" : "^4TAILS^3!\n")));
+                       bprint(strcat("^3Throwing coin... Result: ", (choice ? "^1HEADS^3!\n" : "^4TAILS^3!\n")));
+                       return;
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd cointoss\n");
+                       print("  No arguments required.\n");
+                       return;
+       }
+}
+
+void GameCommand_cvar_changes(float request)
+{
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  cvar_changes - Prints a list of all changed server cvars\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       print(cvar_changes);
+                       return;
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd \n");
+                       print("  No arguments required.\n");
+                       return;
+       }
+}
+
+void GameCommand_cvar_purechanges(float request)
+{
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  cvar_purechanges - Prints a list of all changed gameplay cvars\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       print(cvar_purechanges);
+                       return;
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd cvar_purechanges\n");
+                       print("  No arguments required.\n");
+                       return;
+       }
+}
+
+void GameCommand_database(float request, string command)
+{
+       float argc = tokenize_console(command);
+       
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  database - Extra controls of the serverprogs database\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       if(argc == 3)
+                       {
+                               if(argv(1) == "save")
+                               {
+                                       db_save(ServerProgsDB, argv(2));
+                                       print(strcat("Copied serverprogs database to '", argv(2), "' in the data directory.\n"));
+                                       return;
+                               }
+                               else if(argv(1) == "dump")
+                               {
+                                       db_dump(ServerProgsDB, argv(2));
+                                       print("DB dumped.\n"); // wtf does this do?
+                                       return;
+                               }
+                               else if(argv(1) == "load")
+                               {
+                                       db_close(ServerProgsDB);
+                                       ServerProgsDB = db_load(argv(2));
+                                       print(strcat("Loaded '", argv(2), "' as new serverprogs database.\n"));
+                                       return;
+                               }
+                       }
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd database action filename\n");
+                       print("  Where action is the command to complete,\n");
+                       print("  and filename is what it acts upon.\n");
+                       print("  Full list of commands here: \"save, dump, load.\"\n");
+                       return;
+       }
+}
+
+void GameCommand_defer_clear(float request, string command)
+{
+       entity client;
+       float argc = tokenize_console(command);
+       float entno = stof(argv(1));
+       
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  defer_clear - Clear all queued defer commands for client\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       if(argc == 2)
+                       {
+                               // player_id is out of range
+                               if((entno < 1) | (entno > maxclients)) {
+                                       print("Player ", argv(1), " doesn't exist\n");
+                                       return;
+                               }
+                               client = edict_num(entno);
+                               if not(client.flags & FL_CLIENT) {
+                                       print("Player ", argv(1), " doesn't exist\n");
+                                       return;
+                               }
+                               if(clienttype(client) == CLIENTTYPE_BOT) {
+                                       print("Player ", argv(1), " (", client.netname, ") is a bot\n");
+                                       return;
+                               }
+                               stuffcmd(client, "defer clear\n");
+                               print("defer clear stuffed to ", argv(1), " (", client.netname, ")\n");
+                               return;
+                       }
+               
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd defer_clear clientnumber\n");
+                       print("  where clientnumber is player entity number.\n");
+                       return;
+       }
+}
+
+void GameCommand_defer_clear_all(float request)
+{
+       entity client;
+       float i;
+       
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  defer_clear_all - Clear all queued defer commands for all clients\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       FOR_EACH_CLIENT(client)
+                       {
+                               GameCommand_defer_clear(GC_REQUEST_COMMAND, strcat("defer_clear ", ftos(num_for_edict(client))));       
+                               ++i;
+                       }
+                       if(i) { bprint(strcat("Successfully stuffed defer clear to all clients (", ftos(i), ")\n")); } // should a message be added if no players were found? 
+                       return;
+               
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd defer_clear_all\n");
+                       print("  No arguments required.\n");
+                       return;
+       }
+}
+
+void GameCommand_delrec(float request, string command) // UNTESTED
+{
+       float argc = tokenize_console(command);
+
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  delrec - Delete race time record for a map\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       if(argv(1))
+                       {
+                               if(argv(2))
+                                       race_deleteTime(argv(2), stof(argv(1)));
+                               else
+                                       race_deleteTime(GetMapname(), stof(argv(1)));
+                               return;
+                       }
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd delrec ranking [map]\n");
+                       print("  ranking is which ranking level to clear up to, \n");
+                       print("  it will clear all records up to nth place.\n");
+                       print("  if map is not provided it will use current map.\n");
+                       return;
+       }
+}
+
+void GameCommand_effectindexdump(float request)
+{
+       float fh, d;
+       string s;
+       
+       switch(request)
+       {
+               case GC_REQUEST_HELP:
+                       print("  effectindexdump - Dump list of effects from code and effectinfo.txt\n");
+                       return;
+                       
+               case GC_REQUEST_COMMAND:
+                       d = db_create();
+                       print("begin of effects list\n");
+                       db_put(d, "TE_GUNSHOT", "1"); print("effect TE_GUNSHOT is ", ftos(particleeffectnum("TE_GUNSHOT")), "\n");
+                       db_put(d, "TE_GUNSHOTQUAD", "1"); print("effect TE_GUNSHOTQUAD is ", ftos(particleeffectnum("TE_GUNSHOTQUAD")), "\n");
+                       db_put(d, "TE_SPIKE", "1"); print("effect TE_SPIKE is ", ftos(particleeffectnum("TE_SPIKE")), "\n");
+                       db_put(d, "TE_SPIKEQUAD", "1"); print("effect TE_SPIKEQUAD is ", ftos(particleeffectnum("TE_SPIKEQUAD")), "\n");
+                       db_put(d, "TE_SUPERSPIKE", "1"); print("effect TE_SUPERSPIKE is ", ftos(particleeffectnum("TE_SUPERSPIKE")), "\n");
+                       db_put(d, "TE_SUPERSPIKEQUAD", "1"); print("effect TE_SUPERSPIKEQUAD is ", ftos(particleeffectnum("TE_SUPERSPIKEQUAD")), "\n");
+                       db_put(d, "TE_WIZSPIKE", "1"); print("effect TE_WIZSPIKE is ", ftos(particleeffectnum("TE_WIZSPIKE")), "\n");
+                       db_put(d, "TE_KNIGHTSPIKE", "1"); print("effect TE_KNIGHTSPIKE is ", ftos(particleeffectnum("TE_KNIGHTSPIKE")), "\n");
+                       db_put(d, "TE_EXPLOSION", "1"); print("effect TE_EXPLOSION is ", ftos(particleeffectnum("TE_EXPLOSION")), "\n");
+                       db_put(d, "TE_EXPLOSIONQUAD", "1"); print("effect TE_EXPLOSIONQUAD is ", ftos(particleeffectnum("TE_EXPLOSIONQUAD")), "\n");
+                       db_put(d, "TE_TAREXPLOSION", "1"); print("effect TE_TAREXPLOSION is ", ftos(particleeffectnum("TE_TAREXPLOSION")), "\n");
+                       db_put(d, "TE_TELEPORT", "1"); print("effect TE_TELEPORT is ", ftos(particleeffectnum("TE_TELEPORT")), "\n");
+                       db_put(d, "TE_LAVASPLASH", "1"); print("effect TE_LAVASPLASH is ", ftos(particleeffectnum("TE_LAVASPLASH")), "\n");
+                       db_put(d, "TE_SMALLFLASH", "1"); print("effect TE_SMALLFLASH is ", ftos(particleeffectnum("TE_SMALLFLASH")), "\n");
+                       db_put(d, "TE_FLAMEJET", "1"); print("effect TE_FLAMEJET is ", ftos(particleeffectnum("TE_FLAMEJET")), "\n");
+                       db_put(d, "EF_FLAME", "1"); print("effect EF_FLAME is ", ftos(particleeffectnum("EF_FLAME")), "\n");
+                       db_put(d, "TE_BLOOD", "1"); print("effect TE_BLOOD is ", ftos(particleeffectnum("TE_BLOOD")), "\n");
+                       db_put(d, "TE_SPARK", "1"); print("effect TE_SPARK is ", ftos(particleeffectnum("TE_SPARK")), "\n");
+                       db_put(d, "TE_PLASMABURN", "1"); print("effect TE_PLASMABURN is ", ftos(particleeffectnum("TE_PLASMABURN")), "\n");
+                       db_put(d, "TE_TEI_G3", "1"); print("effect TE_TEI_G3 is ", ftos(particleeffectnum("TE_TEI_G3")), "\n");
+                       db_put(d, "TE_TEI_SMOKE", "1"); print("effect TE_TEI_SMOKE is ", ftos(particleeffectnum("TE_TEI_SMOKE")), "\n");
+                       db_put(d, "TE_TEI_BIGEXPLOSION", "1"); print("effect TE_TEI_BIGEXPLOSION is ", ftos(particleeffectnum("TE_TEI_BIGEXPLOSION")), "\n");
+                       db_put(d, "TE_TEI_PLASMAHIT", "1"); print("effect TE_TEI_PLASMAHIT is ", ftos(particleeffectnum("TE_TEI_PLASMAHIT")), "\n");
+                       db_put(d, "EF_STARDUST", "1"); print("effect EF_STARDUST is ", ftos(particleeffectnum("EF_STARDUST")), "\n");
+                       db_put(d, "TR_ROCKET", "1"); print("effect TR_ROCKET is ", ftos(particleeffectnum("TR_ROCKET")), "\n");
+                       db_put(d, "TR_GRENADE", "1"); print("effect TR_GRENADE is ", ftos(particleeffectnum("TR_GRENADE")), "\n");
+                       db_put(d, "TR_BLOOD", "1"); print("effect TR_BLOOD is ", ftos(particleeffectnum("TR_BLOOD")), "\n");
+                       db_put(d, "TR_WIZSPIKE", "1"); print("effect TR_WIZSPIKE is ", ftos(particleeffectnum("TR_WIZSPIKE")), "\n");
+                       db_put(d, "TR_SLIGHTBLOOD", "1"); print("effect TR_SLIGHTBLOOD is ", ftos(particleeffectnum("TR_SLIGHTBLOOD")), "\n");
+                       db_put(d, "TR_KNIGHTSPIKE", "1"); print("effect TR_KNIGHTSPIKE is ", ftos(particleeffectnum("TR_KNIGHTSPIKE")), "\n");
+                       db_put(d, "TR_VORESPIKE", "1"); print("effect TR_VORESPIKE is ", ftos(particleeffectnum("TR_VORESPIKE")), "\n");
+                       db_put(d, "TR_NEHAHRASMOKE", "1"); print("effect TR_NEHAHRASMOKE is ", ftos(particleeffectnum("TR_NEHAHRASMOKE")), "\n");
+                       db_put(d, "TR_NEXUIZPLASMA", "1"); print("effect TR_NEXUIZPLASMA is ", ftos(particleeffectnum("TR_NEXUIZPLASMA")), "\n");
+                       db_put(d, "TR_GLOWTRAIL", "1"); print("effect TR_GLOWTRAIL is ", ftos(particleeffectnum("TR_GLOWTRAIL")), "\n");
+                       db_put(d, "TR_SEEKER", "1"); print("effect TR_SEEKER is ", ftos(particleeffectnum("TR_SEEKER")), "\n");
+                       db_put(d, "SVC_PARTICLE", "1"); print("effect SVC_PARTICLE is ", ftos(particleeffectnum("SVC_PARTICLE")), "\n");
+
+                       fh = fopen("effectinfo.txt", FILE_READ);
+                       while((s = fgets(fh)))
+                       {
+                               tokenize(s); // tokenize_console would hit the loop counter :(
+                               if(argv(0) == "effect")
+                               {
+                                       if(db_get(d, argv(1)) != "1")
+                                       {
+                                               if(particleeffectnum(argv(1)) >= 0)
+                                                       print("effect ", argv(1), " is ", ftos(particleeffectnum(argv(1))), "\n");
+                                               db_put(d, argv(1), "1");
+                                       }
+                               }
+                       }
+                       print("end of effects list\n");
+
+                       db_close(d);
+                       return;
+                       
+               default:
+               case GC_REQUEST_USAGE:
+                       print("\nUsage: sv_cmd effectindexdump\n");
+                       print("  No arguments required.\n");
+                       return;
+       }
+}
+
 void GameCommand(string command)
 {
        // ===== TODO list =====
@@ -876,25 +1248,30 @@ void GameCommand(string command)
        {
                if(argc == 1) 
                {
+                       // should these not recieve "command" argument? They have no use for it. 
+                       // but, what to provide instead? null string?
+                       
                        print("\nUsage: sv_cmd COMMAND..., where possible commands are:\n");
                        GameCommand_adminmsg(GC_REQUEST_HELP, command);
                        GameCommand_allready(GC_REQUEST_HELP);
                        GameCommand_allspec(GC_REQUEST_HELP);
                        GameCommand_anticheat(GC_REQUEST_HELP, command);
                        GameCommand_bbox(GC_REQUEST_HELP);
+                       GameCommand_bot_cmd(GC_REQUEST_HELP, command);
+                       GameCommand_cointoss(GC_REQUEST_HELP);
+                       GameCommand_cvar_changes(GC_REQUEST_HELP);
+                       GameCommand_cvar_purechanges(GC_REQUEST_HELP);
+                       GameCommand_database(GC_REQUEST_HELP, command);
+                       GameCommand_defer_clear(GC_REQUEST_HELP, command);
+                       GameCommand_defer_clear_all(GC_REQUEST_HELP);
+                       GameCommand_delrec(GC_REQUEST_HELP, command);
+                       GameCommand_effectindexdump(GC_REQUEST_HELP);
                        print("  teamstatus\n");
                        print("  printstats\n");
                        print("  make_mapinfo\n");
                        print("  gametype dm|ctf|...\n");
-                       print("  savedb filename\n");
-                       print("  dumpdb filename\n");
-                       print("  loaddb filename\n");
-                       print("  allready\n");
                        print("  effectindexdump\n");
                        print("  radarmap [--force] [--quit | --loop] [sharpness]\n");
-                       print("  bbox\n");
-                       print("  cvar_changes\n");
-                       print("  cvar_purechanges\n");
                        print("  find classname\n");
                        print("  extendmatchtime\n");
                        print("  reducematchtime\n");
@@ -929,6 +1306,15 @@ void GameCommand(string command)
                case "allspec": GameCommand_allspec(search_request_type); break;
                case "anticheat": GameCommand_anticheat(search_request_type, command); break;
                case "bbox": GameCommand_bbox(search_request_type); break;
+               case "bot_cmd": GameCommand_bot_cmd(search_request_type, command); break;
+               case "cointoss": GameCommand_cointoss(search_request_type); break; 
+               case "cvar_changes": GameCommand_cvar_changes(search_request_type); break; 
+               case "cvar_purechanges": GameCommand_cvar_purechanges(search_request_type); break; 
+               case "database": GameCommand_database(search_request_type, command); break;
+               case "defer_clear": GameCommand_defer_clear(search_request_type, command); break;
+               case "defer_clear_all": GameCommand_defer_clear_all(search_request_type); break;
+               case "delrec": GameCommand_delrec(search_request_type, command); break;
+               case "effectindexdump": GameCommand_effectindexdump(search_request_type); break;
                
                default:
                        print("Invalid command. For a list of supported commands, try sv_cmd help.\n");