/*************************************************
 *   RealBot AI Control Plugin  -  Version 1.0   *
 *                                               *
 *          by AnalyzeThis    7-July-02          *
 *           shootme@rochester.rr.com            *
 *                                               *
 *  Allows users with Admin rights to issue bot  *
 *  commands, without having rcon rights.        *
 *                                               *
 *  Uses vault.ini to store settings.            *
 *************************************************/
 
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
 
#define ACCESS_RB_COMMANDS  2   // allows access for any admin, assuming server default access is set to 1
#define MIN_SKILL           -1  // minimum value allowed by bot program
#define MAX_SKILL           10  // maximum value allowed by bot program
#define DEFAULT_SKILL       -1  // default setting until modified by an Admin
#define DEFAULT_MIN_SKILL   3   // default setting until modified by an Admin
#define DEFAULT_MAX_SKILL   8   // default setting until modified by an Admin
 
new rb_skill	 = DEFAULT_SKILL;       // -1 to 10, -1=Random, 0=GodLike, 10=Noob
new rb_min_skill = DEFAULT_MIN_SKILL;   // min skill when random
new rb_max_skill = DEFAULT_MAX_SKILL;   // max skill when random
 
/* readvaultnum, writevaultnum and readHLnum functions extracted from:
 *
 * settings.inc
 * Configuration Setting address helper function library
 * By Ravenous Bugblatter Beast
 * ravenousbugblatterbeast@hotmail.com
 * http://www.ravenousbugblatterbeast.pwp.blueyonder.co.uk
 *
 * No sense taking time to re-invent the wheel... Thanks RBB :)
 */
 
stock readvaultnum(name[],&output,defaultval,minimum,maximum) {
  /* Read saved setting from vault */
  new Buffer[10]="";
  get_vaultdata(name,Buffer,10);
  if (strlen(Buffer)>0) {
    output = strtonum(Buffer);
    if ((output <minimum) || (output > maximum)) {
      output = defaultval;
    }
    return 1;
  }
  return 0;
}
 
stock writevaultnum(name[],value) {
  /* write number to vault */
  new Buffer[10];
  numtostr(value,Buffer);
  set_vaultdata(name,Buffer);
  return 0;
}
 
stock readHLnum(HLData,&output,defaultval,minimum,maximum) {
  /* Read setting from halflife string */
  new Data[MAX_DATA_LENGTH];
  convert_string(HLData,Data,MAX_DATA_LENGTH);
  if (strlen(Data) > 0) {
    output = strtonum(Data);
    if ((output <minimum) || (output > maximum)) {
      output = defaultval;
    }
    return 1;
  }
  return 0;
}
 
public addtbot(HLCommand, HLData, HLUserName, UserIndex)
  {
    new rbds_cmd[MAX_DATA_LENGTH];
    new text[MAX_TEXT_LENGTH];
    new NewSkill;
 
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    if (rb_skill == -1)
      {
       NewSkill = rb_min_skill + random(rb_max_skill - rb_min_skill+1);
       if (NewSkill <  0) NewSkill = 0;
       if (NewSkill > 10) NewSkill = 10;
      }
      else NewSkill = rb_skill;
    snprintf(rbds_cmd,MAX_DATA_LENGTH,"rbds addbot_1_%i",NewSkill);
    exec(rbds_cmd);
    snprintf(text,MAX_TEXT_LENGTH,"Terrorist Bot Added - Skill %i (Default %i, Min %i, Max %i)",NewSkill,rb_skill,rb_min_skill,rb_max_skill);
    messageex(User, text, print_chat);
    return PLUGIN_HANDLED;
  }
 
public addctbot(HLCommand, HLData, HLUserName, UserIndex)
  {
    new rbds_cmd[MAX_DATA_LENGTH];
    new text[MAX_TEXT_LENGTH];
    new NewSkill;
 
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    if (rb_skill == -1)
      {
       NewSkill = rb_min_skill + random(rb_max_skill - rb_min_skill+1);
       if (NewSkill <  0) NewSkill = 0;
       if (NewSkill > 10) NewSkill = 10;
      }
      else NewSkill = rb_skill;
    snprintf(rbds_cmd,MAX_DATA_LENGTH,"rbds addbot_2_%i",NewSkill);
    exec(rbds_cmd);
    snprintf(text,MAX_TEXT_LENGTH,"Counter-Terrorist Bot Added - Skill %i (Default %i, Min %i, Max %i)",NewSkill,rb_skill,rb_min_skill,rb_max_skill);
    messageex(User, text, print_chat);
    return PLUGIN_HANDLED;
  }
 
public remtbot(HLCommand, HLData, HLUserName, UserIndex)
  {
    new rbds_cmd[MAX_DATA_LENGTH];
    new text[MAX_TEXT_LENGTH];
 
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    snprintf(rbds_cmd,MAX_DATA_LENGTH,"rbds removebot_1_1");
    exec(rbds_cmd);
    snprintf(text,MAX_TEXT_LENGTH,"Terrorist Bot Removed");
    messageex(User, text, print_chat);
    return PLUGIN_HANDLED;
  }
 
public remctbot(HLCommand, HLData, HLUserName, UserIndex)
  {
    new rbds_cmd[MAX_DATA_LENGTH];
    new text[MAX_TEXT_LENGTH];
 
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    snprintf(rbds_cmd,MAX_DATA_LENGTH,"rbds removebot_1_2");
    exec(rbds_cmd);
    snprintf(text,MAX_TEXT_LENGTH,"Counter-Terrorist Bot Removed");
    messageex(User, text, print_chat);
    return PLUGIN_HANDLED;
  }
 
public killbots(HLCommand, HLData, HLUserName, UserIndex)
  {
    new rbds_cmd[MAX_DATA_LENGTH];
    new text[MAX_TEXT_LENGTH];
 
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    snprintf(rbds_cmd,MAX_DATA_LENGTH,"rbds endround");
    exec(rbds_cmd);
    snprintf(text,MAX_TEXT_LENGTH,"All bots terminated");
    messageex(User, text, print_chat);
    return PLUGIN_HANDLED;
  }
 
public defaultskill(HLCommand, HLData, HLUserName, UserIndex)
  {
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    if (readHLnum(HLData, rb_skill, DEFAULT_SKILL, MIN_SKILL, MAX_SKILL)) {
        writevaultnum("rb_skill", rb_skill);
        new text[MAX_TEXT_LENGTH];
        snprintf(text,MAX_TEXT_LENGTH,"Default Bot Skill set to %i", rb_skill);
        messageex(User, text, print_chat);
      }
    return PLUGIN_HANDLED;
  }
 
public minskill(HLCommand, HLData, HLUserName, UserIndex)
  {
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    if (readHLnum(HLData, rb_min_skill, MIN_SKILL, MIN_SKILL, MAX_SKILL)) {
        writevaultnum("rb_min_skill", rb_min_skill);
        new text[MAX_TEXT_LENGTH];
        snprintf(text,MAX_TEXT_LENGTH,"Minimum Bot Skill set to %i", rb_min_skill);
        messageex(User, text, print_chat);
      }
    return PLUGIN_HANDLED;
  }
 
public maxskill(HLCommand, HLData, HLUserName, UserIndex)
  {
    new Command[MAX_COMMAND_LENGTH];
    new Data[MAX_DATA_LENGTH];
    new User[MAX_NAME_LENGTH];
    convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
    if (readHLnum(HLData, rb_max_skill, MAX_SKILL, MIN_SKILL, MAX_SKILL)) {
        writevaultnum("rb_max_skill", rb_max_skill);
        new text[MAX_TEXT_LENGTH];
        snprintf(text,MAX_TEXT_LENGTH,"Maximum Bot Skill set to %i", rb_max_skill);
        messageex(User, text, print_chat);
      }
    return PLUGIN_HANDLED;
  }
 
 
public plugin_init() {
  /* Register plugin & commands with adminmod */
 
  readvaultnum("rb_skill",     rb_skill,     DEFAULT_SKILL,     MIN_SKILL, MAX_SKILL);
  readvaultnum("rb_min_skill", rb_min_skill, DEFAULT_MIN_SKILL, MIN_SKILL, MAX_SKILL);
  readvaultnum("rb_max_skill", rb_max_skill, DEFAULT_MAX_SKILL, MIN_SKILL, MAX_SKILL);
 
  plugin_registerinfo("RealBot AI Command Plugin","Allows RealBot commands to be run without rcon privs","1.0");
 
  plugin_registercmd("addtbot",      "addtbot",      ACCESS_RB_COMMANDS, "addtbot: Adds a T bot with current default skill");
  plugin_registercmd("addctbot",     "addctbot",     ACCESS_RB_COMMANDS, "addctbot: Adds a CT bot with current default skill");
  plugin_registercmd("remtbot",      "remtbot",      ACCESS_RB_COMMANDS, "remtbot: Removes a T bot");
  plugin_registercmd("remctbot",     "remctbot",     ACCESS_RB_COMMANDS, "remctbot: Removes a CT bot");
  plugin_registercmd("killbots",     "killbots",     ACCESS_RB_COMMANDS, "killbots: Kills all bots");
  plugin_registercmd("defaultskill", "defaultskill", ACCESS_RB_COMMANDS, "defaultskill: Sets default bot skill (-1=random, 0 to 10=GodLike to Noob");
  plugin_registercmd("minskill",     "minskill",     ACCESS_RB_COMMANDS, "minskill: Sets low limit for random bot skill");
  plugin_registercmd("maxskill",     "maxskill",     ACCESS_RB_COMMANDS, "maxskill: Sets high limit for random bot skill");
 
//  say("plugin_realbot initialized");
 
  return PLUGIN_CONTINUE;
}