falko-hartmann.de

Black Knight's Psychostats Plugin v1.1

Beschreibung

Öffnet Psychostats 2.x im MOTD-Window per Chat bzw. Console.

Features:


Download

plugin_bk_psychostats


Installation

  1. Stellt sicher, dass AdminMod 2.50.59 oder neuer installiert ist.
  2. Stellt sicher, dass Psychostats 2.0 beta oder neuer verfügbar ist.
  3. Plugin compilieren
  4. plugin_bk_psychostats.amx aus "mybinaries" in den Serverordner "addons/adminmod/scripts" installieren.
  5. Mapchange

Zusätzliche Schritte für ältere PS Versionen:

Ich weiß nicht, ob dies direkt auch mit PS 2.1 und 2.0 funktioniert. Daher habe ich auch die alte Methode noch zur Verfügung gestellt. Wenn irgendwelche Probleme mit älteren PS versionen auftreten, sollte folgendes gemacht werden:

Gehe ins "old" Verzeichnis, das in dieser Plugindistribution zu finden ist und editiere die "configadminmod.php", so dass sie den eigenen Wünschen entspricht, und lade sie inklusive der "adminmod.php" auf den Webserver. Für PS 2.0 muss in der "configadminmod.php" noch "player.php?id=" in "index.php?page=plr&id=" geändert werden.

Außerdem muss plugin_bk_psychostats.sma mit einen Texteditor geöffnet werden und

#define OLD 0
in
#define OLD 1
geändert und anschließend neu compiliert werden.


Befehle

Für die Konfiguration mittels admin_ps_set braucht Ihr das Recht 512!

admin_ps_set <Option> <Wert>:
Mittels dieses Befehls wird die Konfiguration durchgeführt. Lässt man den Wert weg, wird der aktuelle Wert der Option angezeigt, lässt man alles weg, werden alle möglichen Optionen angezeigt, welche wären:
PREFIX
Legt die Signalbuchstaben fest. Normalerweise ist dies "." oder "/", so dass man im Chat "/stats" oder ".stats" sagt. Ist ein Buchstabe nicht in der aktuellen Liste, wird er hinzugefügt anderenfalls gelöscht. Es können bis zu zehn Signalbuchstaben eingegeben werden.
STATSME
Legt die Signalwörter für die persönliche Statistik fest. Normalerweise sind dies "stats" oder "statsme", so dass man im Chat "/stats" oder "/statsme" sagt. Ist ein Wort nicht in der aktuellen Liste, wird es hinzugefügt anderenfalls gelöscht. Es können bis zu zehn Signalwörter eingegeben werden.
RANK
Legt die Signalwörter für die globale Statistik fest. Normalerweise sind dies "rank" oder "top10", so dass man im Chat "/rank" oder "/top10" sagt. Ist ein Wort nicht in der aktuellen Liste, wird es hinzugefügt anderenfalls gelöscht. Es können bis zu zehn Signalwörter eingegeben werden.
URL
Spezifiziere hier die URL, wo sich die adminmod.php befindet. Vergesse nicht die adminmod.php selbst anzuhängen!
admin_stats <ID>:
Der Befehl ohne ID gibt die eigenen Statistiken aus. Schreib einen Teil des Namens eines Mitspielers hinter den Befehl, um seine Statistik zu Gesicht zu bekommen. Man kann auch Spieler nachschauen, wenn sie offline sind, wenn man stattdessen ihre ID (WON/Steam) angibt.
say <Signalwort> <ID>:
Das Signalwort ohne ID gibt die eigenen Statistiken aus. Schreib einen Teil des Namens eines Mitspielers hinter das Signalwort, um seine Statistik zu Gesicht zu bekommen. Man kann auch Spieler nachschauen, wenn sie offline sind, wenn mann stattdessen ihre ID (WON/Steam) angibt.

Quellcode

plugin_bk_psychostats.sma:

#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
 
#define MAX_CMDS 10
#define MAX_OPTS 4
 
/* Set this to 1, if you want to use the old method */
#define OLD 0
 
new STRING_VERSION[MAX_DATA_LENGTH] = "1.1";
 
new gsKeywordsMe[MAX_CMDS][MAX_COMMAND_LENGTH];
new gsKeywordsRank[MAX_CMDS][MAX_COMMAND_LENGTH];
new gsURL[MAX_DATA_LENGTH];
new gsPrefix[MAX_CMDS][MAX_COMMAND_LENGTH];
new giKeywordsMe,giKeywordsRank,giPrefix;
 
display_array(iNumber,aArray[MAX_CMDS][]){
	for(new i=0;i<iNumber;i++){
		selfmessage(aArray[i]);
	}
	return PLUGIN_CONTINUE;
}
 
change_array(sVault[],sValue[],iNumber,aArray[][]){
	new sData[MAX_DATA_LENGTH]="";
	new iMerk=0;
 
	for(new i=0;i<iNumber;i++){
		if(strcmp(aArray[i],sValue)!=0){
			strcat(sData,aArray[i],MAX_DATA_LENGTH);
			strcat(sData," ",MAX_DATA_LENGTH);
		}
		else{
			iMerk=1;
		}
	}
	if(!iMerk){
		strcat(sData,sValue,MAX_DATA_LENGTH);
	}
	else{
		strtrim(sData," ",1);
	}
 
	set_vaultdata(sVault,sData);
 
	load_data();
 
	return PLUGIN_CONTINUE;
}
 
change_value(sText[],sValue[]){
 
	set_vaultdata(sText,sValue);
	strcpy(gsURL,sValue,MAX_DATA_LENGTH);
 
	return PLUGIN_CONTINUE;
}
 
 
public admin_ps_set(HLCommand,HLData,HLUserName,UserIndex){
	new aCommands[MAX_OPTS][MAX_COMMAND_LENGTH]={"PREFIX","STATSME","STATSRANK","URL"};
	new sText[MAX_TEXT_LENGTH];
	new iMerk=-1;
	new sValue[MAX_DATA_LENGTH];
	new sCvar[MAX_DATA_LENGTH];
	new sUser[MAX_NAME_LENGTH];
 
	convert_string(HLData,sValue,MAX_DATA_LENGTH);
	convert_string(HLUserName,sUser,MAX_NAME_LENGTH);
	strbreak(sValue,sCvar,sValue,MAX_DATA_LENGTH);
	strtrim(sValue," ",2);
	strtrim(sCvar," ",2);
 
	for(new i=0;i<MAX_OPTS;i++){
		if(strcasecmp(aCommands[i],sCvar)==0){
			iMerk=i;
		}
	}
 
	if(iMerk<0 && strlen(sCvar)>0){
		selfmessage("Option not found!");
		strinit(sCvar);
	}
 
	if(!strlen(sCvar)){
		selfmessage("Possible Options:");
		for(new i=0;i<MAX_OPTS;i++){
			selfmessage(aCommands[i]);
		}
		return PLUGIN_HANDLED;
	}
 
	if(!strlen(sValue)){
		snprintf(sText,MAX_TEXT_LENGTH,"Current value(s) of option %s:",aCommands[iMerk]);
		selfmessage(sText);
		switch (iMerk) {
			case 0:
				display_array(giPrefix,gsPrefix);
			case 1:
				display_array(giKeywordsMe,gsKeywordsMe);
			case 2:
				display_array(giKeywordsRank,gsKeywordsRank);
			case 3:
				selfmessage(gsURL);
		}
		return PLUGIN_HANDLED;
	}
 
	snprintf(sText,MAX_TEXT_LENGTH,"BK_PS_%s",aCommands[iMerk]);
 
	switch (iMerk) {
		case 0:
			change_array(sText,sValue,giPrefix,gsPrefix);
		case 1:
			change_array(sText,sValue,giKeywordsMe,gsKeywordsMe);
		case 2:
			change_array(sText,sValue,giKeywordsRank,gsKeywordsRank);
		case 3:
			change_value(sText,sValue);
	}
	selfmessage("Option changed");
 
	return PLUGIN_HANDLED;
}
 
public admin_stats(HLCommand,HLData,HLUserName,UserIndex) {
	new sData[MAX_DATA_LENGTH];
	new sPrefix[MAX_DATA_LENGTH];
	new sCommand[MAX_COMMAND_LENGTH];
	new sName[MAX_NAME_LENGTH];
	new sRest[MAX_DATA_LENGTH]="";
	new iPrefix=-1;
 
	convert_string(HLCommand,sCommand,MAX_COMMAND_LENGTH);
	convert_string(HLData,sData,MAX_DATA_LENGTH);
	convert_string(HLUserName,sName,MAX_NAME_LENGTH);
	strstripquotes(sData);
 
	if(streq(sCommand,"say")){
		if(!giPrefix || !giKeywordsMe || !giKeywordsRank){
			return PLUGIN_CONTINUE;
		}
		strncpy(sPrefix,sData,1,MAX_DATA_LENGTH);
		for(new i=0;i<giPrefix;i++){
			if(streq(sPrefix,gsPrefix[i])){
				iPrefix=i;
				break;
			}
		}
		if(iPrefix<0){
			return PLUGIN_CONTINUE;
		}
		strtrim(sData,gsPrefix[iPrefix],0);
		if(strcount(sData,' ')>0){
			strbreak(sData,sData,sRest,MAX_DATA_LENGTH);
		}
		for(new i=0;i<giKeywordsMe;i++){
			if(streq(sData,gsKeywordsMe[i])){
				if(!strlen(sRest)){
					get_userAuthID(sName,sRest,MAX_AUTHID_LENGTH);
				}
				else{
					get_username(sName,sName,MAX_NAME_LENGTH);
					get_userAuthID(sName,sRest,MAX_AUTHID_LENGTH);
				}
				open_motd(sRest,sName,0);
				return PLUGIN_HANDLED;
			}
		}
		for(new i=0;i<giKeywordsRank;i++){
			if(streq(sData,gsKeywordsRank[i])){
				get_username(sName,sName,MAX_NAME_LENGTH);
				open_motd("",sName,1);
				return PLUGIN_HANDLED;
			}
		}
		return PLUGIN_CONTINUE;
	}
	if(strcount(sData,' ')>0){
		strbreak(sData,sData,sRest,MAX_DATA_LENGTH);
	}
	if(!strlen(sRest)){
		get_userAuthID(sName,sRest,MAX_AUTHID_LENGTH);
	}
	else{
		get_username(sName,sName,MAX_NAME_LENGTH);
		if(!get_userAuthID(sName,sRest,MAX_AUTHID_LENGTH)){
			strcpy(sRest,sName,MAX_AUTHID_LENGTH);
		}
	}
	open_motd(sRest,sName,0);
 
	return PLUGIN_HANDLED;
}
 
open_motd(sAuthID[],sName[],iSite){
	new sText[2048]="<html>^n<head>^n<meta http-equiv=^"REFRESH^" content=^"0;url=%s^">^n</head>^n<body>^n<div>Searching...</div>^n</body>^n</html>";
#if OLD == 1
	new sURL[MAX_TEXT_LENGTH]="%s?site=%d&id=%s";
	snprintf(sURL,MAX_TEXT_LENGTH,sURL,gsURL,iSite,sAuthID);
#else
	new sURL[MAX_TEXT_LENGTH];
	if(iSite){
		strcpy(sURL,gsURL,MAX_TEXT_LENGTH);
	}
	else{
		snprintf(sURL,MAX_TEXT_LENGTH,"%s?andor=exact&search=%s",gsURL,sAuthID);
	}
#endif
	snprintf(sText,2048,sText,sURL);
	motd(sName,sText);
	execclient(sName,"escape");
 
	return PLUGIN_CONTINUE;
}
 
public plugin_init() {
	new sData[MAX_DATA_LENGTH];
 
	plugin_registerinfo("BKs Psychostats Plugin","Opens Psychostats in Motd-Window",STRING_VERSION);
	plugin_registercmd("admin_ps_set","admin_ps_set",ACCESS_CONFIG,"admin_ps_set <Option> <Value>: Sets the options of psychostats plugin");
	plugin_registercmd("admin_stats","admin_stats",ACCESS_ALL,"admin_stats <ID>: Shows the stats of a certain person.");
	plugin_registercmd("say","admin_stats",ACCESS_ALL,"");
 
	if(!get_vaultdata("BK_PS_STATSME",sData,MAX_DATA_LENGTH)){
		set_vaultdata("BK_PS_URL","http://www.wing-clan.de/psstats/index.php");
		set_vaultdata("BK_PS_STATSME","stats");
		strcpy(sData,"stats",MAX_DATA_LENGTH);
		set_vaultdata("BK_PS_STATSRANK","rank");
		set_vaultdata("BK_PS_PREFIX","/");
	}
 
	load_data();
 
	return PLUGIN_CONTINUE;
}
 
extract_string(sData[],sArray[][]){
	new iKeywords;
	new i;
 
	strtrim(sData," ");
	iKeywords=strcount(sData,' ');
 
	if(iKeywords!=0){
		for(i=0;i<iKeywords;i++){
			strbreak(sData,sArray[i],sData,MAX_DATA_LENGTH,MAX_COMMAND_LENGTH,MAX_DATA_LENGTH);
		}
	}
	strcpy(sArray[iKeywords],sData,MAX_COMMAND_LENGTH);
	iKeywords++;
 
	return iKeywords;
}
 
load_data(){
	new sData[MAX_DATA_LENGTH];
 
	get_vaultdata("BK_PS_STATSME",sData,MAX_DATA_LENGTH);
	giKeywordsMe=extract_string(sData,gsKeywordsMe);
	get_vaultdata("BK_PS_STATSRANK",sData,MAX_DATA_LENGTH);
	giKeywordsRank=extract_string(sData,gsKeywordsRank);
	get_vaultdata("BK_PS_PREFIX",sData,MAX_DATA_LENGTH);
	giPrefix=extract_string(sData,gsPrefix);
	get_vaultdata("BK_PS_URL",gsURL,MAX_DATA_LENGTH);
 
	return PLUGIN_CONTINUE;
}