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

Spectator block / zeitbegrenzung
https://www.adminmod.de/viewtopic.php?t=8677
Seite 1 von 2

Autor:  ]|shadow|[ [ 29.06.2004, 20:22 ]
Betreff des Beitrags:  Spectator block / zeitbegrenzung

Ich suche ein plugin wo man nur als admin in den spectatormodus kann und gäste eventuell zeitbegrenzt. allerdings bin ich im forum nicht fündig geworden.

nun meine frage, giebt es sowas schon für adminmod oder kann mir jemand meine idee umsetzten?

das einzigste was ich gefunden habe war leider blos für amx:
Code:
/*Spectator Block by [AsC]Phil
*
*kleines Plugin um es nur noch den Admins zu ermöglichen, 
*den Spectatormode zu verwenden! Alle anderen können diesen 
*nicht mehr nutzen!
*
*Admins müssen ADMIN_RESERVATION (Flag "b") besitzen!
*
*amx_spectator 0/1     0 Off, 1 On
*/

#include <amxmod>

public admin_check(id, level, cid) { 
   if (!(get_user_flags(id)&ADMIN_RESERVATION) && (get_cvar_num("amx_spectator") == 1)){
      client_print(id,print_chat,"* Du kannst nicht in den Spectatormode gehen!")
      new sTeam[10]
      get_user_info(id,"team",sTeam,9)
      if (equal(sTeam,"")) client_cmd(id,"chooseteam")

      return PLUGIN_HANDLED
   }
   return PLUGIN_CONTINUE
}


public plugin_init() {
        register_plugin("Spectator Block", "1.0", "[AsC]Phil")
        register_clcmd("jointeam 6", "admin_check")
        register_cvar("amx_spectator","1")
        if (get_cvar_num("mp_allowspectators") == 0) set_cvar_num("mp_allowspectators",1)
        return PLUGIN_CONTINUE
}
vielen dank schon im vorraus für eure mühen

MfG shadow

Autor:  [WING] Black Knight [ 29.06.2004, 21:04 ]
Betreff des Beitrags: 

So, habe mal schnell etwas aus der Hüfte geschossen und das Plugin konvertiert:
Code:
/*Spectator Block by [AsC]Phil 
* Converted for Admin Mod by [WING] Black Knight
* 
*Small plugin to only allow the admins to use spectator mode. 
*Other players are not allowed to use it. 
* 
*Admins need ban abilility to be allowed. 
*Use admin_nospec to enable or disable spec mode watching for normal players (0 = no spec mode enabled) 
*
*/ 

#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib>
#include <plugin>

#define MAX_TEAMS 2

new STRING_VERSION[MAX_DATA_LENGTH] = "1.0";

public admin_check(HLCommand,HLData,HLUserName,UserIndex) {
	new sName[MAX_NAME_LENGTH];
	new iTeam;
	new iNoSpec;

	if(!access(ACCESS_BAN) || !getvar("allow_spectators") || !get_vaultnumdata("NOSPEC",iNoSpec) || iNoSpec != 1){
		convert_string(HLUserName,sName,MAX_NAME_LENGTH);
		messageex(sName,"Specmode forbidden!",print_chat);
		get_userTeam(sName,iTeam);
		if(iTeam<=MAX_TEAMS && iTeam>1){
			execclient(sName,"chooseteam");
		}
		return PLUGIN_HANDLED;
	} 
	return PLUGIN_CONTINUE;
} 

public admin_nospec(HLCommand,HLData,HLUserName,UserIndex) {
	new sData[MAX_DATA_LENGTH];
	new iSV;

	convert_string(HLData,sData,MAX_NAME_LENGTH);
	iSV=strtonum(sData);
	if(iSV>=0 && iSV<2){
		set_vaultnumdata("NOSPEC",iSV);
	}

	return PLUGIN_CONTINUE;
}

public plugin_init() { 
	plugin_registerinfo("Spectator Block","Blocks non-admins from spectating.",STRING_VERSION);
	plugin_registercmd("admin_nospec","admin_nospec",ACCESS_BAN,"admin_nospec: 1 enables nospec mode, 2 disables it.");
	plugin_registercmd("jointeam 6","admin_check",ACCESS_ALL);

	new iNoSpec;
	if(!get_vaultnumdata("NOSPEC",iNoSpec)){
		set_vaultnumdata("NOSPEC",0);
	}

	return PLUGIN_CONTINUE;
}
Es compiliert. Für einen Test hatte ich keine Zeit. Aber Du willst es ja sicherlich selber ausprobieren. ;)

Autor:  Sir Drink a lot [ 30.06.2004, 00:38 ]
Betreff des Beitrags: 

leider haben wir nicht diese feinen Möglichkeiten mit AM, auf Events zu reagieren, die in AMX Mod implementiert sind. "jointeam <parameter>" ist soweit ich das erkennen kann, kein HL Befehl.

Daher ist es etwas komplexer, aber trotzdem möglich.

Ich habe daher Blackys Vorschlag genommen und es mal umgeschrieben, damit es auch mit AM funktioniert. Das AMX Plugin ist übrigens auch nicht 100%ig, da die CVAR allow_spectators heisst und nicht mp_allowspectators.

Ich habe aber noch etwas hinzugefügt. Wenn der Spieler auf dem Server connected und die erste Teamauswahl vor sich hat, dann wird er, wenn er Spectator wählt und es nicht darf, einem Team per AutoAssign zugeteilt.

Code:
/*Spectator Block by [AsC]Phil 
* Converted for Admin Mod by [WING] Black Knight
* 
*Small plugin to only allow the admins to use spectator mode. 
*Other players are not allowed to use it. 
* 
*Admins need ban abilility to be allowed. 
*Use admin_nospec to enable or disable spec mode watching for normal players (0 = no spec mode enabled) 
* 
*/ 

#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib> 
#include <plugin> 

#define DEBUG	0
#define MAX_TEAMS 2 


new STRING_VERSION[MAX_DATA_LENGTH] = "1.0";

new g_User[MAX_PLAYERS];
new g_iNoSpec;


public chooseteam(HLCommand,HLData,HLUserName,UserIndex) {
	g_User[UserIndex]=1;
	return PLUGIN_CONTINUE; 
} 

public menuselect(HLCommand,HLData,HLUserName,UserIndex) {
	new Data[MAX_DATA_LENGTH];
	new sName[MAX_NAME_LENGTH];
	new iTeam;
	new iData;
	
	if(g_User[UserIndex]){
		g_User[UserIndex]=0;
		convert_string(HLData,Data,MAX_DATA_LENGTH);
		iData=strtonum(Data);
		if(iData==6){
			if(!access(ACCESS_BAN) && g_iNoSpec == 1 || !getvar("allow_spectators") ){ 
				convert_string(HLUserName,sName,MAX_NAME_LENGTH); 
				messageex(sName,"Spectator mode is currently forbidden!",print_chat);
				get_userTeam(sName,iTeam); 
				execclient(sName,"chooseteam");
				if(iTeam>MAX_TEAMS){
					execclient(sName,"menuselect 5");
				}
				return PLUGIN_HANDLED; 
			}
		}
		
	}
	return PLUGIN_CONTINUE;
}

public admin_nospec(HLCommand,HLData,HLUserName,UserIndex) { 
	new sData[MAX_DATA_LENGTH]; 
	convert_string(HLData,sData,MAX_NAME_LENGTH); 
	if(sData[0]=='1'){ 
		set_vaultnumdata("NOSPEC",1);
		g_iNoSpec=1;
		selfmessage("SPECTATOR MODE ONLY FOR ADMINS WITH ACCESS_BAN ENABLED!");
	} else{
		set_vaultnumdata("NOSPEC",0);
		g_iNoSpec=0;
   		selfmessage("SPECTATOR MODE FOR EVERY PLAYER AVAILABLE!");
   	}
	return PLUGIN_HANDLED; 
}


#if DEBUG == 1
public plugin_command(HLCommand,HLData,HLUserName,UserIndex) { 
	new sText[MAX_TEXT_LENGTH];
	new sCommand[MAX_COMMAND_LENGTH];
	new sData[MAX_DATA_LENGTH]; 
	new sName[MAX_NAME_LENGTH];
	convert_string(HLCommand,sCommand,MAX_COMMAND_LENGTH); 
	convert_string(HLData,sData,MAX_DATA_LENGTH); 
	convert_string(HLUserName,sName,MAX_NAME_LENGTH);
	
	snprintf(sText,MAX_TEXT_LENGTH,"[CHECK-COMMANDS] %s used %s with %s",sName,sCommand,sData);
	say(sText);
	return PLUGIN_CONTINUE;
}
#endif

	
public plugin_init() { 
	plugin_registerinfo("Spectator Block","Blocks non-admins from spectating.",STRING_VERSION); 
	plugin_registercmd("admin_nospec","admin_nospec",ACCESS_BAN,"admin_nospec: 1 enables nospec mode, 2 disables it.");
	plugin_registercmd("specmode","chooseteam",ACCESS_ALL);
	plugin_registercmd("chooseteam","chooseteam",ACCESS_ALL); 
	plugin_registercmd("menuselect","menuselect",ACCESS_ALL); 
	get_vaultnumdata("NOSPEC",g_iNoSpec);
	return PLUGIN_CONTINUE; 
}

Autor:  ]|shadow|[ [ 30.06.2004, 20:49 ]
Betreff des Beitrags: 

beim kompilieren kommt ein fehler:
Code:
plugin_spect.sma(71) Warning [217]: loose indentation
dann ist mir aufgefallen das
1. alle trotz admin__nospec 1 in den spect können
2. nach mapwechsel admin_nospec wied auf 0 wechselt was so nicht sein sollte

... und noch ne frage in der server.cfg allow_spectators 0 oder 1?

Autor:  Sir Drink a lot [ 30.06.2004, 21:35 ]
Betreff des Beitrags: 

kein Fehler, sondern Warnung -> egal
oder gehe in Zeile 71 und schieb mal das selfmessage genau bündig zu g_iNoSpec=0; und die } genau über das r von return PLUGIN_HANDLED;

allow_spectator -> erlaube_zuschauer -> 0

Lol...wahrscheinlich braucht man das Plugin dann gar nicht mehr :) bzw. meine Codeerweiterung, die auch abfängt, dass der Spieler direkt nach dem Connect in Spectator geht.

Aber dann darf der Admin das auch nicht mehr!!!! Daher muss man es dann am Ende doch auf 1 setzen....das ist ja blöd *g*

Autor:  ]|shadow|[ [ 30.06.2004, 22:01 ]
Betreff des Beitrags: 

dann ist mir aufgefallen das
1. alle trotz admin__nospec 1 in den spect können
2. nach mapwechsel admin_nospec wied auf 0 wechselt was so nicht sein sollte

Autor:  [WING] Black Knight [ 30.06.2004, 22:06 ]
Betreff des Beitrags: 

Das liegt daran, dass Sir Drink a lot nicht den ganzen Code in die plugin_init() übernommen hat.
Pack den If-Clause wieder rein und no_spec bleibt auf dem angestammten Wert.
Wegen des Zugangs zum Specmode muss er mal schauen. ;)

Autor:  ]|shadow|[ [ 30.06.2004, 22:23 ]
Betreff des Beitrags: 

Code:
public plugin_init() { 
   plugin_registerinfo("Spectator Block","Blocks non-admins from spectating.",STRING_VERSION); 
   plugin_registercmd("admin_nospec","admin_nospec",ACCESS_BAN,"admin_nospec: 1 enables nospec mode, 2 disables it."); 
   plugin_registercmd("specmode","chooseteam",ACCESS_ALL); 
   plugin_registercmd("chooseteam","chooseteam",ACCESS_ALL); 
   plugin_registercmd("menuselect","menuselect",ACCESS_ALL); 
   new iNoSpec; 
   if(!get_vaultnumdata("NOSPEC",iNoSpec)){ 
      set_vaultnumdata("NOSPEC",1); 
   }
   return PLUGIN_CONTINUE; 
}
so hab ichs gemacht allerdings bleibt es / wechselt wieder auf 0

Autor:  Sir Drink a lot [ 01.07.2004, 00:19 ]
Betreff des Beitrags: 

nun..

nachdem man einmal manuell admin_nospec 1 ausgeführt hat, dann sollte es auch ohne If Satz funktionieren.

In der adminmod.cfg ist auch admin_vault_file "addons/adminmod/config/vault.ini"
gesetzt?

Können die Leute auch nach dem Connect später im Spiel in SpecMod wechseln oder nur direkt nach dem Connect? Alle Spieler kommen im specmode 3 an, soweit ich weiss.

Autor:  [WING] Black Knight [ 01.07.2004, 10:24 ]
Betreff des Beitrags: 

Versuch es mal über plugin_info(). Damit kann man ziemlich einfach den Teamwechsel erkennen.

Autor:  Sir Drink a lot [ 01.07.2004, 12:28 ]
Betreff des Beitrags: 

hm. könnte man natürlich auch machen, dann hat aber ein Teamwechsel schon stattgefunden, oder nicht?
Ich muss ja eine Stufe vorher mit chooseteam den Versuch des Wechsels abfangen und der HL-Befehl "specmode" wird nach einem Connect eigentlich auch einwandfrei gesendet.

Daher vermute ich erst mal die nicht gesetzte Cvar admin_vault_file.

Autor:  [WING] Black Knight [ 01.07.2004, 13:11 ]
Betreff des Beitrags: 

Dann hat er schon stattgefunden, aber Du schmeißt ihn so schnell wieder aus dem SpecMode raus, dass er nicht mal was sehen konnte.

Autor:  Sir Drink a lot [ 01.07.2004, 15:02 ]
Betreff des Beitrags: 

ich denke, dass wird dann auch der nächste Ansatz sein müssen.

Aber ich verstehe immer noch nicht, warum es bei ihm so nicht funktioniert. Bei mir funktioniert es.

(***hm...linux server? vault_file in der adminmod.cfg gesetzt, aber kein Schreibrecht für die vault.ini...? Nur so ein paar Gedanken, die mir gerade durch den Kopf schießen.***)

Nachtrag:
Hm...oder besteht noch ein Missverständnis?

Wenn der Spieler connected hat, er AFK ist und keine Teamauswahl macht, dann steht er ja solange automatisch im Spectator Mode. Manuell kann er 6.Spectator nach meinen bisherigen Tests wirklich nicht mehr auswählen, wenn er kein Admin mit Banrechten ist.

Um dies also zu verhindern, müsste man direkt nach dem Connect den Spieler in ein Team verschieben. Dann stünde der AFKler aber dumm im Team rum. Oder man gibt ihm nach dem Connect "X" Sekunden Zeit, sich frei für ein Team zu entscheiden. Passiert dies nicht, führt man dann ein AutoAssign durch oder kicked ihn direkt.

Wie wäre der Wunsch?

Autor:  Sir Drink a lot [ 01.07.2004, 16:15 ]
Betreff des Beitrags: 

So....

- Nun wird automatisch der Spieler (ohne Admin-Banrechte) nach dem Connect nach 8 Sekunden (g_WaitTeamSelect) in ein Team verschoben, wenn er es nicht selber auswählt.

- If-Satz in plugin_init() wieder hinzugefügt. Wenn vault.ini Eintrag nicht existiert, wird NOSPEC automatisch auf 1 gesetzt. (also auch, wenn vault.ini gar nicht existiert...)

- NACHTRAG: menuselect verändert, damit die kleinen Binding-Tricks auch nicht mehr funktionieren, mit denen man das Plugin umgehen könnte...hoffe ich!

- NACHTRAG2: Damit es nicht zu Konflikten mit den anderen HLMenues kommt, nochmal den Code geändert (18:22 Uhr)
Code:
/*Spectator Block by [AsC]Phil 
* Converted for Admin Mod by [WING] Black Knight
* 
*Small plugin to only allow the admins to use spectator mode. 
*Other players are not allowed to use it. 
* 
*Admins need ban abilility to be allowed. 
*Use admin_nospec to enable or disable spec mode watching for normal players (0 = no spec mode enabled) 
* 
*/ 

#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib> 
#include <plugin> 

#define DEBUG	0
#define MAX_TEAMS 2 


new STRING_VERSION[MAX_DATA_LENGTH] = "1.0";

new g_User[MAX_PLAYERS];
new g_UserSpecMode[MAX_PLAYERS];
new g_iNoSpec;
new g_WaitTeamSelect=8; /*8 Sekunden die nach dem Connect des Spielers gewartet werden. Dann wird automatisch eine Teamauswahl durhgeführt*/


public specmode(HLCommand,HLData,HLUserName,UserIndex) {
	/*Nur einmal specmode kontrollieren nach dem ersten Connect/Enter!*/
	if(g_UserSpecMode[UserIndex]==0 && g_iNoSpec==1 && !access(ACCESS_BAN)|| !getvar("allow_spectators")){
		g_UserSpecMode[UserIndex]=1;
		g_User[UserIndex]=1;
		new sUserIndex[3];
		numtostr(UserIndex,sUserIndex);
		set_timer("auto_assign_player",g_WaitTeamSelect,0,sUserIndex);
	}
	return PLUGIN_CONTINUE; 
}

public auto_assign_player(Timer,Repeat,HLName,HLParam) {
	new Player[MAX_NAME_LENGTH];
	new sUserIndex[3];
	new UserIndex;
	convert_string(HLParam,sUserIndex,3);
	UserIndex=strtonum(sUserIndex);
	if(g_User[UserIndex]==1){
		if(playerinfo(UserIndex,Player,MAX_NAME_LENGTH)){
			execclient(Player,"chooseteam");
			execclient(Player,"menuselect 5");
			execclient(Player,"menuselect 1");
		}
	}
}

public chooseteam(HLCommand,HLData,HLUserName,UserIndex) {
	g_User[UserIndex]=1;
	return PLUGIN_CONTINUE; 
} 

public menuselect(HLCommand,HLData,HLUserName,UserIndex) {
	new Data[MAX_DATA_LENGTH];
	new sName[MAX_NAME_LENGTH];
	new iTeam;
	new iData;
	
	if(g_User[UserIndex]){
		convert_string(HLData,Data,MAX_DATA_LENGTH);
		iData=strtonum(Data);
		if(iData==1 || iData==2 || iData==5 || iData==10){
			g_User[UserIndex]=0;
		}
		if(iData==6){
			if(!access(ACCESS_BAN) && g_iNoSpec == 1 || !getvar("allow_spectators") ){
				g_User[UserIndex]=0;
				convert_string(HLUserName,sName,MAX_NAME_LENGTH); 
				messageex(sName,"Spectator mode is currently forbidden!",print_chat);
				get_userTeam(sName,iTeam); 
				execclient(sName,"chooseteam");
				if(iTeam>MAX_TEAMS){
					execclient(sName,"menuselect 5");
					execclient(sName,"menuselect 1");
				}
				return PLUGIN_HANDLED; 
			}
		}
		
	}
	return PLUGIN_CONTINUE;
}

public admin_nospec(HLCommand,HLData,HLUserName,UserIndex) { 
	new sData[MAX_DATA_LENGTH]; 
	convert_string(HLData,sData,MAX_NAME_LENGTH); 
	if(sData[0]=='1'){ 
		set_vaultnumdata("NOSPEC",1);
		g_iNoSpec=1;
		selfmessage("SPECTATOR MODE ONLY FOR ADMINS WITH ACCESS_BAN ENABLED!");
	} else{
		set_vaultnumdata("NOSPEC",0);
		g_iNoSpec=0;
		selfmessage("SPECTATOR MODE FOR EVERY PLAYER AVAILABLE!");
	}
	return PLUGIN_HANDLED; 
}


#if DEBUG == 1
public plugin_command(HLCommand,HLData,HLUserName,UserIndex) { 
	new sText[MAX_TEXT_LENGTH];
	new sCommand[MAX_COMMAND_LENGTH];
	new sData[MAX_DATA_LENGTH]; 
	new sName[MAX_NAME_LENGTH];
	convert_string(HLCommand,sCommand,MAX_COMMAND_LENGTH); 
	convert_string(HLData,sData,MAX_DATA_LENGTH); 
	convert_string(HLUserName,sName,MAX_NAME_LENGTH);
	
	snprintf(sText,MAX_TEXT_LENGTH,"[CHECK-COMMANDS] %s used %s with %s",sName,sCommand,sData);
	say(sText);
	return PLUGIN_CONTINUE;
}
#endif


public SetMenuData(HLCommand,HLData,HLUserName,UserIndex) {
	g_User[UserIndex]=0;
	return PLUGIN_CONTINUE; 
} 
	
public plugin_init() { 
	plugin_registerinfo("Spectator Block","Blocks non-admins from spectating.",STRING_VERSION); 
	plugin_registercmd("admin_nospec","admin_nospec",ACCESS_BAN,"admin_nospec: 1 enables nospec mode, 2 disables it.");
	plugin_registercmd("specmode","specmode",ACCESS_ALL);
	plugin_registercmd("chooseteam","chooseteam",ACCESS_ALL); 
	plugin_registercmd("menuselect","menuselect",ACCESS_ALL);
	plugin_registercmd("radio1","SetMenuData",ACCESS_ALL);
	plugin_registercmd("radio2","SetMenuData",ACCESS_ALL);
	plugin_registercmd("radio3","SetMenuData",ACCESS_ALL);
	plugin_registercmd("buyequip","SetMenuData",ACCESS_ALL);
	plugin_registercmd("buy","SetMenuData",ACCESS_ALL);
	plugin_registercmd("chooseteam","SetMenuData",ACCESS_ALL);
	plugin_registercmd("showbriefing","SetMenuData",ACCESS_ALL);
	
	/*Automatisch NOSPEC 1 setzen, wenn vault.ini Eintrag nicht existiert!*/
	if(!get_vaultnumdata("NOSPEC",g_iNoSpec)){
		set_vaultnumdata("NOSPEC",1);
		g_iNoSpec=1;
	}
	return PLUGIN_CONTINUE; 
}

Autor:  ]|shadow|[ [ 25.10.2004, 00:03 ]
Betreff des Beitrags: 

wäre es denn nicht günstiger die leute wenn sie nicht spielen wollen oder afk sind zu kicken, dein gedankengang hat mich eigendlich überzeugt. es wäre unschön haufen afk`ler rumstehen zu haben, wenn ander aussen warten die gern spielen würden!

Autor:  Sir Drink a lot [ 25.10.2004, 12:13 ]
Betreff des Beitrags: 

man kann ja auch in der Timer-Funktion auto_assign_player auch anstatt der execclients für die Teamauswahl einfach ein kick(Player); nehmen.

Autor:  ]|shadow|[ [ 25.10.2004, 13:11 ]
Betreff des Beitrags: 

argh bin absoluter noop, wie soll dann das script aussehen.

Autor:  Sir Drink a lot [ 25.10.2004, 13:40 ]
Betreff des Beitrags: 

huh?

man suche die funktion auto_assign_player im plugin oben
man lösche die 3 execclient befehle
man schreibe stattdessen kick(Player);

Fertig :)

Soll heissen, dass wenn der Spieler nicht in 8 sek. sein Team ausgewählt hat, dann wird er gekicked.

Autor:  ]|shadow|[ [ 25.10.2004, 13:57 ]
Betreff des Beitrags: 

^noch nen kleiner text dann ist es perfeckt

Iddlen nicht erlaubt !! (oder so ähnlich)

Autor:  Sir Drink a lot [ 25.10.2004, 16:22 ]
Betreff des Beitrags: 

dann mach vor dem kick(Player); noch folgendes:

messageex(Player,"Iddlen nicht erlaubt !!",print_console);

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