AdminMod.de
https://www.adminmod.de/

Default_access switch v1.0
https://www.adminmod.de/viewtopic.php?t=3228
Seite 1 von 2

Autor:  [WING] Black Knight [ 05.06.2002, 20:51 ]
Betreff des Beitrags:  Default_access switch v1.0

Hi,

ich schon wieder. Genau der, der die ganzen nutzlosen Plugins produziert. Heute darf ich Euch wieder mit einem Plugin dieser Sorte beehren.
Das Plugin ist dafür da den Server attraktiver zu machen, solange kein Admin online ist.
Wir hatten früher den default_access auf 1 gehabt. Damit war jedermann auf dem Server berechtigt Mapvotes und Kickvotes zu starten. Wenn wir dann online waren, war das ziemlich nervig. Daher wurde das abgestellt (default_access 1). Nun sind wir aber nicht immer online und man hätte doch gerne, dass sich die Stammspieler auch wehren können, wenn kein Admin da ist.
Genau hier setze ich an. Sobald ein Admin connected wird default_access auf 0 gesetzt und sobald der letzte verschwindet wieder zurück auf 1.
Also, damit Ihr Euch ein genaueres Bild machen könnt hier der Code:
Code:
/* Default access switch.
Changes default_access to 0, if admin is entering the server and back to 1 if the last admin disconnects. 
v1.0 by [WING]Black Knight, 5.6.2002 */

#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
#define ACCESS_CONSOLE 131072

new STRING_VERSION[MAX_DATA_LENGTH] = "v1.0";

new admins=0;
new Message0[MAX_TEXT_LENGTH]="Admin online! admin_vote_kick, admin_vote_map and say rockthevote disabled";
new Message1[MAX_TEXT_LENGTH]="Admin offline! admin_vote_kick, admin_vote_map and say rockthevote enabled";

public default_entered(HLCommand, HLData){
	new WONID;
	new strUserIndex[MAX_TEXT_LENGTH];
	new UserIndex;
	new strName[MAX_NAME_LENGTH];
	new UserID;
	new Team;
	new Dead;
	new wert[MAX_TEXT_LENGTH];

	convert_string(HLData, strUserIndex, MAX_TEXT_LENGTH);
	UserIndex=strtonum(strUserIndex);
	playerinfo(UserIndex, strName, MAX_NAME_LENGTH, UserID, WONID, Team, Dead);
	if(access(ACCESS_RESERVE_SPOT,strName)) {
		if(admins==0){
			exec("default_access 0");
			say(Message0);
		}
		admins++;
	}
	else {
		getstrvar("default_access",wert, MAX_TEXT_LENGTH);
		if(streq(wert,"0")){
			message(strName,Message0);
		}
		else{
			message(strName,Message1);
		}
	}
	return PLUGIN_CONTINUE;
}

public default_disconnect(HLCommand, HLData){
	new WONID;
	new strUserIndex[MAX_TEXT_LENGTH];
	new UserIndex;
	new strName[MAX_NAME_LENGTH];
	new UserID;
	new Team;
	new Dead;

	convert_string(HLData, strUserIndex, MAX_TEXT_LENGTH);
	UserIndex=strtonum(strUserIndex);
	playerinfo(UserIndex, strName, MAX_NAME_LENGTH, UserID, WONID, Team, Dead);
	if(access(ACCESS_RESERVE_SPOT,strName)) {
		if(admins==1){
			exec("default_access 1");
			say(Message1);
		}
		admins--;
	}
	return PLUGIN_CONTINUE;
}

public plugin_init() {
	plugin_registerinfo("Default Access Switch","default_access switch while away",STRING_VERSION);
	plugin_registercmd("default_entered","default_entered",ACCESS_CONSOLE,"");
	plugin_registercmd("default_disconnect","default_disconnect",ACCESS_CONSOLE,"");

	exec("logd_reg 52 admin_command default_disconnect");
	exec("logd_reg 51 admin_command default_entered");

	return PLUGIN_CONTINUE;
}
Seht es mir nach, wenn das Plugin nicht superstrukturiert ist. Ich bin ja noch nicht so bewandert.

Als Admin gilt, wer das Recht für einen reservierten Slot hat. Ich glaube, dass ich das wichtigste bedacht habe.
Wer noch Fragen hat oder Bugs findet, bitte melden.

BTW, ich habe LogD verwendet, da mir die AdminMod Funktionen zu unsicher sind. Die werden nicht immer ausgeführt. Ob das jetzt ein allgemeines oder nur ein spezielles Problem ist, weiß ich nicht. So geht's jedenfalls.

Autor:  Sir Drink a lot [ 06.06.2002, 10:24 ]
Betreff des Beitrags: 

Mir ist heute morgen noch dazu eingefallen, dass diese Vorgehensweise dazu wunderbar dient, Admins zu announcen !

Dieser Wunsch wurde ja schon oft in Plugin Request geäussert. Jetzt kann man ja schnell noch ein :
[SNIP]
Code:
new Msg[MAX_TEXT_LENGTH];
snprintf(Msg,MAX_TEXT_LENGTH,"Der Admin %s hat gerade das Spiel betreten",strName);
typesay(Msg,12,255,255,255);
.....
[/SNIP]
in den if(access....) einbauen und vielleicht noch eine schönen Sound

[SNIP]
Code:
/* eigene Funktion, um bei allen Spielern einen Sound abzuspielen*/
public playsoundall(sound[])
{
	new maxplayers = maxplayercount();
	new Name[MAX_NAME_LENGTH];
	new i;

	for(i=1; i<=maxplayers; i++)
	{
		if(playerinfo(i, Name, MAX_NAME_LENGTH) == 1)
		{
			playsound(Name, sound);
		}
	}
}

/*und diese kleine Befehlszeile noch nach dem typesay von oben eintragen:*/

....
playsoundall(misc/hibabe.wav);
[/SNIP]
Das selbe dann jetzt nochmal beim default_dissconnect und fertig :-)

Autor:  MrClone [ 06.06.2002, 13:26 ]
Betreff des Beitrags:  Re: Default_access switch v1.0

nur schnell mal ne newbie frage:
"admins++" heißt doch +1 oder? warum schreibt man dann nicht +1?
Was gibt es denn noch für Befehle?
== entspricht gleich
>= größer gleich
> größer
<= kleiner gleich
< kleiner
+ - / * = weis ja jeder,
&& = und ?
|| = oder ?
was gibt es noch für wichtige?

Autor:  [WING] Black Knight [ 06.06.2002, 15:31 ]
Betreff des Beitrags: 

Hmm,

ich würde den Code nicht für das Ankündigen von Admins verwenden. Die werden nämlich sonst nach jedem Mapwechsel nochmal angekündigt.

Autor:  sentinel [ 06.06.2002, 15:55 ]
Betreff des Beitrags: 

ist ja schon toll das ganze.
aber kann das mal einer von euch als ein ganzes plugin sma erstellen?
ich habe nämlich überhaupt kein plan von der ganzen programiererei.
bitte,bitte :cry:

Autor:  Sir Drink a lot [ 06.06.2002, 16:20 ]
Betreff des Beitrags: 

!= nicht gleich

aber ist doch ok. wenn sie auch nach mapchange announced werden. Dann weiss jeder, was Sache ist :-)

Können wir nachher ja mal in GV bequatschen.

Autor:  [WING] Black Knight [ 07.06.2002, 23:20 ]
Betreff des Beitrags: 

Nochmal zurück zu meinem Plugin.

Leider hat es nicht besonders zuverlässig funktioniert. Ich musste daher auf eine sicherere Methode ausweichen. Nimmt mehr Rechenzeit in Anspruch, aber läuft bisher zuverlässig.
Code:
/* Default access switch.
Changes default_access to 0, if admin is entering the server and back to 1 if the last admin disconnects. 
v1.1 by [WING]Black Knight, 6.6.2002 */

#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
#define ACCESS_CONSOLE 131072

new STRING_VERSION[MAX_DATA_LENGTH] = "v1.1";

public default_entered(HLCommand, HLData){
	new strName[MAX_NAME_LENGTH];
	new UserIndex;
	new strUserIndex[MAX_TEXT_LENGTH];

	convert_string(HLData, strUserIndex, MAX_TEXT_LENGTH);
	UserIndex=strtonum(strUserIndex);
	playerinfo(UserIndex, strName, MAX_NAME_LENGTH);

	pruef(strName);

	return PLUGIN_CONTINUE;
}

public pruef(strName[]){
	new maxplayers = maxplayercount();
	new admins=0;
	new Message0[MAX_TEXT_LENGTH]="Admin online! admin_vote_kick, admin_vote_map and say rockthevote disabled";
	new Message1[MAX_TEXT_LENGTH]="Admin offline! admin_vote_kick, admin_vote_map and say rockthevote enabled";
	new wert[MAX_TEXT_LENGTH];
	new i;

	for(i=1; i<=maxplayers; i++) {
		strinit(strName);
		if(playerinfo(i,strName,MAX_NAME_LENGTH)==1) {
			if(access(ACCESS_BAN,strName)!=0) {
				admins++;
			}
		}
	}
	getstrvar("default_access",wert, MAX_TEXT_LENGTH);
	if(admins==1){
		if(streq(wert,"1")){
			exec("default_access 0");
			say(Message0);
		}
		else{
			message(strName,Message0);
		}
	}
	else if(admins==0){
		if(streq(wert,"0")){
			exec("default_access 1");
			say(Message1);
		}
		else{
			message(strName,Message1);
		}
	}
	else{
		if(streq(wert,"0")){
			message(strName,Message0);
		}
		else{
			message(strName,Message1);
		}
	}
}

public plugin_init() {
	plugin_registerinfo("Default Access Switch","default_access switch while away",STRING_VERSION);
	plugin_registercmd("default_entered","default_entered",ACCESS_CONSOLE,"");

	exec("logd_reg 52 admin_command default_entered");
	exec("logd_reg 51 admin_command default_entered");

	return PLUGIN_CONTINUE;
}

Autor:  Sir Drink a lot [ 08.06.2002, 02:03 ]
Betreff des Beitrags: 

wie gesagt, finde ich die 1000tnstel Sekunde an Rechenzeit mehr, nicht so schlimm... :lol:

Aber es laüft bisher ohne Pobs!

Autor:  daRope [ 08.06.2002, 10:06 ]
Betreff des Beitrags: 

Vielleicht hat es nicht "zuverlaessig" funktioniert, weil Du es einfach falsch geschrieben hast. Wenn Du die Version verwendest, die Du hier gepostet hast, dann wundert mich nicht, wenn das nicht tut. Kuck Dir das noch mal in Ruhe an. Du setzt default_access genau an den falschen Stellen.

Zu der Behauptung, dass plugin_connect() und plugin_disconnect() nicht immer ausgefuehrt werden, haette ich gerne ein Log. Das kann man ja z.B. mit einem Testplugin seperat schreiben lassen.


Und zu guter letzt: +, -, *, /, &&, +=, usw. sind keine Befehle sondern Operatoren.

Autor:  MrClone [ 08.06.2002, 10:34 ]
Betreff des Beitrags: 

ja, mein ich ja ;)

Autor:  [WING] Black Knight [ 08.06.2002, 11:38 ]
Betreff des Beitrags: 

Hmmm, daRope bringt mich wieder ins grübeln.
Zitat:
BTW, ich habe LogD verwendet, da mir die AdminMod Funktionen zu unsicher sind. Die werden nicht immer ausgeführt.
Das bezieht sich eigentlich nur auf plugin_disconnect. plugin_connect funktioniert einwandfrei, ist aber für meine Anwendung ungeeignet. Ich werde mal sehen, dass ich die Tage eine Logfunktion für plugin_disconnect einbaue.

Irgendwie kann ich aber den Logikfehler in v1.0 nicht finden. Eine wichtige Sache habe ich dabei vergessen. default_access muss standardmäßig auf 1 gesetzt sein.
Code:
default_entered:
Überprüfe, ob Spieler reservierten Slot hat. {
  Wenn ja, überprüfe, ob die Anzahl der Admins derzeit Null ist. {
    Wenn ja, schalte die erweiterten Rechte ab (default_access 0), da jetzt Admin online.
    Gib es allgemein bekannt.
  }
  Erhöhe die Anzahl der Admins um 1
}
Hat er keinen reservierten Slot {
  Lese die Variable default_access aus
  Überprüfe, ob diese 0 ist {
    Informiere den Connectenden, dass die erweiterten Rechte abgeschaltet sind.
  }
  Ist default_access nicht 0 {
    Informiere den Connectenden, dass die erweiterten Rechte angeschaltet sind.
  }
}

default_disconnect:
Überprüfe, ob der das Spiel Verlassende einen reservierten Slot hat {
  Wenn ja, überprüfe, ob er der letzte Admin ist (admins==1) {
    Wenn ja, schalte die erweiterten Rechte an.
    Gib es öffentlich bekannt.
  }
  Erniedrige die Zahl der Admins um einen (also 0)
}
Jetzt finde ich irgendwie aber den Logikfehler nicht. Ein Problem könnte sein, dass nach dem Mapwechsel die Admins in zu kurzer Reihenfolge ins Spiel kommen, dass diese Routine nicht nachkommt. Andererseits hat das default_disconnect die If-Schleife bei Personen OHNE reservierten Slot durchlaufen. Das könnte darauf hindeuten, dass das playerinfo zu spät war und der Spieler nicht mehr vorhanden war. Aber eigentlich hatten Sir Drink a lot und ich das durchgetestet und keine Probleme feststellen können. Im Testlauf ging es einwandfrei. Nur in der echten Praxis läuft es nicht so, wie es soll.

Autor:  Sir Drink a lot [ 08.06.2002, 13:03 ]
Betreff des Beitrags: 

hm...

ich habe mir gerade gedacht, wozu man eigentlich den Zähler braucht.

Man kann das getstrvar mit in die Schleife einbauen und man braucht den Zähler gar nicht.

Oder sehe ich das falsch.

Oder noch anders....wofür mit getstrvar default_access auslesen?

Einfach nur 0 setzen, wenn es ein Admin ist. Wenn der Admin wieder den Server verlässt, auf 1 setzen.

Autor:  [WING] Black Knight [ 08.06.2002, 14:52 ]
Betreff des Beitrags: 

Und woher weißt Du, ob nicht noch andere Admins online sind?

Autor:  Sir Drink a lot [ 08.06.2002, 15:52 ]
Betreff des Beitrags: 

wenn man doch eine Schleife über alle Spieler macht und einer den Access-Level hat, kann man admin=1 setzen und ein break; machen.

Dann fragt man admin ab. Bei 1 ist ein Admin da bei !1 kein Admin...

beim Disconnect macht man das selbe und bei !1 kann man ein Typesay an alle Spieler ausgeben.

Ich schicke es Dir nachher mal über ICQ zu.

Autor:  [WING] Black Knight [ 08.06.2002, 16:50 ]
Betreff des Beitrags: 

Dann schau Dir mal v1.1 an. Aber genau diese Schleife wollte ich verhindern.

Autor:  sentinel [ 08.06.2002, 17:25 ]
Betreff des Beitrags: 

JA JA WOLLTE DA NICHT JEMAND MAL ALLES ZUSAMMEN BAUEN DAMIT SON LEIE UND NICHTSKAPIERER DAS PLUGIN EINFACH NUTZEN KANN? :D

Autor:  [WING] Black Knight [ 08.06.2002, 17:46 ]
Betreff des Beitrags: 

Kleiner Bugfix gefunden von Sir Drink a lot, der das alles GAAAAANZ anders gemacht hätte :wink: :
Code:
/* Default access switch.
Changes default_access to 0, if admin is entering the server and back to 1 if the last admin disconnects. 
v1.1 by [WING]Black Knight, 6.6.2002 */

#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
#define ACCESS_CONSOLE 131072

new STRING_VERSION[MAX_DATA_LENGTH] = "v1.1";

public default_entered(HLCommand, HLData){
	new strName[MAX_NAME_LENGTH];
	new UserIndex;
	new strUserIndex[MAX_TEXT_LENGTH];

	convert_string(HLData, strUserIndex, MAX_TEXT_LENGTH);
	UserIndex=strtonum(strUserIndex);
	playerinfo(UserIndex, strName, MAX_NAME_LENGTH);

	pruef(strName);

	return PLUGIN_CONTINUE;
}

public pruef(strName[]){
	new maxplayers = maxplayercount();
	new admins=0;
	new Message0[MAX_TEXT_LENGTH]="Admin online! admin_vote_kick, admin_vote_map and say rockthevote disabled";
	new Message1[MAX_TEXT_LENGTH]="Admin offline! admin_vote_kick, admin_vote_map and say rockthevote enabled";
	new wert[MAX_TEXT_LENGTH];
	new strName2[MAX_TEXT_LENGTH];
	new i;

	for(i=1; i<=maxplayers; i++) {
		strinit(strName2);
		if(playerinfo(i,strName,MAX_NAME_LENGTH)==1) {
			if(access(ACCESS_BAN,strName2)!=0) {
				admins++;
			}
		}
	}
	getstrvar("default_access",wert, MAX_TEXT_LENGTH);
	if(admins==1){
		if(streq(wert,"1")){
			exec("default_access 0");
			say(Message0);
		}
		else{
			message(strName,Message0);
		}
	}
	else if(admins==0){
		if(streq(wert,"0")){
			exec("default_access 1");
			say(Message1);
		}
		else{
			message(strName,Message1);
		}
	}
	else{
		if(streq(wert,"0")){
			message(strName,Message0);
		}
		else{
			message(strName,Message1);
		}
	}
}

public plugin_init() {
	plugin_registerinfo("Default Access Switch","default_access switch while away",STRING_VERSION);
	plugin_registercmd("default_entered","default_entered",ACCESS_CONSOLE,"");

	exec("logd_reg 52 admin_command default_entered");
	exec("logd_reg 51 admin_command default_entered");

	return PLUGIN_CONTINUE;
}

Autor:  sentinel [ 08.06.2002, 18:35 ]
Betreff des Beitrags: 

da is immer noch kein sound dabei

Autor:  daRope [ 08.06.2002, 18:41 ]
Betreff des Beitrags: 

Zitat:
Ich werde mal sehen, dass ich die Tage eine Logfunktion für plugin_disconnect einbaue.
"Die Tage" is'n bisschen spaet.

Warum verwendest Du getstrvar() um eine numerische Variable auszulesen?

In Deiner Schleife wuerde ich auf (admins > 1) statt (admins == 1) testen.

Autor:  [WING] Black Knight [ 08.06.2002, 20:05 ]
Betreff des Beitrags: 

Zitat:
"Die Tage" is'n bisschen spaet.
OK, OK! Ich mach es ja gleich. Nur nicht hetzen... sonst muss ich schon wieder ein Bugfix nachschieben. :wink:
Zitat:
Warum verwendest Du getstrvar() um eine numerische Variable auszulesen?
Weil ich getvar() übersehen habe. :( Sorry, mach ich gleich in Ordnung.
Zitat:
In Deiner Schleife wuerde ich auf (admins > 1) statt (admins == 1) testen.
Kann man machen. Wäre vielleicht günstiger, falls bei HL etwas schief läuft. Mach ich. Außerdem hat SDal noch einen guten Vorschlag gemacht. Vielleicht gibt es nachher noch eine neue Version. Danke für die Hinweise.

Seite 1 von 2 Alle Zeiten sind UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/