#include "scripting.qh"
+#include <server/defs.qh>
+#include <server/miscfunctions.qh>
+#include <server/weapons/selection.qh>
+#include <server/weapons/weaponsystem.qh>
#include "cvars.qh"
#include <common/state.qh>
+#include <common/gamemodes/gamemode/ctf/sv_ctf.qh>
#include <common/physics/player.qh>
#include <common/wepent.qh>
}
e = find(NULL, targetname, s);
if(!e)
- LOG_INFO("invalid place ", s, "\n");
+ LOG_INFO("invalid place ", s);
if(i < MAX_BOT_PLACES)
{
this.(bot_placenames[i]) = strzone(placename);
{
e = find(NULL, targetname, placename);
if(!e)
- LOG_INFO("invalid place ", placename, "\n");
+ LOG_INFO("invalid place ", placename);
return e;
}
}
if(cmd_parm_type!=BOT_CMD_PARAMETER_NONE&&parm=="")
{
- LOG_INFO("ERROR: A parameter is required for this command\n");
+ LOG_INFO("ERROR: A parameter is required for this command");
return 0;
}
bot_cmd.bot_cmd_parm_float = stof(parm);
break;
case BOT_CMD_PARAMETER_STRING:
- if(bot_cmd.bot_cmd_parm_string)
- strunzone(bot_cmd.bot_cmd_parm_string);
- bot_cmd.bot_cmd_parm_string = strzone(parm);
+ strcpy(bot_cmd.bot_cmd_parm_string, parm);
break;
case BOT_CMD_PARAMETER_VECTOR:
if(substring(parm, 0, 1) != "\'")
{
- LOG_INFOF("ERROR: expected vector type \'x y z\', got %s\n", parm);
+ LOG_INFOF("ERROR: expected vector type \'x y z\', got %s", parm);
return 0;
}
bot_cmd.bot_cmd_parm_vector = stov(parm);
}
return 1;
}
- LOG_INFO("ERROR: No such command '", cmdstring, "'\n");
+ LOG_INFO("ERROR: No such command '", cmdstring, "'");
return 0;
}
break;
}
- LOG_INFO(strcat("Command: ",bot_cmd_string[i],"\nParameter: <",stype,"> \n"));
-
- LOG_INFO("Description: ");
+ string desc = "";
switch(i)
{
case BOT_CMD_PAUSE:
- LOG_INFO("Stops the bot completely. Any command other than 'continue' will be ignored.");
+ desc = "Stops the bot completely. Any command other than 'continue' will be ignored.";
break;
case BOT_CMD_CONTINUE:
- LOG_INFO("Disable paused status");
+ desc = "Disable paused status";
break;
case BOT_CMD_WAIT:
- LOG_INFO("Pause command parsing and bot ai for N seconds. Pressed key will remain pressed");
+ desc = "Pause command parsing and bot ai for N seconds. Pressed key will remain pressed";
break;
case BOT_CMD_WAIT_UNTIL:
- LOG_INFO("Pause command parsing and bot ai until time is N from the last barrier. Pressed key will remain pressed");
+ desc = "Pause command parsing and bot ai until time is N from the last barrier. Pressed key will remain pressed";
break;
case BOT_CMD_BARRIER:
- LOG_INFO("Waits till all bots that have a command queue reach this command. Pressed key will remain pressed");
+ desc = "Waits till all bots that have a command queue reach this command. Pressed key will remain pressed";
break;
case BOT_CMD_TURN:
- LOG_INFO("Look to the right or left N degrees. For turning to the left use positive numbers.");
+ desc = "Look to the right or left N degrees. For turning to the left use positive numbers.";
break;
case BOT_CMD_MOVETO:
- LOG_INFO("Walk to an specific coordinate on the map. Usage: moveto \'x y z\'");
+ desc = "Walk to an specific coordinate on the map. Usage: moveto \'x y z\'";
break;
case BOT_CMD_MOVETOTARGET:
- LOG_INFO("Walk to the specific target on the map");
+ desc = "Walk to the specific target on the map";
break;
case BOT_CMD_RESETGOAL:
- LOG_INFO("Resets the goal stack");
+ desc = "Resets the goal stack";
break;
case BOT_CMD_CC:
- LOG_INFO("Execute client command. Examples: cc \"say something\"; cc god; cc \"name newnickname\"; cc kill;");
+ desc = "Execute client command. Examples: cc \"say something\"; cc god; cc \"name newnickname\"; cc kill;";
break;
case BOT_CMD_IF:
- LOG_INFO("Perform simple conditional execution.\n");
- LOG_INFO("Syntax: \n");
- LOG_INFO(" sv_cmd .. if \"condition\"\n");
- LOG_INFO(" sv_cmd .. <instruction if true>\n");
- LOG_INFO(" sv_cmd .. <instruction if true>\n");
- LOG_INFO(" sv_cmd .. else\n");
- LOG_INFO(" sv_cmd .. <instruction if false>\n");
- LOG_INFO(" sv_cmd .. <instruction if false>\n");
- LOG_INFO(" sv_cmd .. fi\n");
- LOG_INFO("Conditions: a=b, a>b, a<b, a\t\t(spaces not allowed)\n");
- LOG_INFO(" Values in conditions can be numbers, cvars in the form cvar.cvar_string or special fields\n");
- LOG_INFO("Fields: health, speed, flagcarrier\n");
- LOG_INFO("Examples: if health>50; if health>cvar.g_balance_laser_primary_damage; if flagcarrier;");
+ desc = "Perform simple conditional execution.\n"
+ "Syntax: \n"
+ " sv_cmd .. if \"condition\"\n"
+ " sv_cmd .. <instruction if true>\n"
+ " sv_cmd .. <instruction if true>\n"
+ " sv_cmd .. else\n"
+ " sv_cmd .. <instruction if false>\n"
+ " sv_cmd .. <instruction if false>\n"
+ " sv_cmd .. fi\n"
+ "Conditions: a=b, a>b, a<b, a\t\t(spaces not allowed)\n"
+ " Values in conditions can be numbers, cvars in the form cvar.cvar_string or special fields\n"
+ "Fields: health, speed, flagcarrier\n"
+ "Examples: if health>50; if health>cvar.g_balance_laser_primary_damage; if flagcarrier;";
break;
case BOT_CMD_RESETAIM:
- LOG_INFO("Points the aim to the coordinates x,y 0,0");
+ desc = "Points the aim to the coordinates x,y 0,0";
break;
case BOT_CMD_AIM:
- LOG_INFO("Move the aim x/y (horizontal/vertical) degrees relatives to the bot\n");
- LOG_INFO("There is a 3rd optional parameter telling in how many seconds the aim has to reach the new position\n");
- LOG_INFO("Examples: aim \"90 0\" // Turn 90 degrees inmediately (positive numbers move to the left/up)\n");
- LOG_INFO(" aim \"0 90 2\" // Will gradually look to the sky in the next two seconds");
+ desc = "Move the aim x/y (horizontal/vertical) degrees relatives to the bot\n"
+ "There is a 3rd optional parameter telling in how many seconds the aim has to reach the new position\n"
+ "Examples: aim \"90 0\" // Turn 90 degrees inmediately (positive numbers move to the left/up)\n"
+ " aim \"0 90 2\" // Will gradually look to the sky in the next two seconds";
break;
case BOT_CMD_AIMTARGET:
- LOG_INFO("Points the aim to given target");
+ desc = "Points the aim to given target";
break;
case BOT_CMD_PRESSKEY:
- LOG_INFO("Press one of the following keys: forward, backward, left, right, jump, crouch, attack1, attack2, use\n");
- LOG_INFO("Multiple keys can be pressed at time (with many presskey calls) and it will remain pressed until the command \"releasekey\" is called");
- LOG_INFO("Note: The script will not return the control to the bot ai until all keys are released");
+ desc = "Press one of the following keys: forward, backward, left, right, jump, crouch, attack1, attack2, use"
+ "Multiple keys can be pressed at time (with many presskey calls) and it will remain pressed until the command \"releasekey\" is called"
+ "Note: The script will not return the control to the bot ai until all keys are released";
break;
case BOT_CMD_RELEASEKEY:
- LOG_INFO("Release previoulsy used keys. Use the parameter \"all\" to release all keys");
+ desc = "Release previoulsy used keys. Use the parameter \"all\" to release all keys";
break;
case BOT_CMD_SOUND:
- LOG_INFO("play sound file at bot location");
+ desc = "play sound file at bot location";
break;
case BOT_CMD_DEBUG_ASSERT_CANFIRE:
- LOG_INFO("verify the state of the weapon entity");
+ desc = "verify the state of the weapon entity";
break;
default:
- LOG_INFO("This command has no description yet.");
+ desc = "This command has no description yet.";
break;
}
- LOG_INFO("\n");
+ LOG_HELP("Command: ", bot_cmd_string[i], "\nParameter: <", stype, ">", "\nDescription: ", desc);
}
}
if(!bot_cmds_initialized)
bot_commands_init();
- LOG_INFO("List of all available commands:\n");
- LOG_INFO(" Command - Parameter Type\n");
+ LOG_INFO(
+ "List of all available commands:\n"
+ " Command - Parameter Type\n"
+ );
for(i=1;i<BOT_CMD_COUNTER;++i)
{
ptype = "none";
break;
}
- LOG_INFO(strcat(" ",bot_cmd_string[i]," - <",ptype,"> \n"));
+ LOG_INFO(" ", bot_cmd_string[i]," - <", ptype, ">");
}
}
if(this.bot_barrier == 1) // find other bots
{
- FOREACH_CLIENT(it.isbot, LAMBDA(
+ FOREACH_CLIENT(it.isbot, {
if(it.bot_cmdqueuebuf_allocated)
if(it.bot_barrier != 1)
return CMD_STATUS_EXECUTING; // not all are at the barrier yet
- ));
+ });
// all bots hit the barrier!
// acknowledge barrier
- FOREACH_CLIENT(it.isbot, LAMBDA(it.bot_barrier = 2));
+ FOREACH_CLIENT(it.isbot, { it.bot_barrier = 2; });
bot_barriertime = time;
}
if(this.(weaponentity).m_weapon == WEP_Null && slot != 0)
continue;
- if(client_hasweapon(this, Weapons_from(id), weaponentity, true, false))
+ if(client_hasweapon(this, REGISTRY_GET(Weapons, id), weaponentity, true, false))
{
success = true;
- this.(weaponentity).m_switchweapon = Weapons_from(id);
+ this.(weaponentity).m_switchweapon = REGISTRY_GET(Weapons, id);
}
}
return cvar(substring(expr, 5, strlen(expr)));
// Search for fields
+ // TODO: expand with support for more fields (key carrier, ball carrier, armor etc)
switch(expr)
{
case "health":
- return this.health;
+ return GetResource(this, RES_HEALTH);
case "speed":
return vlen(this.velocity);
case "flagcarrier":
return ((this.flagcarried!=NULL));
}
- LOG_INFO(strcat("ERROR: Unable to convert the expression '",expr,"' into a numeric value\n"));
+ LOG_INFO("ERROR: Unable to convert the expression '", expr, "' into a numeric value");
return 0;
}
if(f)
{
this.colormod = '0 8 8';
- LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by weaponentity state\n");
+ LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by weaponentity state");
}
}
- else if(ATTACK_FINISHED(this, slot) > time)
+ else if(ATTACK_FINISHED(this, weaponentity) > time)
{
if(f)
{
this.colormod = '8 0 8';
- LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by ATTACK_FINISHED (", ftos(ATTACK_FINISHED(this, slot) - time), " seconds left)\n");
+ LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, inhibited by ATTACK_FINISHED (", ftos(ATTACK_FINISHED(this, weaponentity) - time), " seconds left)");
}
}
else if(this.(weaponentity).tuba_note)
if(f)
{
this.colormod = '8 0 0';
- LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, bot still has an active tuba note\n");
+ LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " wants to fire, bot still has an active tuba note");
}
}
else
if(!f)
{
this.colormod = '8 8 0';
- LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " thinks it has fired, but apparently did not; ATTACK_FINISHED says ", ftos(ATTACK_FINISHED(this, slot) - time), " seconds left\n");
+ LOG_INFO("Bot ", this.netname, " using ", this.(weaponentity).weaponname, " thinks it has fired, but apparently did not; ATTACK_FINISHED says ", ftos(ATTACK_FINISHED(this, weaponentity) - time), " seconds left");
}
}
void bot_resetqueues()
{
- FOREACH_CLIENT(it.isbot, LAMBDA(
+ FOREACH_CLIENT(it.isbot, {
it.bot_cmd_execution_index = 0;
bot_clearqueue(it);
// also, cancel all barriers
it.bot_barrier = 0;
for(int i = 0; i < it.bot_places_count; ++i)
{
- strunzone(it.(bot_placenames[i]));
- it.(bot_placenames[i]) = string_null;
+ strfree(it.(bot_placenames[i]));
}
it.bot_places_count = 0;
- ));
+ });
bot_barriertime = time;
}
if(bot_cmd.bot_cmd_type!=BOT_CMD_NULL)
{
bot_command_executed(this, true);
- LOG_INFO( "WARNING: Commands are ignored while the bot is paused. Use the command 'continue' instead.\n");
+ LOG_INFO("WARNING: Commands are ignored while the bot is paused. Use the command 'continue' instead.");
}
return 1;
}
// Handle conditions
if (!(bot_cmd.bot_cmd_type==BOT_CMD_FI||bot_cmd.bot_cmd_type==BOT_CMD_ELSE))
- if(this.bot_cmd_condition_status & CMD_CONDITION_true && this.bot_cmd_condition_status & CMD_CONDITION_false_BLOCK)
+ if((this.bot_cmd_condition_status & CMD_CONDITION_true) && this.bot_cmd_condition_status & CMD_CONDITION_false_BLOCK)
{
bot_command_executed(this, true);
return -1;
}
- else if(this.bot_cmd_condition_status & CMD_CONDITION_false && this.bot_cmd_condition_status & CMD_CONDITION_true_BLOCK)
+ else if((this.bot_cmd_condition_status & CMD_CONDITION_false) && this.bot_cmd_condition_status & CMD_CONDITION_true_BLOCK)
{
bot_command_executed(this, true);
return -1;
status = bot_cmd_debug_assert_canfire(this);
break;
default:
- LOG_INFO(strcat("ERROR: Invalid command on queue with id '",ftos(bot_cmd.bot_cmd_type),"'\n"));
+ LOG_INFOF("ERROR: Invalid command on queue with id '%s'", ftos(bot_cmd.bot_cmd_type));
return 0;
}
if (status==CMD_STATUS_ERROR)
- LOG_INFO(strcat("ERROR: The command '",bot_cmd_string[bot_cmd.bot_cmd_type],"' returned an error status\n"));
+ LOG_INFOF("ERROR: The command '%s' returned an error status", bot_cmd_string[bot_cmd.bot_cmd_type]);
// Move execution pointer
if(status==CMD_STATUS_EXECUTING)