Counter-Strike: Global Offensive Bot-Verhaltensbäume
It is covered here for historical and technical reference.
Remember to check for any notes left by the tagger at this article's talk page.
In Counter-Strike: Global Offensive, Bot s können einen Verhaltensbaum erhalten, dem sie folgen können. Ein Verhaltensbaum bestimmt, wie der Bot Dinge wahrnimmt (Sehen, Hören, Schadenswahrnehmung), sich bewegt, angreift und andere Aktionen ausführt.
Verhaltensbäume sind Textdateien, die verwenden Valve 's proprietäre Schlüsselwerte3 Format (.kv3
), dabei handelt es sich um ein textbasiertes Format mit etwas strenger Syntax. Sie verwenden normalerweise das Präfix bt_
, um anzuzeigen, dass die Datei ein Behavior Tree ist. Sie werden in csgo/scripts/ai
gespeichert. Man kann seine eigenen Verhaltensbäume erstellen und verwenden, siehe unten.
Offiziell werden Verhaltensbäume für die Spielmodi verwendet Koop-Angriff, Schutzmission and Deathmatch.
Verhaltensbäume waren die ersten zum Spiel hinzugefügt am 16. September 2019. Seit dem 01.09.2020 Verhaltensbäume können in BSP-Dateien gepackt werden.
Verhaltensbäume verwenden
Es gibt einige Möglichkeiten, Verhaltensbaumdateien im Spiel zu verwenden.
- Die ConVar
mp_bot_ai_bt
bestimmt einen Verhaltensbaum, den alle Respawn-Bots auf dem Server (sowohl T als auch CT!) verwenden werden. Sein Wert ist eine Zeichenfolge, die den Pfad zu einer .kv3-Datei darstellt, beginnend mitcsgo/
. Wenn es Spieler-Respawns gibt, reicht das Töten eines Bots aus, um ihn dazu zu bringen, eine neu eingestellte Datei zu verwenden, andernfalls sollte das Neustarten des Spiels oder der Runde mitmp_restartgame 1
oderendround
auch ausreichen. Wenn eine Verhaltensbaumdatei geändert wurde und sie bereits von einem Bot geladen wurde, ist es auch erforderlich, die geladenen Dateien mitmp_bot_ai_bt_clear_cache
zu leeren, damit die Änderungen wirksam werden. Sobald ein Bot (re)spawnt, werden Fehlermeldungen mit[AI BT]
angezeigt, wenn eine verwendete Datei Fehler enthält und der Bot keinen Verhaltensbaum verwendet.Beispiel:Die folgende Zeile wird für das offizielle Deathmatch verwendet und ist incsgo/cfg/gamemode_deathmatch.cfg
zu finden:mp_bot_ai_bt "scripts/ai/deathmatch/bt_default.kv3"
- For Koop-Angriff, info_enemy_terrorist_spawn-Entitäten haben den Schlüsselwert
behavior_tree_file
, der verwendet werden kann, um eine Verhaltensbaumdatei nur für Bots anzugeben, die bei dieser Entität spawnen.
Verwandte Konsolenbefehle
ConVar | Default Wert | Beschreibung |
---|---|---|
cv_bot_ai_bt_debug_target
|
-1 | Zeichnen Sie den Verhaltensbaum des gegebenen Bots. |
cv_bot_ai_bt_hiding_spot_show
|
0 | Zeichne Verstecke. |
cv_bot_ai_bt_moveto_show_next_hiding_spot
|
0 | Zeichne das Versteck, das der Bot als nächstes überprüfen wird. |
mp_bot_ai_bt
|
"" | Verwenden Sie die angegebene Verhaltensbaumdatei, um das Bot-Verhalten zu steuern (siehe oben). |
mp_bot_ai_bt_clear_cache
|
ConCommand | Löscht den Cache für Verhaltensbaumdateien. |
Dateiformat
Um die Dateisyntax kurz zusammenzufassen:
- Das Spiel ignoriert aufeinanderfolgende Leerzeichen und unterscheidet nicht zwischen ihnen, daher kann eine Datei in einer Zeile geschrieben werden, aber bitte nicht. Zeilenumbrüche werden verwendet, um die Lesbarkeit zu verbessern, siehe die Beispiele unten.
- Schlüsselwerte werden durch geschweifte Klammern
{ }
begrenzt und enthalten Schlüssel-Wert-Paare im FormatSchlüssel = Wert Schlüssel = Wert ...
, wobei die Werte unterschiedlich sein können Datentypen wie integer (1
), float (1.0
), string ("1"< /code>) und insbesondere KeyValues selbst.
- Arrays werden durch eckige Klammern
[ ]
begrenzt und ihre Elemente (unabhängig vom Datentyp) werden durch Kommas getrennt,
, zum Beispiel:[ {...}, {...}, {...} ]
- Inline-Kommentare beginnen mit
//
, mehrzeilige Kommentare beginnen mit/*
und enden mit*/
.
Siehe auch: KeyValues3
Die erste Zeile einer .kv3
-Datei ist immer ein Header, der die KV3-Version angibt. Verwenden Sie für diesen Header:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
Der Rest der Datei besteht aus einem Schlüsselwert, eingeschlossen in geschweiften Klammern
{ }
. Für Verhaltensbaumdateien enthält dieser Schlüsselwert die Schlüssel config
und root
.
Der Schlüssel config
bestimmt eine allgemeine Bot-Konfiguration mit dem "Skill" des Bots. Sein Wert sollte den vollständigen Pfad zu einer solchen Datei enthalten, einschließlich der Dateierweiterung.
Valve hat bereits drei solcher Konfigurationsdateien bereitgestellt, nämlich
"scripts/ai/deathmatch/bt_config.kv3"
,
"scripts/ai/guardian/bt_config.kv3"
und
"scripts/ai/coop/bt_config.kv3"
.
Generell müssen wir folgendes hinzufügen:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
config = "scripts/ai/<path to bt_config>/<bt_config_name>.kv3"
}
Fügen Sie als Nächstes den Schlüssel root
mit einem Verhaltensknoten als Wert hinzu. Das Spiel "führt" den Root-Knoten regelmäßig aus.[Erläutern]
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
config = "scripts/ai/<path to bt_config>/<bt_config_name>.kv3"
root =
{
<Behavior Node>
}
}
Verhaltensknoten sind wieder KeyValues, aber mit einem type
-Schlüssel, dessen Wert seinen Knotentyp bestimmt. Es gibt verschiedene Arten von Knoten, nämlich
- direkte #Aktionen, die der Bot ausführen wird, wie z. B.
type = "action_pull_trigger", "action_use", "action_jump"
oder "action_wait"
,
- vier #Combinators, die bestimmen, wie mehrere Knoten ausgeführt werden, zum Beispiel in einer
sequence
oder parallel
,
- #Decorators hauptsächlich zum Generieren/Erhalten/Speichern von Daten, wie
decorator_sensor
, decorator_random_int
oder decorator_memory
.
- #Bedingungen zum Vergleichen von Daten und Verzweigen.
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
config = "scripts/ai/<path to bt_config>/<bt_config_name>.kv3"
root =
{
type = <Node Type>
<parameter> = <value>
...
child =
{
<Behavior Node>
}
}
}
Das Format jedes Verhaltensknotens hängt von seinem Typ ab, da die meisten Verhaltensknoten ihre spezifischen Parameternamen, Werttypen und Verwendungen verwenden.
Achtung:Tippfehler in Parameternamen führen nicht unbedingt zu Kompilierungsfehlern, es sei denn, wichtige Parameter fehlen.
Einige Knoten ermöglichen es, neue globale Variablen zu definieren. Ihre Eingabenamen sollten sowohl doppelte als auch einfache Anführungszeichen enthalten:
type = "action_set_global_counter"
input_name = "'Test'" // Beachten Sie diese Anführungszeichen.
input_value = 1
Einige Knoten unterstützen Convars als Eingabe. Ihre Namen sollten mit dem Symbol @
beginnen:
type = "action_choose_bomb_site_area"
input = "@mp_guardian_target_site"
output = "BombSiteArea"
Bot-Konfiguration
Zu erledigen:
- Parameter in bt_config erklären
Diese Parameter definieren die allgemeine Bot-Reaktion und das Kampfverhalten für jeden Bot-Skill (low, fair, normal, tough, hard, very_hard, expert, elite, default ), wie eine botprofile.db.
Standardformat ist:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
<skill level>
{
<Variables from table below>
attack = <Attack table>
}
}
Parameterliste
Variable
Beschreibung
aim_target_acquisition_lerp_time
aim_target_acquisition_lerp_time_deviation
aim_target_acquisition_angle_penalty
aim_target_acquisition_angle_penalty_deviation
aim_target_acquisition_angle_penalty_reduction_ratio
aim_target_acquisition_angle_tolerance
aim_target_acquisition_angle_lerp_bias
aim_target_tracking_lerp_time
aim_target_tracking_lerp_time_deviation
aim_target_tracking_focus_interval
aim_target_tracking_focus_interval_deviation
aim_target_tracking_angle_lerp_bias
aim_new_target_angle_tolerance
aim_max_duration
aim_max_duration_deviation
aim_punch_angle_reaction_chance
look_around_awareness_yaw_range
Maximaler Winkel zum horizontalen Drehen der Sichtkamera von diesem Blickwinkel aus.
look_around_awareness_pitch_range
Maximaler Winkel zum vertikalen Drehen der Sichtkamera von diesem Standpunkt aus.
look_around_focus_interval
Verzögerung zwischen der nächsten Drehung der Sichtkamera.
look_around_focus_interval_deviation
look_around_lerp_time
Zeit, die Sichtkamera auf die nächste Position zu drehen.
look_around_lerp_time_deviation
look_around_lerp_bias
Glättet die Bewegung der Sichtkamera.
reaction_time
Verzögerung vor Reaktion auf Ereignis.
combat_crouch_chance
combat_dodge_command_duration
combat_dodge_command_duration_deviation
Angriffstabelle
Die Angriffstabelle definiert den Umgang mit verschiedenen Waffentypen.
Beispiel:
attack =
[
// Dauer, Dauerabweichung, Kadenz, Cooldown, Cooldown-Abweichung
// MESSER PISTOL MASCHINENPISTOLE
[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ 0.95, 0.25, 0.5, 0.15, 0.05 ],[ 0.42, 0.07, 0.0, 0.15, 0.05 ],
// GEWEHR SCHROTFLINTE SCHARFSCHÜTZENGEWEHR
[ 0.22, 0.07, 0.0, 0.45, 0.15 ],[ 0.3, 0.0, 0.0, 0.95, 0.25 ],[ 0.22, 0.07, 0.0, 2.0, 0.0 ],
// MASCHINENGEWEHR C4 TASER
[ 0.75, 0.15, 0.0, 0.3, 0.1 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ], [ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// GRANATE AUSRÜSTUNG STAPELBARER ARTIKEL
[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// FÄUSTE BREACHCHARGE BUMPMINE
[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// TABLET NAHKAMPF SCHILD
[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ],
// WEAPONTYPE_ZONE_REPULSOR UNBEKANNT
[ -1.0, -1.0, -1.0, -1.0, -1.0 ],[ -1.0, -1.0, -1.0, -1.0, -1.0 ]
]
Knoten
Dies ist eine Liste aller Knoten am 9. November 2021.
Jeder Knoten hat einen Parameter type
, der seine Funktionalität bestimmt und welche anderen Parameter er berücksichtigt. Parameter können einen Standardwert haben, in diesem Fall ist es optional, sie anzugeben; wenn ein Parameter keinen Standardwert hat und auch nicht angegeben ist, gibt es eine Fehlermeldung in der Konsole.
Achtung:Für jeden Knoten ignoriert das Spiel alle Parameter ohne Warnung, wenn sie nicht dazu gehören; Es werden nur einige speziell benannte Parameter berücksichtigt, und diese Namen hängen von ihrem Typ ab. Beim Testen kann dies es schwierig machen, Parameternamen zu erkennen, die plausibel klingen, aber keine Wirkung haben (wie source/input/input_location
aber nur einer davon ist ein tatsächlicher Parameter) oder solche mit Tippfehler in ihren Namen.
Die meisten Knoten können die folgenden Parameter haben, die in den folgenden Listen weggelassen werden:
child
- Sein Wert sollte ein anderer Knoten sein, der je nach Knotentyp und Kontext ausgeführt oder nicht ausgeführt wird.
children
- Sein Wert sollte ein Array von Knoten sein, ähnlich wie child
.
negated
- Auf 1 setzen, um seinen Rückgabewert zu invertieren (Erfolg oder nicht), zum Beispiel wird ein Knoten vom Typ condition_is_empty
erfolgreich sein, wenn etwas nicht existiert; Wenn dieser Knoten den Parameter negated = 1
hat, wird er stattdessen erfolgreich sein, wenn etwas existiert.
Zu erledigen:
- Knotenparameter und -beschreibungen vervollständigen, auf Ungenauigkeiten prüfen.
- Variablentypen für Parameter definieren.
- Erklären Sie alle Parameter.
Kombinatoren
Typ
Parameter
Beschreibung
parallel
Führt alle untergeordneten Funktionen in einem Skript-Tick aus.
selector
Führt untergeordnete Funktionen als Sequenz aus, bis das untergeordnete Element auf die wahre Bedingung trifft.
sequencer
Führt untergeordnete Funktionen als Sequenz aus, bis das untergeordnete Element auf eine falsche Bedingung trifft.
subtree
string file, string name
Führt den Verhaltensbaum aus der Datei aus.
Dekorateure
Typ
Parameter
Beschreibung
decorator_bot_service
array memory_to_expire(variable? domain (GroupID or AllBots), flag key (ShortTermAttackMemory, ShortTermDamageMemory, ShortTermAreaDamageMemory, ShortTermInvestigateMemory, LongTermMemory, DamageThroughSmokeMemory, Threats), int time, int distance), array tagged_entities_to_expire, int_flag? basic_chatter_enable, vector? input_chatter_enemies, int chatter_outnumbered_threshold
Eine Art Hauptverhaltensfunktion des Bots? Enthält normalerweise alle Teilbaumroutinen.
decorator_buy_service
array output
Gibt ein Array von Artikeln zurück, die der Bot kaufen wird, und führt dann die Funktion aus.
decorator_dec_global_counter
variable input_name
Verringert die Eingangsvariable um 1 und führt dann die Funktion aus?
decorator_find_utility_strat
vector input_location, int distance_threshold, vector output_location, vector output_angles, string output_weapon
Unused.
decorator_game_event
Achtung:Versionshinweise für den 21.10.2021 sagen darüber, aber es existiert nicht im Code?
decorator_hiding_spot_service
variable? domain (GroupID or AllBots), vector output_hiding_spot, int distance_threshold, int expiration_time
Gibt Versteck zurück und führt dann die Funktion aus? Befindet sich normalerweise direkt nach dem Skriptstamm.
decorator_invert
Ungebraucht. Valve-Skripte verwenden normalerweise das Flag negated = 1
in Knotenparametern.
decorator_maybe
float chance
Führt untergeordnete Funktionen mit angegebener Wahrscheinlichkeit aus (1 - 100 %, 0,7 - 70 % usw.).
decorator_memory
vector? input, memory? output, string output_domain
Speichert die Eingabe im angegebenen Speicherpuffer?
decorator_need_healing
int health_threshold
Führt untergeordnete Funktionen aus, wenn der Zustand des Bots unter diesem Eingabeschwellenwert liegt.
decorator_picker_blocked_by_smoke
vector? input, int distance_threshold
Führt untergeordnete Funktionen aus, wenn die Eingabeposition hinter dem Rauchvolumen liegt?
decorator_picker_dedup
vector? input, memory? against, int distance_threshold
??? Wird nur in der Geräuschauswahl in Valve-Skripten verwendet.
decorator_picker_grenade_type
array input, array types (EXPLOSIVE, FLASH, FIRE, DECOY, SMOKE, SENSOR, SNOWBALL)
Führt untergeordnete Funktionen für bestimmte Granatentypen aus.
decorator_picker_max_score
array input
???
decorator_picker_nearby
array input, int cutoff_distance
Führt untergeordnete Funktionen aus, wenn Eingabeobjekte in Reichweite sind.
decorator_picker_random_by_distance
array input, int distance_min, int distance_max
Führt untergeordnete Funktionen aus, wenn eine zufällige Entität aus der Eingabe innerhalb der Entfernungsgrenzen liegt?
decorator_picker_reaction_time
variable? input_domain (GroupID or AllBots), memory? input, vector? output
Führt untergeordnete Funktionen nach einer Verzögerung aus, die von der Reaktionszeit des Bot-Skills abhängt?
decorator_picker_visible
array input, int_flag? check_fov
Führt Funktion aus, wenn Eingabeentität in LOS?
decorator_picker_weight_as_distance
array input
??? Wird nur in der Geräuschauswahl in Valve-Skripten verwendet.
decorator_random_approach_point
vector output
Gibt einen zufälligen Punkt im Navmesh zurück.
decorator_random_int
int min, int max, int output
Gibt eine zufällige Zahl im Bereich von min bis max zurück.
decorator_ranker_dist
Array-Eingabe
Sortiert Entitäten nach Entfernung?
decorator_remove
variable? input_domain (GroupID or AllBots), memory? input, array? remove
Entfernt ausgewählte Elemente aus dem Eingabespeicher.
decorator_remove_key
variable? input
Entfernt die Eingabevariable aus dem Skriptbereich.
decorator_repeat
Führt untergeordnete Funktionen in einer Schleife aus.
decorator_route_service
array config (array routes, array strategies), vector? output_waypoint, string output_waypoint_name, string output_domain
Ungebraucht.
decorator_run_once
int max_attempts = 1
Führt untergeordnete Funktionen nur begrenzt oft aus?
decorator_sensor
flag entity_type_filter (ALL, PLAYERS, HUMAN_PLAYERS, NOISE, DAMAGE, AREA_DAMAGE, CLASSNAME, GRENADE), function? shape(flag type (sensor_shape_fov, sensor_shape_sphere), int radius), flag team_filter (ANY, CT, TERRORIST, SAME, OPPOSITE, ENEMY), int_flag orphan_only, int_flag priority, string class_name, vector? output
Gibt eine vom Sensor erkannte Entität zurück und führt untergeordnete Funktionen aus.
decorator_set_barrier
domain input_domain, variable input_name, navzone? input_location
Ungebraucht.
decorator_set_reaction_time
array? input
Führt untergeordnete Funktionen bei der Eingabe nach einer Verzögerung aus, die von der Reaktionszeit des Bot-Skills abhängt?
decorator_succeed
Führt untergeordnete Funktionen aus, wenn der vorherige Dekorateur erfolgreich ist?
decorator_tag_entity
vector? input, array? output, flag operation_type (BT_DECORATOR_TAG_ENTITY_CLEAR, BT_DECORATOR_TAG_ENTITY_SET), int expiration_time
??? Wird beim Auswählen des Zielbaums in Valve-Skripten verwendet.
decorator_tag_threshold
vector? entity_input, vector? tagged_entities_input, int amount, flag check_type (BT_DECORATOR_TAG_THRESHOLD_AT_MOST, BT_DECORATOR_TAG_THRESHOLD_AT_LEAST)
??? Wird verwendet, um festzustellen, ob es sicher ist, Ziele in Valve-Skripten zu erreichen?
decorator_token_service
variable? domain, string output_token_name, string output_token_domain, function config(array tokens, array assignments)
Im Schutzmission-Modus: definiert die Bot-Gruppen-ID und führt dann untergeordnete Funktionen aus.
decorator_try_lock
variable? domain
Überprüft, ob ein anderer Bot bereits dieselbe Funktion ausführt???
decorator_wait_success
int timeout
Wartet darauf, dass das untergeordnete Element true zurückgibt oder die Ausführung beendet. Wenn das Kind niemals true zurückgibt, hört das Warten nach x Timeout-Sekunden auf.
Bedingungen
Typ
Parameter
Beschreibung
condition_barrier
domain input_domain, variable input_name, navzone? input_location
Ungebraucht.
condition_distance_less
vector input, int distance_threshold_min, int distance_threshold_max
Gibt true zurück, wenn der Abstand zur Eingabeposition kleiner als irgendwo zwischen dem Maximum und dem Minimum ist? Könnte es sein, dass das Minimum und das Maximum zu Randomisierungszwecken dienen?
condition_has_parachute
Gibt wahr zurück, wenn der Bot einen Fallschirm im Inventar hat.
condition_inactive
array input(memory? key), int round_start_threshold_seconds, int sensor_inactivity_threshold_seconds
Gibt wahr zurück, wenn der Bot innerhalb des Timings keinen Speicher und keine Sensoreingabe hat.
condition_is_airborne
Gibt wahr zurück, wenn der Bot in der Luft ist.
condition_is_at_bomb_site
Gibt wahr zurück, wenn sich der Bot in der Bombsite-Zone befindet.
condition_is_empty
int_flag? global, any input
Gibt true zurück, wenn die Eingabevariable leer ist oder nicht existiert.
condition_is_equal
beliebige Quelle, beliebiges Ziel
Gibt „true“ zurück, wenn die Quellvariable gleich der „Ziel“-Eingabe ist.
condition_is_greater
any source, any destination
Ungebraucht. Gibt wahr zurück, wenn die Quellvariable größer als die „Ziel“-Eingabe ist.
condition_is_greater_equal
any source, any destination
Ungebraucht. Gibt wahr zurück, wenn die Quellvariable gleich oder größer als die „Ziel“-Eingabe ist.
condition_is_inv_slot_empty
flag slot (KNIFE, PISTOL, RIFLE, GRENADES)
Gibt true zurück, wenn der Input-Equipment-Slot leer ist.
condition_is_less
any source, any destination
Ungebraucht. Gibt wahr zurück, wenn die Quellvariable kleiner als die „Ziel“-Eingabe ist.
condition_is_less_equal
beliebige Quelle, beliebiges Ziel
Ungebraucht. Gibt wahr zurück, wenn die Quellvariable gleich oder kleiner als die „Ziel“-Eingabe ist.
condition_is_reloading
Ungebraucht. Gibt true zurück, wenn sich die aktive Waffe im Nachladezustand befindet.
condition_is_weapon_equipped
string weapon
Gibt wahr zurück, wenn der Bot eine aktive Waffe mit dem eingegebenen Klassennamen hat.
condition_is_weapon_suitable
string weapon
Ungebraucht.
condition_out_of_ammo
Gibt true zurück, wenn die aktive Waffe keine Munition mehr hat.
condition_owns_item
string item
Gibt „true“ zurück, wenn der Bot ein Element mit dem eingegebenen Klassennamen hat.
Aktionen
Typ
Parameter
Beschreibung
action_acquire_items
array items, int_flag? remove_all_items
Rüstet den Bot mit Items aus dem Array aus, z.B. { type = "action_acquire_items" items = [ "weapon_awp" ] }
.
action_aim
vector input, int_flag? acquire_only, flag? ready
Dreht den Bot zum Eingabepunkt?
action_aim_projectile
Vektoreingabe, Vektorausgabe
Berechnet Wurfwinkel an der Eingabeposition?
action_assign_guardian_loadout
string input_token_name, array assignments(string token, array loadout(array items, array wave_numbers, int wave_numbers_min, int wave_numbers_max, int weight))
Im Schutzmission-Modus: Wählt das Bot-Spawn-Loadout.
action_attack
vector input, flag? output (z.B. output = "Attacking"), flag? ready (z.B. ready = "AimReady")
Eingabeeinheit für Bot-Angriff?
action_buy
Bot kauft Waffen.
action_choose_bomb_site_area
int input, navzone? output
Ruft die Navigationsposition der Bombenzone aus dem Index ab. Unterstützt Convars.
action_choose_guardian_bomb_plant_location
vector? output
Wählt die Platzierung-Position in Navigationsnetz? Nur Wächtermodus?
action_choose_random_waypoint
navzone? input, vector output
Wählt einen zufälligen Wegpunkt innerhalb der Eingabe-Navigationszone.
action_choose_random_waypoint_within_radius
vector origin, vector output, float radius
Wählen Sie einen zufälligen Wegpunkt innerhalb des angegebenen Ursprungs und Radius.
action_choose_team_spawn_area
navzone? output
Bekommt alle Navzones mit Spawnpunkten?
action_combat_positioning
vector input, flag? is_attacking
Der Bot versucht, die beste Kampfposition gegen die Eingabeeinheit zu erreichen?
action_commit_suicide
Bot töten.
action_compare_global_counter
variable? input_name (e.g. input_name = "'Test'"), int input_value
Vergleicht den Wert aus der Variablen "input_name" mit dem Eingabewert.
action_coordinated_buy
flag team_filter (ANY, CT, TERRORIST, SAME, OPPOSITE, ENEMY),
int save_threshold,
flag? id_no_purchase (e.g. id_no_purchase = "DidNotPurchase"),
array purchases(array items, string id)
Im Schutzmission-Modus: Beschränkt den Kauf von Artikeln auf bestimmte Gruppen-IDs?
action_crouch
Zwingt den Bot in die Hocke.
action_custom_buy
array item_aliases
Ungebraucht.
action_drop_active_weapon
Ungebraucht. Zwingt den Bot, die aktive Waffe fallen zu lassen.
action_equip_item
string item, array items_one_of
Zwingt den Bot, ein Element mit dem Klassennamen aus der Eingabe auszuwählen.
action_equip_weapon
string weapon (classname or BEST)
Zwingen Sie den Bot, einen Gegenstand mit dem Klassennamen aus der Eingabe oder der "besten" Waffe im Inventar auszuwählen.
action_flee_area_damage
vector? input, vector output, int max_search_range, int threat_min_keep_distance
Gibt einen sicheren Ort von dieser Position innerhalb des Suchradius zurück.
action_hide
Ungebraucht.
action_inspect_current_weapon
Ungebraucht. Zwingt den Bot, die Inspektionsanimation abzuspielen.
action_jump
Zwingt den Bot zum Springen.
action_look_at
vector input_angles, vector input_location
Dreht den Bot zum angegebenen input_angle
, wie setang . Wenn weggelassen, dreht sich der Bot so, dass er auf die Koordinaten input_location
blickt. Andernfalls tritt ein Fehler auf.
action_move_to
vector destination,
flag movement_type (BT_ACTION_MOVETO_RUN, BT_ACTION_MOVETO_WALK),
flag route_type (BT_ACTION_MOVETO_FASTEST_ROUTE,BT_ACTION_MOVETO_SAFEST_ROUTE),
vector? hiding_spot,
vector? threat,
int damaging_areas_penalty_cost,
int nearest_area_distance_threshold,
int hiding_spot_check_distance_threshold,
int arrival_epsilon,
float additional_arrival_epsilon_2d,
int_flag? auto_look_adjust
Zwingt den Bot, sich am Zielpunkt zu bewegen.
action_parachute_positioning
???
action_pull_trigger
int ratio
Erzwingt den Primärangriff des Bots.
action_reload
Zwingt den Bot, die Waffe nachzuladen.
action_say
string phrase, flag? high_priority
Zwingt den Bot, Funkbefehlsphrase zu sagen. Die Liste der Phrasen befindet sich in botchatter.db
action_secondary_attack
Ungebraucht. Erzwingt einen Bot-Sekundärangriff.
action_select_areas_within_radius
vector input, float radius, navzone? output
Gibt Navzones innerhalb des angegebenen Ursprungs und Radius zurück?
action_set_global_counter
variable? input_name, int input_value
Legt den Eingabewert auf die Variable "input_name" fest.
action_set_global_flag
variable? name, int expiration_time_min, int expiration_time_max
Setzt die globale Variable "name" für eine bestimmte Zeit auf 1?
action_set_value_float
variable? key, float value
Setzt den Gleitkommawert auf die Variable "key".
action_set_value_vector
variable? key, vector value
Setzt den Vektorwert auf die Variable "key".
action_standup
Ungebraucht. Zwingt den Bot, sich aufzurichten.
action_teleport
vector destination
Teleportiert den Bot zur Zielposition.
action_use
Erzwingt Bot "+use"
action_wait
float wait_time_min, float wait_time_max
Friert die Bot-KI und die Skriptausführung für einen definierten Zeitraum ein.
Reservierte Variablen
Diese Variablen sind im Spielcode definiert. Sie können verwendet werden, um einige Informationen über Spielmodus und Bot sowie als Bedingungen zu erhalten.
Variable
Beschreibung
int NumberOfTerrorists
Anzahl der Spieler im T-Team.
int NumberOfAliveTerrorists
Anzahl der lebenden Spieler im T-Team.
int NumberOfCounterTerrorists
Anzahl der Spieler im CT-Team.
int NumberOfAliveCounterTerrorists
Anzahl der lebenden Spieler im CT-Team.
int GuardianWaveNumber
Wellennummer im Template:Csgo-Modus-Modus.
int AccountBalance
Höhe des Spielergeldes.
float? BlindnessPercentage
Menge an Blindheit, die von Blendgranaten angewendet wird.
??? BombIsBeingDefused
Wiedergabewert ??? wenn eine Bombe entschärft wird.
variable? LastCoopSpawnPointName
Zielname des letzten Spawnpunktes, der diesen Bot im Koop-Angriff gespawnt hat.
Vector LastCoopSpawnPointLocation
Der Ursprungspunkt des letzten Spawnpunkts hat diesen Bot im Koop-Angriff gespawnt.
int AmmoCount/weapon_name
Verbleibende Munitionsmenge in Waffe mit Klassenname "weapon_name" (Magazin + Reserve).
int AmmoCount/current
Verbleibende Munitionsmenge in aktiver Waffe (Magazin + Reserve).
Beispiele
Um diese Verhaltensbäume zum Laufen zu bringen, siehe #Verwenden von Verhaltensbäumen.
Einfache Aktionen
Einer der einfachsten Verhaltensbäume, die Sie einem Bot geben können, ist der folgende. Wenn der Bot spawnt, springt er immer wieder an derselben Stelle und reagiert auf nichts. Wie in alten Zeiten.
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7}-->
{
config = "scripts/ai/deathmatch/bt_config.kv3"
root =
{
type = "action_jump"
}
}
Um es ein bisschen nützlicher zu machen, sollte der Bot gleichzeitig schießen. Dies kann mit einem parallelen
-Knoten erfolgen:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7}-->
{
config = "scripts/ai/deathmatch/bt_config.kv3"
root =
{
type = "parallel"
children =
[
{
type = "action_pull_trigger"
},
{
type = "action_jump"
}
]
}
}
Aber dieser Bot wird immer noch nicht aufhören, den Abzug zu drücken, obwohl er keine Munition mehr hat. Um dies zu beheben, können wir einen condition_out_of_ammo
-Knoten hinzufügen. Der folgende Bot springt und schießt ununterbrochen, hört aber auf, sobald er keine Munition mehr hat:
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7}-->
{
config = "scripts/ai/deathmatch/bt_config.kv3"
root =
{
type = "condition_out_of_ammo"
negated = 1
child =
{
type = "parallel"
children =
[
{
type = "action_pull_trigger"
},
{
type = "action_jump"
}
]
}
}
}
Standard-Deathmatch-Verhaltensbaum
Gefunden in csgo/scripts/ai/bt_default.kv3
. Diese Datei ist eine gute Basis, um einen eigenen Bot zu schreiben.
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
{
config = "scripts/ai/deathmatch/bt_config.kv3"
root =
{
type = "decorator_bot_service"
memory_to_expire =
[
{
key = "ShortTermAttackMemory"
time = 0.7
distance = 0
},
{
key = "LongTermMemory"
time = 10
distance = 500
},
{
key = "ShortTermInvestigateMemory"
time = 3
distance = 200
}
]
child =
{
type = "decorator_buy_service"
output = "ShouldBuy"
child =
{
type = "parallel"
children =
[
{
type = "decorator_repeat"
child =
{
type = "parallel"
children =
[
// merken Sie sich Feinde durch Vision
{
type = "subtree"
file = "scripts/ai/modules/bt_memorize_enemies_vision.kv3"
name = "MemorizeEnemiesVision"
},
// merken Sie sich Geräusche, die gerade passieren
{
type = "subtree"
file = "scripts/ai/modules/bt_memorize_noises.kv3"
name = "MemorizeNoises"
},
// Zeichnen Sie das nächste gespeicherte Ereignis auf, um es zu untersuchen
{
type = "subtree"
file = "scripts/ai/modules/bt_memorize_nearest_investigation.kv3"
name = "MemorizeNearestInvestigation"
}
]
}
},
{
type = "decorator_repeat"
child =
{
type = "selector"
children =
[
// Kaufen, wenn es sein muss
{
type = "condition_is_empty"
input = "ShouldBuy"
negated = 1
child =
{
// Sequenzer: wertet das erste bis letzte untergeordnete Element in der Reihenfolge aus
type = "sequencer"
children =
[
{
type = "action_wait"
wait_time_min = 3
wait_time_max = 3
},
{
type = "action_buy"
},
{
type = "decorator_remove_key"
input = "ShouldBuy"
}
]
}
},
// Sonst: Stellen Sie sich der Schadensquelle, wenn wir Schaden erleiden
{
type = "decorator_sensor"
entity_type_filter = "DAMAGE"
output = "Damage"
priority = 0
child =
{
type = "condition_is_empty"
input = "Damage"
negated = 1
child =
{
type = "action_aim"
input = "Damage"
acquire_only = 1
}
}
},
// Sonst: Angreifen, wenn wir einen Feind sehen
{
type = "subtree"
file = "scripts/ai/modules/bt_attack.kv3"
name = "Attack"
},
{
type = "subtree"
file = "scripts/ai/modules/bt_heal_if_needed.kv3"
name = "HealIfNeeded"
},
// Sonst: Untersuchen Sie das nächste gespeicherte Ereignis
{
type = "subtree"
file = "scripts/ai/modules/bt_investigate_closest_memorized_event.kv3"
name = "InvestigateClosestMemorizedEvent"
},
// Ansonsten: jagen
{
// Sequenzer: wertet das erste bis letzte untergeordnete Element in der Reihenfolge aus
type = "sequencer"
children =
[
{
type = "action_equip_weapon"
weapon = "BEST"
},
{
type = "decorator_random_int"
min = 0
max = 1
output = "BombSiteIndex"
child =
{
type = "action_choose_bomb_site_area"
input = "BombSiteIndex"
output = "HuntAreas"
}
},
{
type = "action_choose_team_spawn_area"
output = "HuntAreas"
},
{
type = "action_choose_random_waypoint"
input = "HuntAreas"
output = "TargetHuntArea"
},
{
type = "action_move_to"
destination = "TargetHuntArea"
movement_type = "BT_ACTION_MOVETO_RUN"
route_type = "BT_ACTION_MOVETO_FASTEST_ROUTE"
}
]
}
]
}
}
]
}
}
}
}
Level Design Technical Gameplay
General Game Modes
Arms Race · Co-op Strike · Custom · Danger Zone · Deathmatch · Demolition · Guardian · Retakes · Weapons Expert · Wingman