weiss nicht, ob das der aktuelle ist...
Code:
/* LogD-Time-Manager
WRITTEN BY: [WING] Sir Drink a lot
visit www.adminmod.de
BESCHREIBUNG: Berechnet die vergangene Zeit auf der Map.
In einer command.ini werden die Befehle und Zeitpunkte
festgelegt, welche dann entsprechend der Mapzeit (in Sekunden)
ausgeführt werden sollen.
In der command.ini immer mit dem höchsten Zeitwert beginnen!
Seht euch die Beispiel command.ini an! Das Beispiel stellt
ein 'Timeremaining' dar, wieviel Zeit noch auf der Map verbleiben.
Es können aber auch automatisch ablaufende Tasklisten zu einer
gewissen Mapzeit aufgerufen werden. Diese Tasklisten laufen dann,
anhand ihrer Wartezeit und Wiederholung, völlig unabhängig zur
Mapzeit. Ist die Wartezeit 0, dann wird der Befehl sofort ausgeführt.
BEFEHLE:
admin_tm_config 'filename': Stoppt die Ausführung aller Tasks. Auch die mapzeitungebundenen Tasks.
Wenn man einen Filenamen angibt, wird eine neue mapzeitgebundene Taskliste
eingelesen.
admin_tm_list: Zeigt einem alle mapzeitgebundenen Tasks
admin_tm_exectask 'Filename: Ruft eine mapzeitungebunden Taskliste auf und führt die Tasks anhand
der eingetragenen Wartezeit und Wiederholung aus. Ist die Wartezeit = 0
wird der Befehl sofort ausgeführt.
admin_tm_killtask 'TaskID/all': Stoppt die Ausführung eines oder aller mapzeitungebundenen Tasks.
admin_tm_showtask: Zeigt einem eine Liste der mapzeitungebunden Tasks, die noch anhand ihrer
eingetragenen Wartezeiten und Wiederholungen anstehen.
!!!!HINWEIS/Important Notice!!!!
Ich übernehme keine Verantwortung dafür, was ihr in eure command.ini schreibt
und was dann passiert, wenn dieser Befehl ausgeführt wird.
Wenn Ihr z.B. irgendwelche rcon Befehle benutzt oder einfach nur 'quit'.
Am Besten lasst ihr nur Adminmod Plugins ausführen.
You can not hold me responsible for your mistakes. For example, if you set
rcon_password or quit in your command.ini then it is YOUR problem. The
defaults should be quite secure....
---Changelog---
26.12.02: - admin_tm_killtask 'TaskID' ermöglicht, eine oder alle mapzeitungebunden
Tasks zu beenden. Wenn man einen bestimmten mapzeitungebunden Task abbrechen
will, kann man mit admin_tm_showtask alle noch ausstehenden Tasks einsehen
und die TaskID herrausfinden.
23.12.02: - Man kann automatische nicht mapzeitgebundene Tasklisten anlegen
und diese mit admin_tm_exectask 'filename' aufrufen und ausführen
lassen.
- Mit admin_tm_config 'filename' kann man die mapzeitgebundene Taskliste
jederzeit ändern.
20.12.02: - Man kann den Namen der auszuführenden mapzeitgebundenen Taskliste
in der vault.ini mit 'TM_LIST' festlegen.
19.12.02: - AMX Error 10 sollte nicht mehr kommen
- Bug in filesize() von [WING] Black Knight gefunden. Benutze seinen FIX.
- Man kann mit '//' Zeilen auskommentieren
- Versucht, negative Wartezeiten direkt zu korrigieren
18.12.02: - beta version
- liest die Befehle aus der command.ini und führt sie zu den
angegebenen Zeitpunkten aus.
- In einer Sekunde kann nur ein Befehl ausgeführt werden
- Mit den höchsten Zeitwerten beginnen
*/
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
#define ACCESS_CONSOLE 131072
new STRING_VERSION[MAX_DATA_LENGTH] = "20.12.02";
new TextFileDir[MAX_TEXT_LENGTH]="addons/adminmod/config/";
new TextFile[MAX_TEXT_LENGTH];
/*Definiert, wieviele Zeilen der command.ini ausgewertet werden*/
#define MAX_LINE 100
#define MAX_TASKS 100
new GameCommencing;
new checktime;
new origtimelimit;
new timer;
new tm_pointer;
new tm_line;
new Execute[MAX_LINE][MAX_DATA_LENGTH];
new Time[MAX_LINE][MAX_NUMBER_LENGTH];
/*For executing tasks whith timer*/
new TaskTimer[MAX_TASKS][MAX_DATA_LENGTH];
public admin_tm_list(HLCommand,HLData,HLUserName,UserIndex){
new Text[MAX_TEXT_LENGTH];
new User[MAX_NAME_LENGTH];
new a;
new i;
new time;
convert_string(HLUserName,User,MAX_NAME_LENGTH);
time = (origtimelimit-(systemtime()-checktime));
selfmessage("");
selfmessage("--- TIME-MANAGER: MAPZEIT GEBUNDENE TASKLISTE ---");
selfmessage("");
selfmessage("ZEIT -- BEFEHL");
for(i=0;i<tm_line;i++){
snprintf(Text,MAX_TEXT_LENGTH,"%s --- %s",Time[i],Execute[i]);
strcpy(Text,Text,98);
selfmessage(Text);
}
selfmessage("");
selfmessage("------------------------------------");
selfmessage("");
snprintf(Text,MAX_TEXT_LENGTH,"Verbleibende Zeit: %i sec",time);
selfmessage(Text);
a=time-strtonum(Time[tm_pointer]);
snprintf(Text,MAX_TEXT_LENGTH,"Naechster Befehl in %d Sekunden:",a);
selfmessage(Text);
snprintf(Text,MAX_TEXT_LENGTH,"%s --- %s ",Time[tm_pointer],Execute[tm_pointer]);
strcpy(Text,Text,98);
selfmessage(Text);
selfmessage("");
if(a<0 || getvar("mp_timelimit")*60+2 != origtimelimit){
checktime = systemtime()-(systemtime()- checktime);
selfmessage("[TIME-MANAGER] Negative Wartezeit! Versuche es anzupassen!");
origtimelimit= getvar("mp_timelimit")*60+2;
kill_timer(timer);
tm_pointer=0;
timer=set_timer("tm_warn",1,0);
}
selfmessage("------------------------------------");
return PLUGIN_HANDLED;
}
public admin_tm_config(HLCommand,HLData,HLUserName,UserIndex){
new Data[MAX_DATA_LENGTH];
new i;
convert_string(HLData,Data,MAX_DATA_LENGTH);
set_vaultdata("TM_FILE",Data);
checktime = systemtime()-(systemtime()- checktime);
origtimelimit= getvar("mp_timelimit")*60+2;
if(timer!=0){
kill_timer(timer);
}
for(i=0;i<=MAX_TASKS;i++){
if(strlen(TaskTimer[i])!=0){
kill_timer(i);
strcpy(TaskTimer[i],"",MAX_DATA_LENGTH);
}
}
timer=0;
tm_pointer=0;
tm_line=0;
if(strlen(Data)!=0){
read_file();
}
return PLUGIN_HANDLED;
}
public admin_tm_exectask(HLCommand,HLData,HLUserName,UserIndex){
new FileName[MAX_DATA_LENGTH];
new Data[MAX_DATA_LENGTH];
new WaitTime[MAX_NUMBER_LENGTH];
new Repeat[MAX_NUMBER_LENGTH];
new ReadCommand[MAX_DATA_LENGTH];
new Text[MAX_TEXT_LENGTH];
new iTaskTimer;
new iTime;
new iRepeat;
new i;
new iLine;
convert_string(HLData,FileName,MAX_DATA_LENGTH);
snprintf(FileName,MAX_DATA_LENGTH,"%s%s",TextFileDir,FileName);
if(fileexists(FileName)){
iLine=realfilesize(FileName);
if(iLine>MAX_LINE){
iLine=MAX_LINE;
}
for(i=1;i<=iLine;i++){
readfile(FileName,Data,i,MAX_DATA_LENGTH);
if(strlen(Data)!=0 && strcmp(Data,"")!=0 && strncmp(Data,"/",1)!= 0){
strsep(Data," ",WaitTime,MAX_NUMBER_LENGTH,Repeat,MAX_NUMBER_LENGTH,ReadCommand,MAX_DATA_LENGTH);
iTime=strtonum(WaitTime);
if(iTime==0){
execute(ReadCommand);
}else{
iRepeat=strtonum(Repeat);
iTaskTimer=set_timer("tm_exectask",iTime,iRepeat);
strcpy(TaskTimer[iTaskTimer],ReadCommand,MAX_DATA_LENGTH);
}
}
}
}else{
snprintf(Text,MAX_TEXT_LENGTH,"[TIME-MANAGER] Kann mapzeitungebunde Taskliste %s nicht finden!!!",FileName);
selfmessage(Text);
}
return PLUGIN_HANDLED;
}
public tm_exectask(Timer,Repeat,HLUser,HLParam){
new Data[MAX_DATA_LENGTH];
if (getvar("mp_timelimit")*60+2 != origtimelimit){
checktime = systemtime()-(systemtime()- checktime);
origtimelimit= getvar("mp_timelimit")*60+2;
tm_killtask("all");
selfmessage("[TIME-MANAGER] mp_timelimit hat sich veraendert!");
if(timer!=0){
kill_timer(timer);
}
tm_pointer=0;
timer=set_timer("tm_warn",1,0);
}else{
strcpy(Data,TaskTimer[Timer],MAX_DATA_LENGTH);
execute(Data);
strcpy(TaskTimer[Timer],"",MAX_DATA_LENGTH);
}
return PLUGIN_CONTINUE;
}
public admin_tm_killtask(HLCommand,HLData,HLUserName,UserIndex){
new Data[MAX_DATA_LENGTH];
convert_string(HLData,Data,MAX_DATA_LENGTH);
tm_killtask(Data);
return PLUGIN_HANDLED;
}
tm_killtask(Data[]){
new iData;
new i;
iData=strtonum(Data);
if(strcmp(Data,"all")==0){
for(i=0;i<=MAX_TASKS;i++){
if(strlen(TaskTimer[i])!=0){
kill_timer(i);
strcpy(TaskTimer[i],"",MAX_DATA_LENGTH);
}
}
selfmessage("[TIME-MANAGER] Alle mapzeitungebunden Tasks sind abgebrochen!");
}else{
if(strlen(TaskTimer[iData])!=0){
kill_timer(iData);
strcpy(TaskTimer[iData],"",MAX_DATA_LENGTH);
selfmessage("[TIME-MANAGER] Mapzeitungebundener Task ist abgebrochen!");
}else{
selfmessage("[TIME-MANAGER] Kann die ID des mapzeitungebunden Tasks nicht finden!");
}
}
return PLUGIN_HANDLED;
}
public admin_tm_showtask(HLCommand,HLData,HLUserName,UserIndex){
new Text[MAX_TEXT_LENGTH];
new i;
new NumTaskTimer;
selfmessage("");
selfmessage("--- TIME-MANAGER: MAPZEIT UNGEBUNDENE TASKLISTE ---");
selfmessage("");
selfmessage("ID -- COMMAND");
selfmessage("");
for(i=0;i<=MAX_TASKS;i++){
if(strlen(TaskTimer[i])!=0){
snprintf(Text,MAX_TEXT_LENGTH,"%i. %s",i,TaskTimer[i]);
strcpy(Text,Text,98);
selfmessage(Text);
NumTaskTimer++;
}
}
selfmessage("");
snprintf(Text,MAX_TEXT_LENGTH,"Anzahl der laufenden Tasks: %i",NumTaskTimer);
selfmessage(Text);
selfmessage("");
selfmessage("--------------------------------------------");
return PLUGIN_HANDLED;
}
public tm_welt(HLCommand,HLData,HLUserName,UserIndex){
new Data [MAX_DATA_LENGTH];
new x[MAX_DATA_LENGTH];
new dummy[MAX_DATA_LENGTH];
new z;
new a;
new time;
convert_string( HLData, Data, MAX_DATA_LENGTH );
strsplit(Data,"_",x,MAX_DATA_LENGTH,dummy,MAX_DATA_LENGTH);
if(strcmp(x,"Game")==0 && GameCommencing == 0){
GameCommencing = 1;
checktime =systemtime();
z=1;
}else if(strcmp(x,"Restart")==0){
checktime = systemtime();
z=1;
}else if(strcmp(x,"Round")==0){
if (getvar("mp_timelimit")*60+2 != origtimelimit){
checktime = systemtime()-(systemtime()- checktime);
z=1;
}
time = (origtimelimit-(systemtime()-checktime));
a=time-strtonum(Time[tm_pointer]);
if(a<0){
checktime = systemtime()-(systemtime()- checktime);
selfmessage("[TIME-MANAGER] Negative Wartezeit! Versuche es anzupassen!");
z=1;
}
}
if(z==1){
origtimelimit= getvar("mp_timelimit")*60+2;
tm_killtask("all");
if(timer!=0){
kill_timer(timer);
}
tm_pointer=0;
timer=set_timer("tm_warn",1,0);
}
return PLUGIN_CONTINUE;
}
public tm_warn(Timer,Repeat,HLUser,HLParam){
new Text[MAX_TEXT_LENGTH];
new a;
new i;
new time;
new iTime;
new iTime2;
if (getvar("mp_timelimit")*60+2 != origtimelimit){
snprintf(Text,MAX_TEXT_LENGTH,"[TIME-MANAGER] mp_timelimit hat sich veraendert!");
selfmessage(Text);
checktime = systemtime()-(systemtime()- checktime);
origtimelimit= getvar("mp_timelimit")*60+2;
tm_pointer=0;
tm_killtask("all");
}
time = (origtimelimit-(systemtime()-checktime));
iTime=strtonum(Time[tm_pointer]);
if(time==iTime){
execute(Execute[tm_pointer]);
tm_pointer++;
iTime=strtonum(Time[tm_pointer]);
}
if(iTime !=0){
a = time - iTime;
/*wenn die Mapzeit < als die Zeitangabe aus der command.ini ist, andere Zeit-
angabe mit Befehl suchen, die noch innerhalb der Mapzeit ausgeführt werden
kann */
if(a<=0){
for(i=0;i<=tm_line;i++){
iTime2=strtonum(Time[i]);
if(time>iTime2){
a = time - iTime2;
tm_pointer=i;
break;
}else{
tm_pointer=i;
}
}
}
timer=set_timer("tm_warn",a,0);
snprintf(Text,MAX_TEXT_LENGTH,"[TIME-MANAGER] Naechster Befehl in %d Sekunden:'%s'",a,Execute[tm_pointer]);
strcpy(Text,Text,98);
selfmessage(Text);
}else{
snprintf(Text,MAX_TEXT_LENGTH,"[TIME-MANAGER] %d mapzeitgebunden Befehle ausgefuehrt. Ende!",tm_pointer);
selfmessage(Text);
}
return PLUGIN_CONTINUE;
}
execute(Data[]){
new Command[MAX_DATA_LENGTH];
new Param[MAX_DATA_LENGTH];
if(strncmp(Data,"admin_",6)==0){
strsep(Data," ",Command,MAX_DATA_LENGTH,Param,MAX_DATA_LENGTH);
plugin_exec(Command,Param);
}else{
exec(Data);
}
return PLUGIN_CONTINUE;
}
read_file(){
new Text[MAX_TEXT_LENGTH];
new Data[MAX_DATA_LENGTH];
new File[MAX_DATA_LENGTH];
new iLine;
new i;
get_vaultdata("TM_FILE",File,MAX_TEXT_LENGTH);
strcpy(TextFile,TextFileDir,MAX_DATA_LENGTH);
strcat(TextFile,File,MAX_DATA_LENGTH);
if(fileexists(TextFile)){
iLine=realfilesize(TextFile);
if(iLine>MAX_LINE){
iLine=MAX_LINE;
}
for(i=1;i<=iLine;i++){
readfile(TextFile,Data,i,MAX_DATA_LENGTH);
if(strlen(Data)!=0 && strcmp(Data,"")!=0 && strncmp(Data,"/",1)!= 0){
strsep(Data," ",Time[tm_line],MAX_NUMBER_LENGTH,Execute[tm_line],MAX_DATA_LENGTH);
tm_line++;
}
}
snprintf(Text,MAX_TEXT_LENGTH,"[TIME-MANAGER] %i mapzeitgebundene Befehle von %s eingelesen",tm_line,TextFile);
selfmessage(Text);
timer=set_timer("tm_warn",1, 0);
}else{
snprintf(Text,MAX_TEXT_LENGTH,"[TIME-MANAGER] Finde %s nicht!!!!",TextFile);
selfmessage(Text);
}
return PLUGIN_CONTINUE;
}
/*19.12.02: workaround von Blacky, um die korrekte Filegröße zu ermitteln*/
realfilesize(fname[]){
new sizeoffile;
new sizeoffile2;
new i;
new string[MAX_DATA_LENGTH];
sizeoffile=filesize(fname,1);
sizeoffile2=sizeoffile;
for(i=1; i<=sizeoffile2; i++) {
readfile(fname,string,i,MAX_DATA_LENGTH);
if(strlen(string)>98){
sizeoffile-=1;
}
if(sizeoffile==i){
break;
}
}
return sizeoffile;
}
public plugin_init(){
plugin_registerinfo("LogD-Time-Manager","Executing commands within maptime",STRING_VERSION);
plugin_registercmd("tm_welt", "tm_welt", ACCESS_CONSOLE);
plugin_registercmd("admin_tm_list", "admin_tm_list", ACCESS_MAP,"admin_tm_list: Zeigt eine Liste der Tasks, die anhand der Mapzeit gesteuert sind");
plugin_registercmd("admin_tm_config", "admin_tm_config", ACCESS_MAP,"admin_tm_config <0/filename>: Stoppt die anhand der Mapzeit gesteuerten Tasks");
plugin_registercmd("admin_tm_exectask","admin_tm_exectask",ACCESS_MAP,"admin_tm_exectask <filename>: Lädt eine Taskliste, die automatisch mit Timern gesteuert wird");
plugin_registercmd("admin_tm_killtask","admin_tm_killtask",ACCESS_MAP,"admin_tm_killtask <ID/all>: Stoppt die Ausführung der Tasks, die automatisch mit Timern gesteuert werden.");
plugin_registercmd("admin_tm_showtask","admin_tm_showtask",ACCESS_MAP,"admin_tm_showtask : Zeigt die Taskliste, die automatisch mit Timern gesteuert werden.");
exec("logd_reg 62 admin_command tm_welt");
read_file();
checktime =systemtime();
origtimelimit = getvar("mp_timelimit")*60+2;
return PLUGIN_CONTINUE;
}