Ein neues Thema erstellen  Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Script - Hilfe bitte!
BeitragVerfasst: 10.06.2003, 23:23 

Registriert: 10.06.2003, 22:47
Beiträge: 4
Hi!
Ich hab vor nen paar Tagen angefangen zu scripten und wollte jetzt ein Script schreiben welches am Rundenanfang anzeigt die wievielte Runde gespielt wird. Ich bekomme weder beim Compilieren noch beim Laden des Plugins eine Fehlermeldung. Konnte dies aber auch erst mit einem LAN Server testen, kann es daran liegen?

Hier der Source:

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

#define ACCESS_CONSOLE 131072

public logd_roundsay( HLCommand,HLData,HLUser,UserIndex )
{

new Message[ MAX_TEXT_LENGTH ];
new Data[ MAX_DATA_LENGTH ];

convert_string(HLData,Data,MAX_DATA_LENGTH);

if ( strcmp(Data, "Round_Start") != 0 )
{
new vround = 0;
vround++;
snprintf(Message, MAX_TEXT_LENGTH, "Round %s", vround);
centersay(Message, 12, 10, 255, 255);
}
return PLUGIN_HANDLED;
}

public plugin_init()
{
plugin_registercmd("log_roundsay", "logd_roundsay", ACCESS_CONSOLE, "");
return PLUGIN_CONTINUE;
}

Danke im Vorraus.


Nach oben
   
BeitragVerfasst: 11.06.2003, 01:55 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
1. Damit er auch auf den sogenannten World-Event reagiert, muss dieser auch in der plugin_init() mit exec aufgerufen werden. Es fehlt dort also noch folgender Befehl:

exec( "logd_reg 62 admin_command logd_roundsay"); bzw. exec( "logd_reg 62 admin_command log_roundsay");

(*kleiner Tippfehler und das 'd' vergessen?*)

2. strcmp gibt als Rückgabewert 0 aus, wenn beide Ausdrücke gleich sind. Also muss es nicht !=0, sondern ==0 heißen!

3. vround ist als Zahl definiert. Jedesmal wenn 'Round_Start' dann mit ==0 erkannt wird, wird vround auf 0 gesetzt und dann +1 erhöht. Es würde so also immer nur 1 auftauchen.
Also muss das 'new vround=0;' ausserhalb der public Funktion definiert werden! Das nennt sich dann eine globale Variable.

4. Da 'vround' eine Zahl ist, wird sie im snprintf nicht mit %s deklariert (Strings werden mit %s angezeigt!), sondern mit %i bzw. %d...(%d ist wohl korrekter, obwohl mir jetzt gerade der Unterschied entfallen ist.)

5. Mal eine sehr waage Beschreibung dieses Fehlers (und wahrscheinlich nicht sauber!): Ein 'return PLUGIN_HANDLED;' vermittelt jetzt, dass die Funktion beendet ist und auch keine weiteren Funktionen mehr existieren, die auf einen World Event reagieren. Das kann fatale Folgen für andere Plugins haben, die auch den World Event benutzen und deswegen dann nicht mehr ausgeführt werden. Es ist also in diesem Fall bzw. bei allen LogD-Funktionen ein PLUGIN_CONTINUE; vorzuziehen! Dann wird nach weiteren Funktionen, auch in anderen Plugins, gesucht, die auf den Event reagieren.

So sähe dann das Plugin mal korrekt aus (ohne Prüfung!):
(Bitte immer Code-Tags beim nächsten Mal benutzen!)
Code:
#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib> 

#define ACCESS_CONSOLE 131072

new g_vround = 0; 

public logd_roundsay( HLCommand,HLData,HLUser,UserIndex ) 
{
	new Message[ MAX_TEXT_LENGTH ]; 
	new Data[ MAX_DATA_LENGTH ]; 

	convert_string(HLData,Data,MAX_DATA_LENGTH); 

	if ( strcmp(Data, "Round_Start") == 0 ) 
	{
		g_vround++; 
		snprintf(Message, MAX_TEXT_LENGTH, "Round %d", g_vround); 
		centersay(Message, 12, 10, 255, 255); 
	} 
	return PLUGIN_CONTINUE;
} 

public plugin_init() 
{ 
	plugin_registercmd("logd_roundsay", "logd_roundsay", ACCESS_CONSOLE, "");
	exec( "logd_reg 62 admin_command logd_roundsay"); 
	return PLUGIN_CONTINUE; 
} 

Die Code Tabelle bzw. die Event-Nummern, die LogD besitzt, findest Du hier:
http://logd.sourceforge.net/help/events.html

Ich hoffe, es hat Dir etwas weitergeholfen!

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11.06.2003, 09:20 

Registriert: 10.06.2003, 22:47
Beiträge: 4
So also ich hab alle Fehler weggemacht soweit.... aber es funktioniert immer noch nicht :(. Kann das vielleicht irgendwie am LAN Server liegen?
Ich find momentan keinen Fehler mehr
Code:
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>

#define ACCESS_CONSOLE 131072

new STRING_VERSION[MAX_DATA_LENGTH] = "0.01";

new vround = 0;

public logd_roundsay( HLCommand,HLData,HLUser,UserIndex )
{

	new Message[ MAX_TEXT_LENGTH ];
	new Data[ MAX_DATA_LENGTH ];
	new Data2[ MAX_DATA_LENGTH ];
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	strsplit(Data,"# ",Data2,14);
	
	if( (strcmp(Data, "Game_Commencing" ) ==0) || ( strcmp(Data2, "Restart_Round" ) ==0))
	{ 
     	 	vround = 0; 
      	} 
      
	if ( strcmp(Data, "Round_Start") == 0 )
	{
		vround++;
		{
		snprintf(Message, MAX_TEXT_LENGTH, "Round %d", vround); 
		centersay(Message, 12, 10, 255,	255);
		}	
	}
	return PLUGIN_CONTINUE;
}

public plugin_init()
{
	plugin_registerinfo("Roundcounter.","Zaehlt die Anzahl der Runden.",STRING_VERSION); 
	plugin_registercmd("logd_roundsay", "logd_roundsay", ACCESS_CONSOLE, "");
	exec( "logd_reg 62 admin_command logd_roundsay"); 
	return PLUGIN_CONTINUE;
}


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11.06.2003, 10:11 

Registriert: 10.06.2003, 22:47
Beiträge: 4
Hat sich erledigt, klappt jetz. Hatte vergessen in der metamod.ini was einzutragen *g* o_O :D


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11.06.2003, 13:35 

Registriert: 10.06.2003, 22:47
Beiträge: 4
Hi ich bins wieder :P.
Hab das ganze Plugin jetzt noch ein bisschen erweitert und hab wieder Probleme...
Und zwar möchte ich das er beim Ende der Runde schaut ob die CTs oder die Ts gewonnen haben und dann einen typesay mit "Blue Team Scores bzw. Red Team Scores" ausgibt. Zudem soll noch der Score des Teams angezeigt werden und ein Soundfile abgespielt werden.

Hier der Code:
Code:
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>

#define ACCESS_CONSOLE 131072

new STRING_VERSION[MAX_DATA_LENGTH] = "0.01";

new vround = 0;
new terror  = 0;
new ct = 0;

playFile( sFileName[ ] )
{
	new Name[ MAX_NAME_LENGTH ];
	new iUserID;
	new iWONID;
	new maxplayers = maxplayercount();

	for( new i = 1; i <= maxplayers; i++ )
	{
		if( playerinfo(i, Name, MAX_NAME_LENGTH, iUserID, iWONID ) ) {
			//if its not a bot
			if( iWONID != 0 ) {
				playsound(Name, sFileName );
			}
		}
	}
	return 1;
}

public logd_roundsay( HLCommand,HLData,HLUser,UserIndex )
{

	new Message[ MAX_TEXT_LENGTH ];
	new Data[ MAX_DATA_LENGTH ];
	new Data2[ MAX_DATA_LENGTH ];
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	strsplit(Data,"# ",Data2,14);
	
	if ( (strcmp(Data, "Game_Commencing" ) ==0) || ( strcmp(Data2, "Restart_Round" ) ==0))
	{ 
     	 	vround = 0; 
      	} 
	if ( strcmp(Data, "Round_Start") ==0)
	{	
		vround++;
		{
		playFile( "jesitron/play.wav" );
		snprintf(Message, MAX_TEXT_LENGTH, "Round %d has been started!", vround); 
		centersay(Message, 12, 10, 255,	255);
		}	
	}
	return PLUGIN_CONTINUE;
}

public logd_teamscore( HLCommand,HLData,HLUser,UserIndex )
{
	new Message[MAX_TEXT_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new Data2[MAX_DATA_LENGTH];
	
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	strsplit(Data,"# ",Data2,terror,MAX_DATA_LENGTH,ct,MAX_DATA_LENGTH);
	
	if ( (strcmp(Data, "Game_Commencing" ) ==0) || ( strcmp(Data2, "Restart_Round" ) ==0))
	{ 
     	 	terror = 0;
     	 	ct = 0; 
      	} 
	if ( strcmp(Data, "Terrorists_Win" ) ==0)
	{
		terror++;
		{
		playFile( "jesitron/red_team_scores.wav" );
		snprintf(Message, MAX_TEXT_LENGTH, "Red Team Scores! (%i Wins)", terror); 
		typesay(Message, 12, 10, 255, 255);
		}
	}
	else if ( strcmp(Data, "CTs_Win" ) ==0)
	{
		ct++;
		{
		playFile( "jesitron/blue_team_scores.wav" );
		snprintf(Message, MAX_TEXT_LENGTH, "Blue Team Scores! (%i Wins)", ct); 
		typesay(Message, 12, 10, 255, 255);
		}
	}
	return PLUGIN_CONTINUE;
}

public plugin_init()
{
	plugin_registerinfo("Roundcounter.","Zaehlt die Anzahl der Runden.",STRING_VERSION); 
	plugin_registercmd("logd_roundsay", "logd_roundsay", ACCESS_CONSOLE, "");
	plugin_registercmd("logd_teamscore", "logd_teamscore", ACCESS_CONSOLE, "");
	exec( "logd_reg 62 admin_command logd_roundsay"); 
	exec( "logd_reg 61 admin_command logd_teamscore");
	return PLUGIN_CONTINUE;
}
Danke im vorraus! ;)


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11.06.2003, 17:48 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
habe mir fast gedacht, dass wir zu diesem Thema auch noch kommen werden. :)

Also.

strcmp ist ein Vergleich, der auf genaue Schreibweise überprüft und vergleicht. In Data steht aber nicht nur "Terrorists_Wins" oder "CT_Wins".

Lass Dir die Data aus logd_teamscore einfach mal mit einem say(Data) anzeigen. Dann überlege nochmal, wie man das strplit am Besten ansetzt, um die einzelnen Komponenten zu erhalten.

Und bedenke, dass Du bei einem strsplit auch wieder strings erhälst und keine Zahlen! Also muss terror und ct auch als Array definiert sein. Du brauchst auch keine Integer, die das Zählen mit ++ übernehmen. Die korrekten Werte stecken alle in der Data. Es kommt eben auf den richtigen Split an!

Auch ist die Überprüfung auf Game_Commencing und Restart_Round in einem Teamaction Event nicht sinnig, da dies dort nicht auftachen wird. Dafür ist ja der World-Event zuständig! Aber wie gesagt ist ja das Zählen mit ++ nicht notwendig, da ja alles in der Data steckt.

So setzte ich den split an, wenn ich die Teamscore erhalten will:
Code:
convert_string(HLData,Params,MAX_DATA_LENGTH);
strbreak(Params,Data1,Data2,MAX_DATA_LENGTH);
		strsplit(Data2, "# " ,dummy,MAX_DATA_LENGTH,dummy,MAX_DATA_LENGTH,ctscore,MAX_NUMBER_LENGTH,dummy,MAX_DATA_LENGTH,terrscore,MAX_NUMBER_LENGTH);
Erklärung zum Beispiel:

Man sieht also, dass die Data2 sehr vieles anzeigt. Unnötiges speichere ich einfach in 'dummy'.
Die ctscore und terrscore sind als Arrays global bei mir gespeichert, damit ich jederzeit auf diese Werte zurückgreifen kann. Bei Dir wäre das nicht notwendig. Bei Dir kannst Du new ctscore[MAX_NUMBER_LENGTH]; und terrscore[MAX_NUMBER_LENGTH]; innerhalb der logd_teamscore Funktion definieren. (Errinnerung: Arrays werden dann mit %s im snprintf angezeigt!)

So. Das zum Anzeigen der Score. Aber jetzt brauchen wir ja noch die Info, wer auch gewonnen hat, ohne ständig zu vergleichen. Diese Info steckt in der Data1.

Ich ermittle es so:
Code:
if(strmatch(Data1, "CT", strlen("CT")) -> um die CT Wins herrauszufinden.

if(strmatch(Data1, "TERRORIST", strlen("TERRORIST")) -> um Terror Wins herrauszufinden.
ok?

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 6 Beiträge ] 


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de
Original Design von "[ Half-Life Admin Mod © Alfred Reynolds 2000-2003 ] - [ site design by Jägermeister ]"