Black Knight's Botmanager v1.0
Beschreibung
Wieso sollte ich Bots benutzen? Für Anfänger ist das zum Üben sicherlich geeignet, aber auf Dauer macht es mit Bots nicht wirklich Spaß. Aber wäre es nicht schön, wenn man einen Dedicated Server während keiner spielt mit Bots versehen könnte und diese Schritt für Schritt entfernt, wenn echte, menschliche Gegner auf den Server kommen? Im Gegensatz zu dem unsäglichen Fakefull findet der Spieler zumindest Bots vor, mit denen er sich die Zeit bis zum nächsten Connectenden vertreiben kann.
Ich hatte immer mit dieser Idee geliebäugelt, gerade beim Ansehen der CS 1.6 Beta drang sich diese Idee quasi auf. Nachdem die Bots aber doch entfernt wurden, habe ich den Ansatz fallen lassen.
Darüber hinaus gibt es einige gravierende Probleme, die man sich bei Bots einhandelt. Zum einen ist das die stark erhöhte Prozessorlast und zum anderen, dass die meisten Bots nicht als Metamodplugins vorliegen. Die Verwendung von Bots bei Gameserveranbietern war wegen letzterem Punkt sogar völlig unmöglich. Mit der Einführung von Metamod 1.17 kann man Bots jedoch auch dort integrieren (Stichwort: config.ini). Da Ihr aber in der Regel den Server nicht allein benutzt, solltet Ihr in diesem Fall von der Botbenutzung absehen.
Bots verbrauchen sehr viel Prozessorzeit und sollten daher nur auf Servern laufen, die Euch EXKLUSIV gehören (z.B. Rootserver, Server auf einer LAN, Exklusivserver von Gameserveranbietern). Anderenfalls bekommt Ihr schnell Ärger! Ihr wurdet gewarnt!!
Nachdem die Trafficpreise inzwischen stark gesunken sind, können sich jedoch immer mehr Leute einen solchen Server leisten und es gab bereits die erste Anfrage in unserem Forum. Daher habe ich das Konzept wieder herausgekramt und umgesetzt.
Features:
- Boteinstellungen können unabhängig von Rcon-Zugriff durchgeführt werden.
- Bots können zu bestimmten Teams hinzugefügt bzw. auch wieder entfernt werden.
- Kompatibel zu den meisten Bots (Befehle können vom User eingestellt werden)
- Füllt Server automatisch bis zu einer bestimmten Spielerzahl mit Bots auf und entfernt diese Schritt für Schritt, wenn menschliche Gegner auf den Server kommen.
- Kompatibel zu den meisten Mods (Das Plugin ist zwar für Counter-Strike geschrieben, sollte aber auch mit anderen Mods funktionieren.)
Wichtig:
- Dieses Plugin ist kein Bot!
- Ich bin nicht für die Botsoftware verantwortlich noch kenne ich mich dort besonders gut aus. Ich werde keine Unterstützung bei der Botinstallation und -konfiguration geben.
- Wollt Ihr dem Bot überlassen, in welches Team der Bot kommen soll oder aus welchem Team er entfernt werden soll, gebt die gleiche Zeile einfach bei addct und addt bzw. kickct und kickt an.
- Ich bin nicht verantwortlich für Ärger, den Ihr Euch mit Eurem Gameserveranbieter einhandelt. Ihr wurdet mehrfach gewarnt.
- Vernünftige Werte für die Bots-Variable sind 4 oder evtl. auch 6, oder 0, wenn Ihr die Automatik nicht nutzen wollt.
- Benutzung der Automatik und das gleichzeitige manuelle Hinzufügen und Entfernen von Bots kann zu überraschenden Ergebnissen führen. Eigentlich sollte man in solchen Fällen die Automatik abschalten, aber ich habe keine Überprüfung eingebaut, um Euch etwas Flexibilität zu lassen.
Download
Installation
- Kompilieren des Plugins
- Installation des Plugins (inkl. Eintrag in die plugin.ini)
- Mapchange
- Plugin für den zu benutzenden Bot konfigurieren (s. Befehle)
Befehle
Für die Befehle braucht Ihr das Recht 512!
- admin_bot_set <Option> <Wert>:
- Mit diesem Befehl konfiguriert man das Plugin und passt es an den Bot an. Die Eingabe ohne Option und Wert gibt einen Überblick über die derzeitigen Einstellungen. Als Optionen stehen zur Verfügung:
- prefix
- Hier sollte der Befehl stehen, der jedem Botbefehl vorgestellt werden muss, bei RealBot z.B. rbds. Für andere Bots solltet Ihr deren Dokumentation lesen.
- addct
- Hier sollte der Befehl zum Hinzufügen eines Bots zum CT-Team stehen (ohne Präfix versteht sich), bei RealBot z.B. addbot_2. Für andere Bots solltet Ihr deren Dokumentation lesen.
- addt
- Hier sollte der Befehl zum Hinzufügen eines Bots zum Terror-Team stehen (ohne Präfix versteht sich), bei RealBot z.B. addbot_1. Für andere Bots solltet Ihr deren Dokumentation lesen.
- kickct
- Hier sollte der Befehl zum Entfernen eines Bots aus dem CT-Team stehen (ohne Präfix versteht sich), bei RealBot z.B. removebot_1_2. Für andere Bots solltet Ihr deren Dokumentation lesen.
- kickt
- Hier sollte der Befehl zum Entfernen eines Bots aus dem Terror-Team stehen (ohne Präfix versteht sich), bei RealBot z.B. removebot_1_1. Für andere Bots solltet Ihr deren Dokumentation lesen.
- bots
- Hier wird festgelegt, wieviele Spieler und Bots mindestens auf dem Server sein sollen. Bei Unterschreiten des Werts wird mit Bots aufgefüllt, beim Überschreiten werden Bots schrittweise entfernt. Bots werden stets aus dem größten Team entfernt oder dem kleinsten hinzugefügt. Ein Wert von 0 schaltet diese Funktion ab (Default).
- Beispiele:
-
- admin_bot_set prefix rbds (Konfiguriert das Plugin für den RealBot)
- admin_bot_set addct addbot_2 (Definiert den Befehl zum Hinzufügen eins CT-Bots beim RealBot)
- admin_bot_set bots 4 (Es werden bis zu 4 Bots hinzugefügt, wenn weniger als 4 menschliche Spieler vorhanden sind. Ein sehr sinnvoller Wert.)
- admin_bot_addct:
- Fügt einen Bot manuell dem CT-Team hinzu.
- admin_bot_addt:
- Fügt einen Bot manuell dem Terror-Team hinzu.
- admin_bot_kickct:
- Entfernt einen Bot manuell aus dem CT-Team.
- admin_bot_removect:
- Entfernt einen Bot manuell aus dem CT-Team.
- admin_bot_kickt:
- Entfernt einen Bot manuell aus dem Terror-Team.
- admin_bot_removet:
- Entfernt einen Bot manuell aus dem Terror-Team.
- admin_bot_command <Botoption>:
- Hiermit kann man jeden Botbefehl absenden bzw. Einstellungen des Bots verändern. Dazu bitte die Dokumentation des Bots konsultieren. Der Präfix darf auch hier nicht eingegeben werden. Dies geschieht automatisch.
Quellcode
plugin_bk_botmanager.sma:
#include <core> #include <console> #include <string> #include <admin> #include <adminlib> #include <plugin> #define TERROR 1 #define CT 2 new STRING_VERSION[MAX_DATA_LENGTH] = "1.0"; /* Überprüfung, ob vault.ini existiert */ is_vaultfile_set(){ new vault[MAX_DATA_LENGTH]; getstrvar("admin_vault_file",vault,MAX_DATA_LENGTH); if(streq(vault,"0") || strlen(vault)==0){ if(getvar("admin_debug")>0){ log("[BK_BM] No vault file defined."); } return 0; } return 1; } public plugin_info(HLOldName, HLNewName, UserIndex){ new Name[MAX_NAME_LENGTH]; new UserID,WONID,Team,Dead; new sAuthID[MAX_AUTHID_LENGTH]; if(UserIndex>0){ playerinfo(UserIndex,Name,MAX_NAME_LENGTH,UserID,WONID,Team,Dead,sAuthID); } else{ return PLUGIN_CONTINUE; } new sHLOldName[MAX_NAME_LENGTH]; new sHLNewName[MAX_NAME_LENGTH]; convert_string(HLOldName,sHLOldName,MAX_NAME_LENGTH); convert_string(HLNewName,sHLNewName,MAX_NAME_LENGTH); if(!streq(sHLOldName,sHLNewName)){ return PLUGIN_CONTINUE; } new TBot=0; new CTBot=0; checkbot(TBot,CTBot); kickbot(TBot,CTBot); return PLUGIN_CONTINUE; } checkbot(&TBot,&CTBot){ new Name[MAX_NAME_LENGTH]; new UserID,WONID,Team,Dead; new sAuthID[MAX_AUTHID_LENGTH]; new i; new maxplayers=maxplayercount(); for(i=1;i<=maxplayers;i++){ if(playerinfo(i,Name,MAX_NAME_LENGTH,UserID,WONID,Team,Dead,sAuthID) && streq(sAuthID,"BOT")){ if(Team==1){ TBot++; } else{ CTBot++; } } } return PLUGIN_CONTINUE; } kickbot(TBot,CTBot){ new iTplayers=getteamcount(TERROR); new iCTplayers=getteamcount(CT); new iBots; if(get_vaultnumdata("BK_BM_BOTS",iBots) && iBots<playercount() && TBot+CTBot!=0){ if(iTplayers>=iCTplayers && TBot>0){ removebot(TERROR); } else{ removebot(CT); } } return PLUGIN_CONTINUE; } removebot(Team){ new sPrefix[MAX_DATA_LENGTH]; new sKick[MAX_DATA_LENGTH]; get_vaultdata("BK_BM_PREFIX",sPrefix,MAX_DATA_LENGTH); if(Team==TERROR){ get_vaultdata("BK_BM_KICKT",sKick,MAX_DATA_LENGTH); if(getvar("admin_debug")>0){ log("[BK_BM] Removed bot from Terrorteam."); } } if(Team==CT){ get_vaultdata("BK_BM_KICKCT",sKick,MAX_DATA_LENGTH); if(getvar("admin_debug")>0){ log("[BK_BM] Removed bot from CTteam."); } } snprintf(sKick,MAX_DATA_LENGTH,"%s %s",sPrefix,sKick); exec(sKick); return PLUGIN_CONTINUE; } public plugin_disconnect(HLUserName, UserIndex){ new TBot=0; new CTBot=0; new iBots; if(get_vaultnumdata("BK_BM_BOTS",iBots) && !iBots){ if(getvar("admin_debug")>0){ log("[BK_BM] Adding bots automatically disabled. No bot added."); } return PLUGIN_CONTINUE; } checkbot(TBot,CTBot); startbot(TBot,CTBot); return PLUGIN_CONTINUE; } startbot(TBot,CTBot){ new iBots; if(get_vaultnumdata("BK_BM_BOTS",iBots) && iBots>TBot+CTBot && iBots>=playercount()){ set_timer("addbot",1,iBots-playercount()); } return PLUGIN_CONTINUE; } public addbot(Timer,Repeat,HLParam){ new iTplayers=getteamcount(TERROR); new iCTplayers=getteamcount(CT); new iBots; new sPrefix[MAX_DATA_LENGTH]; new sAdd[MAX_DATA_LENGTH]; if(get_vaultnumdata("BK_BM_BOTS",iBots) && iBots<=playercount()){ return PLUGIN_CONTINUE; } get_vaultdata("BK_BM_PREFIX",sPrefix,MAX_DATA_LENGTH); if(iTplayers<=iCTplayers){ get_vaultdata("BK_BM_ADDT",sAdd,MAX_DATA_LENGTH); if(getvar("admin_debug")>0){ log("[BK_BM] Added bot to Terrorteam."); } } else{ get_vaultdata("BK_BM_ADDCT",sAdd,MAX_DATA_LENGTH); if(getvar("admin_debug")>0){ log("[BK_BM] Added bot to CTteam."); } } snprintf(sAdd,MAX_DATA_LENGTH,"%s %s",sPrefix,sAdd); exec(sAdd); return PLUGIN_CONTINUE; } public addbotsmc(Timer,Repeat,HLParam) { new TBot=0; new CTBot=0; checkbot(TBot,CTBot); startbot(TBot,CTBot); return PLUGIN_CONTINUE; } public kickbots(Timer,Repeat,HLParam) { new TBot=0; new CTBot=0; checkbot(TBot,CTBot); kickbot(TBot,CTBot); return PLUGIN_CONTINUE; } public admin_bot_addct(HLCommand,HLData,HLUserName,UserIndex){ new sAdd[MAX_DATA_LENGTH]; new sPrefix[MAX_DATA_LENGTH]; if(maxplayercount()==playercount()){ selfmessage("Server full! Adding Bot failed."); return PLUGIN_HANDLED; } get_vaultdata("BK_BM_PREFIX",sPrefix,MAX_DATA_LENGTH); get_vaultdata("BK_BM_ADDCT",sAdd,MAX_DATA_LENGTH); snprintf(sAdd,MAX_DATA_LENGTH,"%s %s",sPrefix,sAdd); exec(sAdd); if(getvar("admin_debug")>0){ log("[BK_BM] Added bot to CTteam."); } return PLUGIN_HANDLED; } public admin_bot_addt(HLCommand,HLData,HLUserName,UserIndex){ new sAdd[MAX_DATA_LENGTH]; new sPrefix[MAX_DATA_LENGTH]; if(maxplayercount()==playercount()){ selfmessage("Server full! Adding Bot failed."); return PLUGIN_HANDLED; } get_vaultdata("BK_BM_PREFIX",sPrefix,MAX_DATA_LENGTH); get_vaultdata("BK_BM_ADDT",sAdd,MAX_DATA_LENGTH); snprintf(sAdd,MAX_DATA_LENGTH,"%s %s",sPrefix,sAdd); exec(sAdd); if(getvar("admin_debug")>0){ log("[BK_BM] Added bot to Terrorteam."); } return PLUGIN_HANDLED; } public admin_bot_removect(HLCommand,HLData,HLUserName,UserIndex){ removebot(CT); return PLUGIN_HANDLED; } public admin_bot_removet(HLCommand,HLData,HLUserName,UserIndex){ removebot(TERROR); return PLUGIN_HANDLED; } public admin_bot_command(HLCommand,HLData,HLUserName,UserIndex){ new sValue[MAX_DATA_LENGTH]; new sPrefix[MAX_DATA_LENGTH]; get_vaultdata("BK_BM_PREFIX",sPrefix,MAX_DATA_LENGTH); convert_string(HLData,sValue,MAX_DATA_LENGTH); snprintf(sValue,MAX_DATA_LENGTH,"%s %s",sPrefix,sValue); exec(sValue); return PLUGIN_HANDLED; } public admin_bot_set(HLCommand,HLData,HLUserName,UserIndex){ new sValue[MAX_DATA_LENGTH]; new iValue,iBots; new sBotCvar[MAX_DATA_LENGTH]; convert_string(HLData,sValue,MAX_DATA_LENGTH); strbreak(sValue,sBotCvar,sValue,MAX_DATA_LENGTH); strtrim(sValue," ",2); strtrim(sBotCvar," ",2); if(strcasecmp(sBotCvar,"bots")==0){ iValue=min(max(strtonum(sValue),0),maxplayercount()); if(get_vaultnumdata("BK_BM_BOTS",iBots) && iBots<iValue){ set_vaultnumdata("BK_BM_BOTS",iValue); new TBot=0; new CTBot=0; checkbot(TBot,CTBot); startbot(TBot,CTBot); numtostr(iValue,sValue); if(getvar("admin_debug")>0){ log("[BK_BM] Maximum bot count changed. Filling up."); } } else if(iBots>iValue){ set_vaultnumdata("BK_BM_BOTS",iValue); set_timer("kickbots",1,iBots-iValue); numtostr(iValue,sValue); if(getvar("admin_debug")>0){ log("[BK_BM] Maximum bot count changed. Removing."); } } } setorinfo(sBotCvar,sValue); return PLUGIN_HANDLED; } /* Rückgabe und Schreiben von Pluginsettings */ setorinfo(sBotCvar[],sValue[]){ new aCommands[6][MAX_COMMAND_LENGTH]={"PREFIX","ADDCT","ADDT","KICKCT","KICKT","BOTS"}; new i; new Text[MAX_TEXT_LENGTH]; selfmessage("Bot-Einstellungen:"); for(i=0;i<=5;i++){ strcpy(Text,"BK_BM_",MAX_TEXT_LENGTH); strcat(Text,aCommands[i],MAX_TEXT_LENGTH); /* Überprüfen, ob Variable gesetzt werden muss */ if(!strcasecmp(sBotCvar,aCommands[i]) && strlen(sValue)!=0) { set_vaultdata(Text,sValue); } /* Aktuellen Wert ausgeben */ get_vaultdata(Text,Text,MAX_TEXT_LENGTH); snprintf(Text,MAX_TEXT_LENGTH,"%s %s",aCommands[i],Text); selfmessage(Text); } return PLUGIN_CONTINUE; } public plugin_init() { /* Plugin Registrierung */ plugin_registerinfo("BK Botmanager","Adds and removes bots automatically.",STRING_VERSION); plugin_registercmd("admin_bot_addct","admin_bot_addct",ACCESS_CONFIG,"admin_bot_addct"); plugin_registercmd("admin_bot_addt","admin_bot_addt",ACCESS_CONFIG,"admin_bot_addt"); plugin_registercmd("admin_bot_removect","admin_bot_removect",ACCESS_CONFIG,"admin_bot_removect"); plugin_registercmd("admin_bot_removet","admin_bot_removet",ACCESS_CONFIG,"admin_bot_removet"); plugin_registercmd("admin_bot_kickct","admin_bot_removect",ACCESS_CONFIG,"admin_bot_kickct"); plugin_registercmd("admin_bot_kickt","admin_bot_removet",ACCESS_CONFIG,"admin_bot_kickt"); plugin_registercmd("admin_bot_set","admin_bot_set",ACCESS_CONFIG,"admin_bot_set <option>"); plugin_registercmd("admin_bot_command","admin_bot_command",ACCESS_CONFIG,"admin_bot_command <option>"); if(!is_vaultfile_set()){ new sPath[MAX_DATA_LENGTH]; getstrvar("amv_default_config_dir",sPath,MAX_DATA_LENGTH); snprintf(sPath,MAX_DATA_LENGTH,"%s/%s",sPath,"vault.ini"); setstrvar("admin_vault_file",sPath); plugin_exec("admin_reload",""); if(getvar("admin_debug")>0){ log("[BK_BM] Defined vault.ini myself."); } } new iBots; if(!get_vaultnumdata("BK_BM_BOTS",iBots)){ set_vaultnumdata("BK_BM_BOTS",0); if(getvar("admin_debug")>0){ log("[BK_BM] Basic setting missing in vault.ini. Creating new."); } } set_timer("addbotsmc",15,0); return PLUGIN_CONTINUE; }