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

Gibt es einen Befehl Pause in small
https://www.adminmod.de/viewtopic.php?t=3859
Seite 1 von 2

Autor:  KlaraFall [ 15.08.2002, 07:39 ]
Betreff des Beitrags:  Gibt es einen Befehl Pause in small

Hallo Leute!

Würde gerne eine Schleife für eine kurze Zeit unterbrechen.
Aus anderen Programmiersprachen kenne ich einen Befehl pause. Gibt es soetwas auch in small?

Vielen Dank

MfG KlaraFall

Autor:  [WING] Black Knight [ 15.08.2002, 09:00 ]
Betreff des Beitrags: 

So weit ich weiß, nein.

Aber Du kannst das über set_timer() umgehen.

Autor:  KlaraFall [ 15.08.2002, 10:30 ]
Betreff des Beitrags: 

Hi!

Schade schade schade. Hätte mir einiges an Mühe erspart.

Wollte eigentlich das plugin für PODBot zu steuern erweitern. Immer
wenn ich admin?removebots aufrufe und es sind viele im Spiel(Bots)
dann kackt mir der Client ab und fasselt was von overflowed.

Im plugin wird halt der Consolen Befehl benutzt pb removebots und das geht mir halt zu schnell. Der Server läuft weiter nur ich muss jedesmal neu connecten.

Will halt die Bots alle nach der Reihe kicken also in einer schleife alle Indexe durchgehen und wenn WONID null ist und tschüss.

Dann werde ich es wohl doch mit set_timer() machen.

Vielen Dank

KlaraFall

Autor:  [WING] Black Knight [ 15.08.2002, 11:45 ]
Betreff des Beitrags: 

Mach doch so ein Konstrukt:
Code:
plugin admin_removebots(HLParam){
    new merk;
    new strmerk[MAX_DATA_LENGTH];
    new strname[MAX_NAME_LENGTH];
    convert_string(HLParam, strmerk,MAX_DATA_LENGTH);
    merk=strtonum(strmerk);
    ...(Bot Check und Kick)
    if (merk<=MAX_PLAYERS){
        merk++;
        set_timer("admin_removebots",5,0,merk);
    }
}
Ich weiß, aber nicht, ob der Compiler wegen des Eigenaufrufs der Funktion meckert. Ist nur als Vorschlag bzw. Idee zu verstehen.

Autor:  KlaraFall [ 15.08.2002, 16:24 ]
Betreff des Beitrags: 

Hi!

Werde ich aufjedenfall versuchen!

Danke Dir. Werde ich aufjedenfall ausprobieren. Bin für jeden Vorschlag offen. Ist mein erstes Plugin. Du verstehst aber wenigstens was ich meine.

Werde Dir geben.

MfG KlaraFall

Autor:  KlaraFall [ 16.08.2002, 06:11 ]
Betreff des Beitrags: 

Hi Black Knight!

Habe versucht das ganze wie Du meintest
rekursiv zu lösen. Irgendwie raffe ich das in small mit den
Parametern net. In der Console sage ich admin_removebots
und die 4 Parameter werden automatisch übergeben?
In admin_removebots rufe ich removebots auf. Die braucht
einen Paramter. Wenn ich diesen übergebe meckert der Compiler.

Kannst Du mir sagen wie das abläuft? Habe mir gestern halt auch noch
eine Lösung überlegt, allerdings mit zwei globalen
Variablen. Deine möchte ich aber ersteinmal ausprobieren.

Danke Dir!

MfG KlaraFall

Autor:  KlaraFall [ 16.08.2002, 06:16 ]
Betreff des Beitrags: 

Hi!

Versuche das Stück Code einzufügen :evil:
Code:
public admin_removebots(HLCommand, HLData, HLUserName, UserIndex) {
    
    	new strmerk[MAX_DATA_LENGTH];
    	strmerk = "1";
	removebots(strmerk); 
     
}

public removebots(HLParam) {

    new i;
    new iWONID;
    new strmerk[MAX_DATA_LENGTH]; 
    new strname[MAX_NAME_LENGTH];
    new iMaxPlayers = maxplayercount();
     
    convert_string(HLParam, strmerk,MAX_DATA_LENGTH); 
    i = strtonum(strmerk); 
    if (check_user(i) == 1) {
     	iWONID = get_userWONID(i)
     	if (iWONID == 0) {
     		strname = get_username(i);
     		kick(strname);
     	}
    }
    if (i < iMaxPlayers){ 
        	i++; 
        	set_timer("removebots",5,0,i); 
        
    } 
}

Autor:  KlaraFall [ 16.08.2002, 08:16 ]
Betreff des Beitrags: 

Hi [WING]Black Knight!

Habe jetzt ersteinmal meine Idee realisiert und wollte Dich
fragen ob Du Deinen Meinung dazu äussern könntest, ob es in
Ordnung ist, oder ob Du es gehuddelt findest.

Würde Deine Version auch gerne überprüfen, da sie nicht
ständig durch globale Variablen den Speicher füllt!
Habe allerdings ein Problem mit Parametern in Small!
Sehr wahrscheinlich weil ich noch nicht gerafft habe, welchen
Datentyp ich im Moment benutze. Wieso gibt es hier keine Strings,
integers ... ?


Ich schreibe eine Funktion die einen Parameter erwartet. Diese Funktion
rufe ich dann auch mit nur einem Parameter auf und erhalte dauernt
missmatch argument (Argument X), so in etwa.
Habe noch einigen Klärungsbedarf.

Hier ist der Code von mir mit globalen Variablen(Merkern):

[/code]new BotsNamen[33][MAX_NAME_LENGTH];
new iIndex;

public kickbot(){

kick(BotsNamen[iIndex]);
iIndex++;

return PLUGIN_HANDLED;

}

public admin_removebots(HLCommand, HLData, HLUserName, UserIndex) {

new AnzahlBots;
new iName[MAX_NAME_LENGTH];
new iUserID;
new iUserWONID;
new iMaxPlayers = maxplayercount();

iIndex = 1;

for (new i = 1; i <= iMaxPlayers; i++) {
if (playerinfo(i,iName,MAX_NAME_LENGTH,iUserID,iUserWONID)!= 0){
if (iUserWONID == 0){
AnzahlBots++;
strinit(BotsNamen[AnzahlBots]);
strcpy(BotsNamen[AnzahlBots], iName, MAX_NAME_LENGTH);
}

}
}

set_timer("kickbot", 1, AnzahlBots);

return PLUGIN_HANDLED;

}

Autor:  [WING] Black Knight [ 16.08.2002, 08:25 ]
Betreff des Beitrags: 

Versuch es mal so. Hier meckert der Compiler wenigstens nicht. Ob das mit CONTINUE und HANDLED so richtig ist, weiß ich nicht. Und für die Funktionsfähigkeit übernehme ich auch keine Garantie.
Außerdem solltest Du Dir die Verwendung der Funktionen nochmal genau ansehen:
http://www.adminmod.org/ascript/functions.html
Da waren doch einige dicke Patzer drin.
Code:
public admin_removebots(HLCommand, HLData, HLUserName, UserIndex) {

    set_timer("removebots",5,0,"1"); 
    return PLUGIN_HANDLED;
}

public removebots(Timer,Repeat,HLName,HLParam) {

  new i;
  new iWONID;
  new strmerk[MAX_DATA_LENGTH]; 
  new strname[MAX_NAME_LENGTH];
  new iMaxPlayers = maxplayercount();
   
  convert_string(HLParam, strmerk,MAX_DATA_LENGTH); 
  i = strtonum(strmerk); 
  playerinfo(i,strname,MAX_NAME_LENGTH,_,iWONID);
  if (check_user(strname) && iWONID == 0 ) {
      kick(strname);
  }
  if (i < iMaxPlayers){ 
      i++;
      numtostr(i,strmerk);
      set_timer("removebots",5,0,strmerk); 
  }
  return PLUGIN_CONTINUE;
}

Autor:  KlaraFall [ 16.08.2002, 08:50 ]
Betreff des Beitrags: 

Hi!

Danke Dir. Kannst Du mir die Patzer ein bisschen näher bringen.
Habe keinen Bock die mein Leben lang mitzuschleppen. :D

Der letzte Code von mir läuft(Mit den globalen Variablen), wie aber schon gesagt, Deine Idee gefällt mir besser.

Verstehe das aber mit den Parametern nicht.

Du rufst auf:
set_timer("removebots",5,0,"1");

und die Funktion lautet:
public removebots(Timer,Repeat,HLName,HLParam)

Die Parameter der admin_removebots Funktion sind klar.
Die kommen aus der Half-Life Engine.
Muss ich Sie übergeben wenn ich Sie nicht auswerten muss, wie in Deinem Beispiel?

Wenn Du es nicht weisst muss ich es eben ausprobieren. Möchte Dich nicht unnötig belästigen.

wat für Parameter sind denn nun (Timer,Repeat,HLName,HLParam)

Die Parameter sind doch es dem PodBot Plugin.

Bitte kläre mich auf.

Danke Dir

KlaraFall

Autor:  [WING] Black Knight [ 16.08.2002, 09:04 ]
Betreff des Beitrags: 

Timer war, soweit ich weiß, die Timer-ID, Repeat vermutlich die Anzahl der Wiederholungen (ob verbleibend, insgesamt oder schon verstrichende, vielleicht weiß das jemand), HLName dürfte der Username sein, der den Timer aufgerufen hat und HLParam sind die von der set_timer übergebenen Parameter.

So, und nun warte ich darauf, dass mich irgendjemand eines besseren lehrt. Das hab ich mir nämlich auch gerade aus den Fingern gesaugt.

BTW, die Patzer haben für die Fehlermeldungen gesorgt. Du hast Dich einfach nicht an die Befehlssyntax gehalten.

Autor:  KlaraFall [ 16.08.2002, 10:52 ]
Betreff des Beitrags: 

Hi!

Alles klar. Habe mir die Funktionen jetzt ausgedruckt und werde
den Code mal eingeben.

Danke schöööön.

MfG KlaraFal

Autor:  Sir Drink a lot [ 17.08.2002, 10:15 ]
Betreff des Beitrags: 

hm...ich war jetzt zu faul alles durchzulesen.

Aber der Code sah ja schon recht "kompliziert" aus :-)

Wie wäre es mit diesem Code?
Code:
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>

new STRING_VERSION[MAX_DATA_LENGTH] = "17.08.02";

public admin_kickbots(HLCommand, HLData, HLUserName, UserIndex) {
	
	new strname[MAX_NAME_LENGTH]; 
	new i;
	new iWONID;
	new maxplayers=maxplayercount();
	new delaytime=0;
	for(i=1;i<=maxplayers;i++){
		if(playerinfo(i,strname,MAX_NAME_LENGTH,_,iWONID)){
			if (iWONID == 0 ) {
				delaytime +=5;
				set_timer("removebots",delaytime,0,strname);
			}
		}
	}
    	return PLUGIN_HANDLED; 
}
public removebots(Timer,Repeat,HLName,HLParam) {
  	new strname[MAX_DATA_LENGTH]; 
  	convert_string(HLParam, strname,MAX_DATA_LENGTH);
	if(check_user(strname)==1){
  		kick(strname);
	}
  	return PLUGIN_CONTINUE; 
}

public plugin_init()
{
	plugin_registerinfo("Remove Bots","Kicks all Bots with a delay of 5 seconds.",STRING_VERSION);
	plugin_registercmd("admin_kickbots", "admin_kickbots", ACCESS_KICK, "admin_kickbots : kicks all bots with a delay of 5 seconds");
	return PLUGIN_CONTINUE;
}
so. dann kannst Du an der delaytime spielen. 5 sec ist ja schon eine große Verzögerung.

Kurze Erklärung:

Ich gehe mit einer Schleife über maxplayercount alle Spieler durch.
Wenn WONID = 0
dann beim ersten Bot delaytime = 5
beim zweiten delaytime = 5+5 = 10
usw.

Übergebe den Namen des Bots an die Timerfunktion, die ausschließlich noch einmal den Namen überprüft und diesen dann kicked.

Übrigens kommt Dein Overflow wahrscheinlich vom plugin_sank_sounds. Nehme ich mal an. Bot-Protection ist auf 1, oder? Die neueste Version vom sank_sounds hast Du auch?
Obwohl dass der Server nicht stirbt, wundert mich. Bei sank_sounds ist es ja so, dass er jedesmal beim disconnect z.B. sagt: Please Come again.

Wenn er dass dann 20mal in einer Sekunde sagen muss, wenn alle Bots removed werden......autsch

Autor:  [WING] Black Knight [ 17.08.2002, 13:32 ]
Betreff des Beitrags: 

Das hat aber den Nachteil, dass man mehrere Timer gleichzeitig produziert.
Das wollte ich vermeiden. Bei mir wird nur 1 Timer zur Zeit gestartet.
BTW, kleine Verbesserung. Mach mal:
Code:
set_timer("removebots",i*5,0,strname);
Das spart eine Variable. :wink:

Autor:  KlaraFall [ 17.08.2002, 14:28 ]
Betreff des Beitrags: 

Hi alle zusammen!

Jo, werde mir den Code mal reinziehen. Übrigens hast Du recht
Sir Drink a lot. :D
Habe please come again drin. Wollte es aber gerne drinnen lassen.

Man hat ja sonst nichts zu tuen.

Tschööö alle zusammen.

Danke fdür die schnelle Hilfe

KlaraFall

Autor:  Sir Drink a lot [ 17.08.2002, 16:14 ]
Betreff des Beitrags: 

Es produziert mehr Timer, was ich aber nicht schlimm finde.

Woher weisst Du denn, dass die Bots mit Ihrem UserIndex alle immer schön in der Reihe sind? :-)

Was ist, wenn mal mehrere Menschliche Spieler drauf sind? Zehn menschliche Spieler in der Reihe und der 11 ist ein Bot...hm 55 sekunden warten bis der Bot gekickt wird.

Nun denn....

Autor:  [WING] Black Knight [ 17.08.2002, 23:05 ]
Betreff des Beitrags: 

Nun ja, auch meinen Code kann man noch verbessern. :wink: Da die Timer aber immer noch etwas buggy sind, versuche ich es zu vermeiden mehrere gleichzeitig laufen zu lassen.

Autor:  Sir Drink a lot [ 18.08.2002, 00:31 ]
Betreff des Beitrags: 

Jetzt verängstige die Leute nicht :-)

Die Timer funktionieren schon.

Zumindest bei so einfachen Sachen :lol:

Ok. Es kann mal einer ausfallen. Aber dann gibt man eben nochmal admin_kickbots ein. ;-)

Autor:  KlaraFall [ 18.08.2002, 07:19 ]
Betreff des Beitrags: 

Hi ihr beiden!

Angst habe ich noch keine, merke aber das ich mir die Funktionen
wirklich noch besser anschauen muss. Lese mir jetzt einmal das small book durch.

MfG KlaraFall

Autor:  KlaraFall [ 18.08.2002, 08:14 ]
Betreff des Beitrags: 

Juhu!

Kann mir mal einer von Euch beiden erklären was ihr da am erzählen seid.
Wieso wird bei Black Night der Timer nur einmal aufgerufen und bei Sir Drink ... mehrere? Jetzt habt ihr mich aber doch verrückt gemacht. Ruft ihr die Funktion nicht irgendwie gleich auf? Hääääääää!!!!!!!

Wie funktioniert der Timer eigentlich jetzt wirklich?

MfG KLaraFall

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