]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/bot_ai
authorterencehill <piuntn@gmail.com>
Sun, 29 Mar 2020 15:13:36 +0000 (17:13 +0200)
committerterencehill <piuntn@gmail.com>
Sun, 29 Mar 2020 15:13:36 +0000 (17:13 +0200)
1  2 
qcsrc/server/bot/default/bot.qc
xonotic-server.cfg

index ffe2e72b42c98c212b6cb696ba47d04d613e7161,4d0d4cdff2ad2a03c954fb7e56ec3e30434f94ba..7b30b62dfabbd720111f6cafad9296c231ce7a66
@@@ -104,8 -104,7 +104,8 @@@ void bot_think(entity this
  
        // clear buttons
        PHYS_INPUT_BUTTON_ATCK(this) = false;
 -      PHYS_INPUT_BUTTON_JUMP(this) = false;
 +      // keep jump button pressed for a short while, useful with ramp jumps
 +      PHYS_INPUT_BUTTON_JUMP(this) = (!IS_DEAD(this) && time < this.bot_jump_time + 0.2);
        PHYS_INPUT_BUTTON_ATCK2(this) = false;
        PHYS_INPUT_BUTTON_ZOOM(this) = false;
        PHYS_INPUT_BUTTON_CROUCH(this) = false;
  void bot_setnameandstuff(entity this)
  {
        string readfile, s;
-       float file, tokens, prio;
-       string bot_name, bot_model, bot_skin, bot_shirt, bot_pants;
-       string name, prefix, suffix;
-       if(autocvar_g_campaign)
-       {
-               prefix = "";
-               suffix = "";
-       }
-       else
-       {
-               prefix = autocvar_bot_prefix;
-               suffix = autocvar_bot_suffix;
-       }
+       int file, tokens, prio;
  
        file = fopen(autocvar_bot_config_file, FILE_READ);
  
                fclose(file);
        }
  
+       string bot_name, bot_model, bot_skin, bot_shirt, bot_pants;
        tokens = tokenizebyseparator(readfile, "\t");
        if(argv(0) != "") bot_name = argv(0);
        else bot_name = "Bot";
        setcolor(this, stof(bot_shirt) * 16 + stof(bot_pants));
        this.bot_preferredcolors = this.clientcolors;
  
-       // pick the name
-       if (autocvar_bot_usemodelnames)
-               name = bot_model;
-       else
-               name = bot_name;
+       string prefix = (autocvar_g_campaign ? "" : autocvar_bot_prefix);
+       string suffix = (autocvar_g_campaign ? "" : autocvar_bot_suffix);
+       string name = (autocvar_bot_usemodelnames ? bot_model : bot_name);
  
-       // number bots with identical names
        if (name == "")
        {
                name = ftos(etof(this));
        }
        else
        {
+               // number bots with identical names
                int j = 0;
                FOREACH_CLIENT(IS_BOT_CLIENT(it), {
                        if(it.cleanname == name)
  
  void bot_custom_weapon_priority_setup()
  {
 +      static string bot_priority_far_prev;
 +      static string bot_priority_mid_prev;
 +      static string bot_priority_close_prev;
 +      static string bot_priority_distances_prev;
        float tokens, i, w;
  
        bot_custom_weapon = false;
        if(     autocvar_bot_ai_custom_weapon_priority_far == "" ||
                autocvar_bot_ai_custom_weapon_priority_mid == "" ||
                autocvar_bot_ai_custom_weapon_priority_close == "" ||
 -              autocvar_bot_ai_custom_weapon_priority_distances == ""
 +              autocvar_bot_ai_custom_weapon_priority_distances == ""
        )
                return;
  
 -      // Parse distances
 -      tokens = tokenizebyseparator(autocvar_bot_ai_custom_weapon_priority_distances," ");
 -
 -      if (tokens!=2)
 -              return;
 -
 -      bot_distance_far = stof(argv(0));
 -      bot_distance_close = stof(argv(1));
 -
 -      if(bot_distance_far < bot_distance_close){
 -              bot_distance_far = stof(argv(1));
 -              bot_distance_close = stof(argv(0));
 -      }
 +      if (bot_priority_distances_prev != autocvar_bot_ai_custom_weapon_priority_distances)
 +      {
 +              strcpy(bot_priority_distances_prev, autocvar_bot_ai_custom_weapon_priority_distances);
 +              tokens = tokenizebyseparator(autocvar_bot_ai_custom_weapon_priority_distances," ");
  
 -      // Initialize list of weapons
 -      bot_weapons_far[0] = -1;
 -      bot_weapons_mid[0] = -1;
 -      bot_weapons_close[0] = -1;
 +              if (tokens!=2)
 +                      return;
  
 -      // Parse far distance weapon priorities
 -      tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_far)," ");
 +              bot_distance_far = stof(argv(0));
 +              bot_distance_close = stof(argv(1));
  
 -      int c = 0;
 -      for(i=0; i < tokens && c < Weapons_COUNT; ++i){
 -              w = stof(argv(i));
 -              if ( w >= WEP_FIRST && w <= WEP_LAST) {
 -                      bot_weapons_far[c] = w;
 -                      ++c;
 +              if(bot_distance_far < bot_distance_close){
 +                      bot_distance_far = stof(argv(1));
 +                      bot_distance_close = stof(argv(0));
                }
        }
 -      if(c < Weapons_COUNT)
 -              bot_weapons_far[c] = -1;
  
 -      // Parse mid distance weapon priorities
 -      tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_mid)," ");
 -
 -      c = 0;
 -      for(i=0; i < tokens && c < Weapons_COUNT; ++i){
 -              w = stof(argv(i));
 -              if ( w >= WEP_FIRST && w <= WEP_LAST) {
 -                      bot_weapons_mid[c] = w;
 -                      ++c;
 -              }
 -      }
 -      if(c < Weapons_COUNT)
 -              bot_weapons_mid[c] = -1;
 +      int c;
 +
 +      #define PARSE_WEAPON_PRIORITIES(dist) MACRO_BEGIN \
 +              if (bot_priority_##dist##_prev != autocvar_bot_ai_custom_weapon_priority_##dist) { \
 +                      strcpy(bot_priority_##dist##_prev, autocvar_bot_ai_custom_weapon_priority_##dist); \
 +                      tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_##dist)," "); \
 +                      bot_weapons_##dist[0] = -1; \
 +                      c = 0; \
 +                      for(i = 0; i < tokens && c < Weapons_COUNT; ++i) { \
 +                              w = stof(argv(i)); \
 +                              if (w >= WEP_FIRST && w <= WEP_LAST) { \
 +                                      bot_weapons_##dist[c] = w; \
 +                                      ++c; \
 +                              } \
 +                      } \
 +                      if (c < Weapons_COUNT) \
 +                              bot_weapons_##dist[c] = -1; \
 +              } \
 +      MACRO_END
  
 -      // Parse close distance weapon priorities
 -      tokens = tokenizebyseparator(W_NumberWeaponOrder(autocvar_bot_ai_custom_weapon_priority_close)," ");
 -
 -      c = 0;
 -      for(i=0; i < tokens && i < Weapons_COUNT; ++i){
 -              w = stof(argv(i));
 -              if ( w >= WEP_FIRST && w <= WEP_LAST) {
 -                      bot_weapons_close[c] = w;
 -                      ++c;
 -              }
 -      }
 -      if(c < Weapons_COUNT)
 -              bot_weapons_close[c] = -1;
 +      PARSE_WEAPON_PRIORITIES(far);
 +      PARSE_WEAPON_PRIORITIES(mid);
 +      PARSE_WEAPON_PRIORITIES(close);
  
        bot_custom_weapon = true;
  }
@@@ -845,6 -846,10 +831,6 @@@ void bot_serverframe(
        if (autocvar_g_waypointeditor_auto)
                botframe_autowaypoints();
  
 -      if(time > bot_cvar_nextthink)
 -      {
 -              if(currentbots>0)
 -                      bot_custom_weapon_priority_setup();
 -              bot_cvar_nextthink = time + 5;
 -      }
 +      if (currentbots > 0)
 +              bot_custom_weapon_priority_setup();
  }
diff --combined xonotic-server.cfg
index 1e0e4ab3885e8bc9e96d7deff303477fb541a94b,843a83d3d6132ec8356508eadd838d5cdb32f2c1..0edaf7ea4cbff865ad8db7f75e1c3b61e23cbcff
@@@ -126,8 -126,7 +126,8 @@@ set bot_typefrag 0 "Allow bots to shoo
  set bot_ai_thinkinterval 0.05 "Frame rate at which bots update their navigation and aiming, scales by skill"
  set bot_ai_strategyinterval 7 "How often a new objective is chosen"
  set bot_ai_strategyinterval_movingtarget 5.5 "How often a new objective is chosen when current objective can move"
 -set bot_ai_enemydetectioninterval 2 "How often bots pick a new target"
 +set bot_ai_enemydetectioninterval 2 "How often bots try to pick a new target if no suitable target is found"
 +set bot_ai_enemydetectioninterval_stickingtoenemy 4 "How often bots try to pick a new target while targetting an enemy"
  set bot_ai_enemydetectionradius 10000 "How far bots can see enemies"
  set bot_ai_dodgeupdateinterval 0.2 "How often scan for items to dodge. Currently not in use."
  set bot_ai_chooseweaponinterval 0.5 "How often the best weapon according to the situation will be chosen"
@@@ -153,11 -152,9 +153,11 @@@ set bot_ai_weapon_combo_threshold 0.4 "
  set bot_ai_friends_aware_pickup_radius "500" "Bots will not pickup items if a team mate is this distance near the item"
  set bot_ai_ignoregoal_timeout 3 "Ignore goals making bots to get stuck in front of a wall for N seconds"
  set bot_ai_bunnyhop_skilloffset 7 "Bots with skill equal or greater than this value will perform the \"bunnyhop\" technique"
 -set bot_ai_bunnyhop_startdistance 200 "Run to goals located further than this distance"
 -set bot_ai_bunnyhop_stopdistance 300 "Stop jumping after reaching this distance to the goal"
 -set bot_ai_bunnyhop_firstjumpdelay 0.2 "Start running to the goal only if it was seen for more than N seconds"
 +set bot_ai_bunnyhop_dir_deviation_max 20 "bunnyhop if speed - direction deviation is <= this amount"
 +set bot_ai_bunnyhop_downward_pitch_max 30 "bunnyhop if downard pitch towards the next waypoint is <= this amount"
 +set bot_ai_bunnyhop_turn_angle_max 80 "bunnyhop if next turn angle is <= this amount at walk speed (sv_maxspeed)"
 +set bot_ai_bunnyhop_turn_angle_min 4 "bunnyhop regardless of speed if next turn angle is <= this amount"
 +set bot_ai_bunnyhop_turn_angle_reduction 40 "linearly reduce max turn angle by this amount when speed increases by sv_maxspeed"
  set bot_god 0 "god mode for bots"
  set bot_ai_navigation_jetpack 0 "Enable bots to navigate maps using the jetpack"
  set bot_ai_navigation_jetpack_mindistance 3500 "Bots will try fly to objects located farther than this distance"
@@@ -194,7 -191,6 +194,6 @@@ set g_antilag_nudge 0 "don't touch
  set g_shootfromeye 0 "shots are fired from your eye/crosshair; visual gun position can still be influenced by cl_gunalign 1 and 2"
  set g_shootfromcenter 0 "weapon gets moved to the center, shots still come from the barrel of your weapon; visual gun position can still be influenced by cl_gunalign 1 and 2"
  set g_shootfromfixedorigin "" "if set to a string like 0 y z, the gun is moved to the given y and z coordinates. If set to a string like x y z, the whole shot origin is used"
- set g_pinata 0 "if set to 1 you will not only drop your current weapon when you are killed, but you will drop all weapons that you possessed"
  set g_weapon_stay 0 "1: ghost weapons can be picked up but give no ammo, thrown guns have ammo 2: ghost weapons can be picked up and refill ammo to one pickup size, thrown guns have no ammo (to prevent infinite ammo abuse)"
  set g_weapon_throwable 1 "if set to 1, weapons can be dropped"
  set g_powerups -1 "if set to 0 the strength and shield (invincibility) will not spawn on the map, if 1 they will spawn in all game modes, -1 is game mode default"