Ein neues Thema erstellen  Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: script help
BeitragVerfasst: 08.03.2007, 20:28 

Registriert: 18.11.2006, 18:43
Beiträge: 26
eh, first take a look here:
Code:
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>

new gVersion[] = "0.1";


const TLEN = MAX_TEXT_LENGTH;
const DLEN = MAX_DATA_LENGTH;
const NLEN = MAX_NAME_LENGTH;
const CLEN = MAX_COMMAND_LENGTH;


const SECINMIN   = 60;
const SECINHOUR  = SECINMIN * 60;
const SECINDAY   = SECINHOUR * 24;
const SECINMONTH = SECINDAY * 30; 


const MAX_NAMES = 2000;
const MAX_MATCHES = 3;
new FILENAME[] = "seen_plugin.txt"; // here for save stuff


new namecount=0;
new namelist[MAX_NAMES][NLEN];
new timelist[MAX_NAMES];
new matches[MAX_MATCHES];
new oldest = 0x7fffffff;
new roundstart = 0;
const ROUND_START_LIMIT = 10; 



public hook_say(HLCommand,HLData,HLUserName,UserIndex)
{
	new Data[MAX_DATA_LENGTH];
	new cmd[MAX_TEXT_LENGTH];
	new name[MAX_TEXT_LENGTH];
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	strsplit( Data, " ^"", cmd, MAX_TEXT_LENGTH, name, MAX_TEXT_LENGTH );
	if (streq(cmd,"seen")) {
		new text[TLEN];
		new count;

		if ( findonline(name) )
			return PLUGIN_CONTINUE;

		count += findseen(name);
		switch ( count ) 
		{
			case 1: 
			{
				new idx = matches[0];
				new str[TLEN];
				timeago(timelist[idx],str,TLEN);
				snprintf(text,TLEN,"%s was here %s ago",
					 namelist[idx],str);
				say(text);
			}

			case 2..MAX_MATCHES: 
			{
				for (new i=0;i<count;i++) 
				{
					new idx = matches[i];
					new str[TLEN];
					timeago(timelist[idx],str,TLEN);
					snprintf(text,TLEN, "%s was here %s ago", namelist[idx],str);
					say(text);
				}
			}

			default: {
				snprintf(text,TLEN,
					 "Be more specific. '%s' matches %d names",
					 name,count);
				say(text);
			}
		}
	}
	return PLUGIN_CONTINUE;
}

stock abs( x )
{
	if ( x < 0 )
		return -x;
	return x;
}

stock timeago(when,str[],len)
{
	new a,b;
	new s[2][] = { "s", "" };
	new diff = abs(systemtime() - when);
	
	if (diff < SECINMIN) {
		snprintf(str,len, "%d second%s", 
			 diff, s[diff==1]);
	}
	else if (diff < SECINHOUR) {
		a = diff/SECINMIN;
		b = diff%SECINMIN;
		snprintf(str,len, "%d minute%s and %d second%s",
			 a, s[a==1], b, s[b==1]);
	}
	else if (diff < SECINDAY) {
		a = diff/SECINHOUR;
		b = (diff%SECINHOUR)/SECINMIN;
		snprintf(str,len, "%d hour%s and %d minute%s",
			 a, s[a==1], b, s[b==1]);
	}
	else if (diff < SECINMONTH) {
		a = diff/SECINDAY;
		b = (diff%SECINDAY)/SECINHOUR;
		snprintf(str,len, "%d day%s and %d hour%s",
			 a, s[a==1], b, s[b==1]);
	}
	else {
		a = diff/SECINMONTH;
		b = (diff%SECINMONTH)/SECINDAY;
		snprintf(str,len, "%d month%s and %d day%s",
			 a, s[a==1], b, s[b==1]);
	}
}

stock findseen(name[]){
	new i;
	new count = 0;

	
	for (i=0;i<namecount;i++) {
		if(!strcasecmp(namelist[i],name)) {
			matches[0] = i;
			return 1;
		}
	}


	for (i=0;i<namecount;i++) {
		if(-1!=strcasestr(namelist[i],name)) {
			matches[count++] = i;
			if ( count == MAX_MATCHES )
				return MAX_MATCHES+1;
		}
	}
	return count;
}

stock findonline(name[]){
	new i;
	new players = maxplayercount();
	new count=0;
	new player[NLEN];
	new text[TLEN];

	
	for (i=1;i<=players;i++) {
		if(playerinfo(i,player,MAX_NAME_LENGTH)) {
			if (!strcasecmp(player,name)) {
				snprintf(text,TLEN,"%s is online now",player);
				say(text);
				return 1;
			}
		}
	}
	

	for (i=1;i<=players;i++) {
		if(playerinfo(i,player,MAX_NAME_LENGTH)) {
			if (strcasestr(player,name)!=-1) {
				snprintf(text,TLEN,"%s is online now",player);
				say(text);
				count++;
				if ( count == MAX_MATCHES )
					return MAX_MATCHES+1;
			}
		}
	}
	return count;
}


stock storetime( name[] ) {
	new i;
	new now = systemtime();
	new firstavail=-1;
	new str[TLEN];

	for (i=0;i<namecount;i++) {
		if(!strcmp(name,namelist[i])) {
			timelist[i] = now;
			snprintf(str,TLEN,"%s\%d",namelist[i],timelist[i]);
			writefile(FILENAME,str,i+1);
			break;
		}
		else if ( (timelist[i]==0) && (firstavail == -1) )
			firstavail = i;
	}
	if ( i==namecount ) {
		if ( namecount>=MAX_NAMES ) {
			if ( firstavail != -1 )
				i = firstavail;
			else
				return PLUGIN_CONTINUE;
		}
		else
			namecount++;
		strcpy(namelist[i],name,NLEN);
		timelist[i]=now;
		snprintf(str,TLEN,"%s\%d",name,now);
		writefile(FILENAME,str,i+1);
	}
	return 1;
}

public plugin_disconnect(HLUserName,UserIndex) 
{
	new name[NLEN];
	convert_string(HLUserName,name,DLEN);
	storetime(name);
	return PLUGIN_CONTINUE;
}

public plugin_connect(HLUserName,HLIP,UserIndex) 
{
	new name[NLEN];
	new now = systemtime();

	if ( now > roundstart + ROUND_START_LIMIT ) {
		convert_string(HLUserName,name,DLEN);
		storetime(name);
	}
	return PLUGIN_CONTINUE;
}

stock loadnames() {
	new i;
	new str[TLEN];
	new num[NLEN];
	new t;
	new empty=0;

	roundstart = systemtime();

	for (i=0;i<MAX_NAMES;i++) {
		if ( !readfile(FILENAME,str,i+1,TLEN) )
			break;
		strsplit(str,"\",namelist[i],NLEN,num,NLEN);
		t = strtonum(num);
		timelist[i]=t;
		if ( t==0 )
			empty++;
		else if ( t < oldest ) 
			oldest = t;
	}
        namecount = i;

	if ( i < MAX_NAMES )
		empty += MAX_NAMES - i;


	if ( empty < MAX_NAMES / 10 ) {
		new cleared = 0;
		new now = systemtime();
		new limit = oldest + ((now-oldest) / 5);
		for (i=0;i<namecount;i++) {
			if ( timelist[i] < limit ) {
				timelist[i] = 0;
				cleared++;
			}
		}
		snprintf(str,TLEN,"%d seen slots cleared",cleared);
		log(str);
	}
}

public plugin_init() {
	plugin_registerinfo("eh","who else",gVersion);
	
	plugin_registercmd("say","hook_say",0);

	loadnames();
	return PLUGIN_CONTINUE;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
If have anybody a suggestion to optimize this, i'm not sure if is the best coding to save on file etc
On server it's works, buy anyway

Thanks


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 08.03.2007, 23:35 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
wow :)

okay... and does it work for adminmod? That code looks much more complicated, that even i can't say, it is correct or not :)

But the function of this plugin is another than your first plugin, you wrote here. Isn't it?

Okay.. i am a little bit confused *gg*

1. only one issue at first.. maybe it is better to check file_access_read 1 in plugin_init for right settings in adminmod.cfg

2. please take atttention to storing data in RAM...
new namelist[MAX_NAMES][NLEN];
WOW....

3. findonline(name[])... two for next loops with same function (if else)?

4. please use more { } :) i am old and it is easier for me looking through the code with {} (if(a==1){ ... }else{ ... })

5. hm... MAX_NAMES + 1 does work, if it is const? *lol* never get the idea to use const... hm... always used #define for this... omg.

6. *lol* the function timeago, i have to learn too... I don't know how it works :)

okay :) i see, that you have a lot of experience. Would be nice, if you keep on writing plugins for AdminMod. Just welcome ;)

_________________
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: 09.03.2007, 13:33 

Registriert: 18.11.2006, 18:43
Beiträge: 26
the plugin works perfect. I tested on my server .
I just asked if see something who aren't required, for optimeze or something
Anyway, that for that suggestions


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 09.03.2007, 16:05 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Well, from programming style it looks really good.

You may run into problems (lags) in case you get a long list. I don't know whether 2000 as max is low enough. You should try.

I would also suggest, you use the standard constants provided in the admin.inc.

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 16.03.2007, 13:32 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
some issues:

1.
Code:
 for (i=0;i<MAX_NAMES;i++) {
      if ( !readfile(FILENAME,str,i+1,TLEN) )
         break;
      strsplit(str,"\",namelist[i],NLEN,num,NLEN);
      t = strtonum(num);
      timelist[i]=t;
i would use filesize and strsep, no extra "t" and namecount.. hm.. could be optimized too :) (starting readfile at line 1, but array at 0.)
Code:
iFileSize=filesize(FILENAME);
	
	if(iFileSize>MAX_NAMES){
		iFileSize = MAX_NAMES; //avoiding ARRAY OVERFLOW
	}
	
	for(i=1;i<=iFileSize;i++){
		readfile(FILENAME,Data,i,MAX_DATA_LENGTH);
strsep(Data,"\",namelist[namecount],MAX_NAME_LENGTH,sTime,MAX_NUMBER_LENGTH);
		timestamp[namecount] = strtonum(sTime);
		namecount++;
	}
	namecount--;
2. stock findonline(name[]){

only one loop over maxplayers? why not using strcasestrx?

3. why using array matches? Just for the info, that there are more entries for given name? I would print out the first three names found and then give a hint, that more names are available...

Okay... i tried some code, but is not omptimized too :)
Code:
public hook_say(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new UserName[MAX_NAME_LENGTH];
	new cmd[MAX_TEXT_LENGTH];
	new name[MAX_TEXT_LENGTH];
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	strsplit( Data, " ^"", cmd, MAX_TEXT_LENGTH, name, MAX_TEXT_LENGTH );
	if (streq(cmd,"/seen")) {
		//only check, if name is given
		if (strlen(name)!=0){
			check_name(name);
		}else{
			messageex(UserName,"[ONLINE] Please give me a name to search for!",print_chat);
		}
	}
	return PLUGIN_CONTINUE;
}

check_name(name[]){
	new Text[MAX_TEXT_LENGTH];
	new str[MAX_TEXT_LENGTH];
	new i;
	new count;
	new foundonline;
	new maxplayers=maxplayercount();
	
	//check, if player is online
	for(i=1;i<=maxplayers;i++){
		if (playerinfo(i,str,MAX_NAME_LENGTH) && strstrx(str,name)!=-1){
			foundonline=1;
			snprintf(Text,MAX_TEXT_LENGTH,"say %s is ONLINE",str);
			exec(Text);
			count++;
			if(count == MAX_MATCHES){
				break;
			}
		}
	}
	
	//if no player online find, check list
	if(!foundonline){
		for(i=0;i<=namecount;i++){
			if(strstrx(namelist[i],name)!=-1){
				timeago(timestamp[i],str,MAX_TEXT_LENGTH);
				snprintf(Text,MAX_TEXT_LENGTH,"say %s was here %s ago",namelist[i],str);
				exec(Text);
				count++;
				if(count == MAX_MATCHES){
					break;
				}
			}
		}
	}
}

_________________
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: 17.03.2007, 19:18 

Registriert: 18.11.2006, 18:43
Beiträge: 26
thanks dude ;)


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 ]"