Counter-Strike: Global Offensive/Bot Behavior Trees/de

Aus Valve Developer Community
Wechseln zu: Navigation, Suche

Stub

Dieser Artikel ist unvollständig. Du kannst helfen, indem du ihn erweiterst.

Icon-broom.png
Dieser Artikel oder dieser Abschnitt muss mit den aktuellen Informationen zu diesem Thema aktualisiert werden.
Auf der Diskussionsseite dieses Artikels befinden sich möglicherweise Anmerkungen von derjenigen Person, die diese Mitteilung hinzugefügt hat.
Counter-Strike: Global Offensive Level Creation

In Counter-Strike: Global Offensive Counter-Strike: Global Offensive, Bots 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 CS:GO Co-op Strike Koop-Angriff, CS:GO Guardian Schutzmission and CS:GO/CS2 Deathmatch 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 mit csgo/. 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 mit mp_restartgame 1 oder endround auch ausreichen. Wenn eine Verhaltensbaumdatei geändert wurde und sie bereits von einem Bot geladen wurde, ist es auch erforderlich, die geladenen Dateien mit mp_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.
    PlacementTip.png Beispiel: Die folgende Zeile wird für das offizielle Deathmatch verwendet und ist in csgo/cfg/gamemode_deathmatch.cfg zu finden:
    mp_bot_ai_bt "scripts/ai/deathmatch/bt_default.kv3"
  • For CS:GO Co-op Strike 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 Format Schlü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 Counter-Strike: Global Offensive 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.

Warning.pngAchtung: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

Blank image.pngZu 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.

Warning.pngAchtung: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.
Blank image.pngZu 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
Warning.pngAchtung: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 CS:GO Guardian 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 CS:GO Guardian 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 CS:GO Guardian 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 CS:GO Co-op Strike Koop-Angriff gespawnt hat.
Vector LastCoopSpawnPointLocation Der Ursprungspunkt des letzten Spawnpunkts hat diesen Bot im CS:GO Co-op Strike 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"
										}
									]
								}
							]
						}
					}
				]
			}
		}
	}
}