falko-hartmann.de

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:

Wichtig:


Download

plugin_bk_botmanager


Installation

  1. Kompilieren des Plugins
  2. Installation des Plugins (inkl. Eintrag in die plugin.ini)
  3. Mapchange
  4. 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; 
}