Tortzdem meint er es sei so gemacht worden.
Ich habe gesagt so könnte es eventuell gemacht worden sein.
Da du nicht verstehst, dass im strfind eine for/while loop benutzt werden muss um sowas zu ermitteln
Tortzdem meint er es sei so gemacht worden.
Ich habe gesagt so könnte es eventuell gemacht worden sein.
Da du nicht verstehst, dass im strfind eine for/while loop benutzt werden muss um sowas zu ermitteln
Und ich sage dir, dass KEIN loop benutzt werden muss, um den gesuchten text zurükzugeben oder zu finden.
Wir haben beide verschiedene meinungen, und gut is.
Gibts noch ein anderen grund um zu diskutieren?
Ich denke nicht.
Also hören wir lieber auf hier das Codeschnipsel-Thema vollzuspammen, bevor wir beide eine Verwarnung kassieren.
Hier eine "fremoveline" Funktion.
Ich weiß, soein riesen großen String mit 1024 Charactern ist nicht gerade so "gut", aber ein besseren fremoveline als das gibts noch nicht:
http://pastebin.com/0eqXNxew
stock fremoveline(filedir[],lindex[]) //bY FoxHound
{
if(!fexist(filedir)) { return 0; }
new rdline[196],str[1024],File:tmpfile = fopen(filedir,io_read);
while(fread(tmpfile,rdline)) {
if(strfind(rdline,lindex)>-1) { continue; }
strins(str,rdline,strlen(str)); }
fclose(tmpfile),fremove(filedir);
tmpfile=fopen(filedir,io_write);
return fwrite(tmpfile,str),fclose(tmpfile),1;
}
Das andere "fdeleteline" braucht noch 2 funktionen dabei und funktioniert dazu nichtmal, mein "fremoveline" braucht nur "sich selbst"
Naja, falls jemand was besseres hat, kann er's ja posten.
Hab die Funktion getestet und es funktioniert wunderbar (nicht bei Files benutzen die INSGESAMT länger sind als 1024 zeichen [falls ihr das unbedingt benutzen musst, dann erhöht die größe von "string" auf 2048 oder so, auch wenn es gigantisch groß ist, man kann nichts dagegen machen...]).
Viel Spaß damit...
keine ahnung obs schon gepostet wurde, aber habs gerade in nem alten skript von mir gefunden und dachte vllt braucht das jmd.
stock randomEx(...)
{
return getarg( random( numargs( ) ) );
}
Gibt eine zufällige zahl von den angegebenen zahlen zurück. Beispiel:
SetWeather(randomEx(1,2,3,4,5,6,7,8,9)); // Ändert das Wetter per zufall auf eine der angegebenen Zahlen
Man kann doch theoretisch den String Global machen, sodas nicht immer bei einem neuen Aufruf der Funktion belegt wird.
Bevor jemand jetzt kommt und meint die Variable könnte ja doppelt belegt sein, hier die Lösung
Man gibt ihr einen so wirren Namen, so das die warschenlichkeit einer doppelbelegung gen 0 geht
Ja, aber es sollte jetzt nicht so sein "Das hier da hin kopieren, das hier da und das hier da ganz unten ins script...", es sollte nur eine einzige Funktion sein
Wie gesagt, was besserees alleine geht nicht, daas andere fdeleteline vom Wiki was überall gepostet wird, funktioniert eh nicht.
Da ich sowas auch noch nicht gesehen habe, und Robdeflop es gebraucht hat, habe ich ein kleines vielleicht ganz nützliches Script geschrieben, dass die Differenz zwischen 2 Daten in Tagen angibt.
stock CheckDateDifference(tag1, monat1, jahr1, tag2, monat2, jahr2);
{
new days;
if(tag1 < tag2 && monat1 <= monat2 && jahr1 <= jahr2) return -1;
while(tag1 != tag2 || monat1 != monat2 || jahr1 != jahr2)
{
days++;
tag1++;
if(tag1>28 && monat1 == 2)
{
tag1=1;
monat1++;
}
if(tag1>30 && (monat1 == 4 || monat1 == 6 || monat1 == 9 || monat1 == 11))
{
tag1=1;
monat1++;
}
if(tag1>31 && (monat1 == 1 || monat1 == 3 || monat1 == 5 || monat1 == 7 || monat1 == 8 || monat1 == 10 || monat1 == 12))
{
tag1=1;
monat1++;
}
if(monat1>12)
{
tag1=1;
monat1=1;
jahr1++;
}
}
return days;
}
Ich denke es ist eigentlich selbsterklärend. Einziger Manko aktuell: Schaltjahre werden nicht beachtet, das heißt, dass alle 4 Jahre 1 Tag zu wenig vom Script berechnet wird, was aber eigentlich nicht weiter tragisch sein sollte.
Beachtet bitte für das Snippet auch, dass das 2. Datum größer dem 1. sein muss, ansonsten wird -1 zurückgegeben (kann dann natürlich auch abgefragt und mit Fehlermeldung zurückgegeben werden).
Mit freundlichen Grüßen
Padarom
Beachtet bitte für das Snippet auch, dass das 2. Datum größer dem 1. sein muss, ansonsten wird -1 zurückgegeben (kann dann natürlich auch abgefragt und mit Fehlermeldung zurückgegeben werden).
new days = CheckDateDifference(2, 2, 2011, 3, 1, 2011);
Denk mal drüber nach, was hier in "days" gespeichert wird...
ǝɟıǝlɥɔssolpuǝ <- sʇɥɔıu ɹɐƃ
Alles anzeigennew PlayerCount;
#define ForAll(%0) for(new %0, _ForAllCount_%0; _ForAllCount_%0 < PlayerCount+1 && %0 < MAX_PLAYERS && _ForAllCount_%0 < MAX_PLAYERS; %0++)
public OnPlayerConnect(playerid) { PlayerCount++; }
public OnPlayerDisconnect(playerid, reason) { PlayerCount--; }Zählt wie bekannte ForAll's alle Spieler durch.
Aber:
Wenn z.b. 10 Spieler auf 500 maximalen Slots sind, wird die for-Schleife nur 10 mal ausgeführt, also nur, bis auch alle 10 Spieler bearbeitet wurden. Der Rest wird ignoriert und spart damit Zeit + Leistung.
Die jeweilige Bearbeitung von PlayerCount in OnPlayer(Dis-)Connect macht die ständige Verwendung einer weiteren Schleife, um die verbundenen Spieler zu zählen, unnötig.
Aber sagen wir mal es sind grade 50 User auf den server die Letzte id ist ID 50 dann nach 10 minuten habe ich nur noch 10 User drauf und die Letzte ID ist immer noch 50 dan ruft er ja nicht mehr die id 50 ab oder teuche ich mich da ?
Aber sagen wir mal es sind grade 50 User auf den server die Letzte id ist ID 50 dann nach 10 minuten habe ich nur noch 10 User drauf und die Letzte ID ist immer noch 50 dan ruft er ja nicht mehr die id 50 ab oder teuche ich mich da ?
Das ist so wie ich das sehe korrekt. Des weiteren wird der Code 500 mal durchlaufen (MAX_PLAYERS mal), denn der einzige Teil des Codes, der mit PlayerCount ueberhaupt verglichen wird bleibt immer der gleiche. Damit ist der Code ziemlich unnuetz, denn das sollte ja eigentlich vermieden werden.
Habe es mal etwas ueberarbeitet. Kann aber noch verbessert/optimiert werden. So waere '_ForAllCount_++;' eigentlich nicht noetig, aber eine Moeglichkeit, die ich vorher hatte haette die '{' nach dem else gehabt und damit den Code bei nutzung von ForAll() etwas unuebersichtlicher gemacht.
// Parameter = Zaehler Variable, sollte = 0, oder playerId des spielers mit niderigster Id sein
#define ForAll(%0) for(new _ForAllCount_ = PlayerCount; _ForAllCount_ > 0 && %0 < MAX_PLAYERS; %0++ , _ForAllCount_-- ) \
if ( !IsPlayerConnected(%0) ){ _ForAllCount_++; continue; } \
else
Bsp.:
new playerid = 0;
ForAll(playerid)
{
playerid ist ein mit dem Server verbundener Spieler (valid)
}
Double-O-Seven hatte dafür schon ForEachPlayer gepostet.
Nützlich zum erstellen von Logs :
stock Log(logname[],input[])
{
new hour,minute,second;
gettime(hour,minute,second);
new File:Logfile,saveformat[64],dataformat[256];
format(saveformat,64,"%s.txt",logname);
if(!fexist(saveformat))
{
Logfile = fopen(saveformat,io_write);
}
Logfile = fopen(saveformat,io_append);
format(dataformat,256,"[%i:%i:%i] %s\r\n",hour,minute,second,input);
fwrite(Logfile,dataformat);
fclose(Logfile);
return 1;
}
Beispiel:
public OnPlayerText(playerid, text[])
{
new string[128],name[20];
GetPlayerName(playerid,name,20);
format(string,128,"%s: %s",name,text);
Log("Chatlog",string);
return 1;
}
Wenn die Datei nicht exestiert öffnest du sie 2mal einmal zu schreiben und einmal zum adden.
Und du schließt sie auch nur einmal.
Sinn?
entweder musst du es über else machen oder so
stock Log(logname[],input[])
{
new hour,minute,second;
gettime(hour,minute,second);
new File:Logfile,saveformat[64],dataformat[256];
format(saveformat,64,"%s.txt",logname);
Logfile = fopen(saveformat, (!fexist(saveformat)) ? io_write : io_append);
format(dataformat,256,"[%i:%i:%i] %s\r\n",hour,minute,second,input);
fwrite(Logfile,dataformat);
fclose(Logfile);
return 1;
}
Kennt jemand nen Codeschnipsel, damit man \n auch in SendClientMessage nutzen kann?
Meinst du das man \n im Chat InGame nutzten kann oder einfach wenn du Nachrichten mit
SendClientmessage versendest.
Falls du SendClientmessage meinst ja kénne ich.
Du machst das so:
SendClientMessage(playerid,COLOR,Test\n);
SendClientMessage(playerid,COLOR,Test 2);
Ich versteh nicht wofür du es brauchst jedoch könnte ich dir erklären wie du den SChnipsel bastelst.
Frag ab ob \n in SendClientmessage vorkommt falls ja speichere das hinter \n und sende es dann als Nachricht und das Davor drüber.
Mit freundlichen Grüßen
Sven
Genau das mein ich
ich hab z.B. Meine stats per befehl (/stats).
Den string möchte ich jedoch nur einmal formatieren...
format(string,128,"Level: %d | Geld: %d\nAdmin: %d | Fraktion: %d",...);
Hier bitte keine Scriptfragen stellen!
Nur mal ein Hinweis
Ich hab ja nach nem Codeschnipsel gefragt
Function CustomMessage(color,const string[],level)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if (PlayerInfo[i][pAdmin] >= level)
{
SendClientMessage(i, color, string);
printf("%s", string);
}
}
return 1;
}
format(string, sizeof(string), %s, playername);
CustomMessage(COLOR_YELLOW,string,Adminlevel);
//edit
Define fehlt.
#define Function%0(%1) forward%0(%1); public%0(%1)
Somit kann man ab einem bestimmten Level eine Nachricht bekommen, bzw. einen Text.
Schön und Gut,dass du eine Funktion postest die nützlich sein könnte,aber: