An der Stelle muss man dir lassen, du hast ein Skript runtergeladen, den Befehl kopiert und veröffentlicht. Finde ich ein reife Leistung.
Props gehen raus an dich mein Freund!
Nützliche Codeschnipsel
- breadfish
- Geschlossen
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Erstmal super, du erstellst für so einen unsauberen und für mich persönlich unnötigen Code ein eigenes Thema, brauch ich, vielleicht deine Defines posten und den Code von Kaliber nehmen.
Bitte denk nächstes Mal nach, bevor du ein neues Thema eröffnestAuch hier gehen wieder Props an dich raus.
-
Ich schreibe das jetzt mal nur hier und nicht in jeden deiner Threads.
- 6 mal falsche Sektion
- Für sowas gibt es den Sammelthread. Da schiebe ich deine Beiträge gleich rein.-- Erledigt :-0
-
-
Damit könnt ihr täglich seperierte logs erstellen lassen.
Wichtig: Um diese Funktion zu nutzen braucht ihr das FileManager Plugin
Achja noch etwas die Funktionen brauchen den scriptfiles Ordner im Pfad (die normalen SAMP Natives nicht) da man ja auch ausserhalb des scriptfiles ordners Ordner erstellen kann.
fileName ist der Dateiname den die Log datei haben soll zB aus chat wird chat.log
directory ist der unter Ordner nach dem Datums Ordner. Bsp: adm_cmds wird logs/05.06/2016/adm_cmds
szString ist der Text der geloggt letzendlich geschrieben werden soll.C
Alles anzeigenstock LogAction(const fileName[], const directory[], const szString[]) { new path[128]; new d,m,y,h,M,s; getdate(y,m,d); gettime(h,M,s); format(path,sizeof(path),"scriptfiles/logs/%02d.%02d.%04d",d,m,y); if(!dir_exists(path)) { dir_create(path); format(path,sizeof(path),"scriptfiles/logs/%02d.%02d.%04d/%s",d,m,y,directory); if(!dir_exists(path)) { dir_create(path); } } format(path,sizeof(path),"logs/%02d.%02d.%04d/%s/%s.log",d,m,y,directory,fileName); new File:pFile = fopen(path,io_append); if(pFile) { new string[1024]; format(string,sizeof(string),"[%02d:%02d:%02d]: %s",h,M,s,szString); fwrite(pFile,string); fwrite(pFile,"\r\n"); fclose(pFile); } }
Am Ende wird dies so aussehen scriptfiles/logs/05.08.2016/chat.log und darin kann dann stehen: [00:46:36]: XeroX: Hi !
-
-
Beitrag von EinfachMax ()
Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Hat vollkommen recht :P (). -
forum.sa-mp.com/showthread.php?p=1701626
Das es soetwas schon gibt war mir fast schon bewusst, jedoch dachte ich das ich das hier mal rein setze.
-
stock SendClientMessageToAllEx(color, string[])
{
new count, lenght = 72;
for(new i, l = strlen(string); i != l; i++)
{
if(string[i] == '{' && string[i+7] == '}')
count += 8;
}
if(strlen(string) > (lenght+count))
{
new text[2][128];
strmid(text[0], string, 0, lenght+count);
strmid(text[1], string, lenght+count, strlen(string));
format(text[0], 128, "%s...", text[0]);
SendClientMessageToAll(color, text[0]);
format(text[1], 128, "...%s", text[1]);
SendClientMessageToAll(color, text[1]);
return 1;
}
SendClientMessageToAll(color, string);
return 1;
}stock SendClientMessageEx(playerid, color, string[])
{
new count, lenght = 72;
for (new i, l = strlen(string); i != l; i++)
{
if(string[i] == '{' && string[i+7] == '}')
count += 8;
}
if(strlen(string) > (lenght+count))
{
new text[2][128];
strmid(text[0], string, 0, lenght+count);
strmid(text[1], string, lenght+count, strlen(string));
format(text[0], 128, "%s...", text[0]);
SendClientMessage(playerid, color, text[0]);
format(text[1], 128, "...%s", text[1]);
SendClientMessage(playerid, color, text[1]);
return 1;
}
SendClientMessage(playerid, color, string);
return 1;
} -
-
-
@Rocky Balboa
die Schleife sollte lieber so aussehenfor(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)
Es ist a) nicht nötig alle Slots durchlaufen zu lassen und b) ist es nicht nötig bei jedem Schleifen durchlauf die Funktion erneut aufzurufen.
-
Am sinnvollsten ist es, gar keine Schleife zu nutzen, da sich die Zahl ohnehin nur an zwei Stellen ändern kann:
Unter den Includes:
new countOnlinePlayers;OnPlayerConnect:
if(!IsPlayerNPC(playerid)) countOnlinePlayers++;OnPlayerDisconnect:
if(!IsPlayerNPC(playerid)) countOnlinePlayers--;Ausgabe:
printf("Es sind %d Spieler online.", countOnlinePlayers); -
Soo.. habs mal verbessert:
stock IsPlayerBehindVehicle(playerid,veh){ new Float:vcoord[3]; GetVehiclePos(veh,vcoord[0],vcoord[1],vcoord[2]); new Float:vangle; GetVehicleZAngle(veh,vangle); new Float:vinfo[3]; GetVehicleModelInfo(GetVehicleModel(veh),VEHICLE_MODEL_INFO_SIZE,vinfo[0],vinfo[1],vinfo[2]); new Float:lenge = floatdiv(vinfo[1],2.0); new Float:radius = floatdiv(vinfo[0],2.0); vcoord[0] = floatadd(vcoord[0],(-lenge * floatsin(-vangle,degrees))); vcoord[1] = floatadd(vcoord[1],(-lenge * floatcos(-vangle,degrees))); if(IsPlayerInRangeOfPoint(playerid,radius,vcoord[0],vcoord[1],vcoord[2])){return 1;} else{return 0;}}So wird sogar die Breite des Fahrzeuges mit einbezogen.
Viel genauer gehts nicht mehr^^Hat da jemand ne bessere Version?
Beim Sultan wird auf 1 returnt wenn ich neben dem Sultan stehe. Beim Ambulance funzt alles. hmm -
Hat da jemand ne bessere Version?
Die Funktion ist eigentlich korrekt so, da mit der Länge und der Breite des jeweiligen Fahrzeugs individuell gearbeitet wird.Du kannst höchstens mal versuchen in IsPlayerInRangeOfPoint dem radius minus 0.1 zu nehmen oder so, dann passt es vielleicht besser zur Seite hin.
-
Also aus "new Float:radius = floatdiv(vinfo[0],2.0);
"new Float:radius = floatdiv(vinfo[0],-0.1);"
?
-
Nein, aus
if(IsPlayerInRangeOfPoint(playerid,radius,vcoord[0],vcoord[1],vcoord[2]))
das hier:
if(IsPlayerInRangeOfPoint(playerid,radius-0.1,vcoord[0],vcoord[1],vcoord[2]))Eventuell auch mehr als 0.1, ich weiß nicht, welche Werte da genau zurück gegeben werden, eventuell benötigt das kleine Anpassungen. Einfach mal ausprobieren, wann es passt.
-
Ich habe mal eben eine kleine Funktion geschrieben damit man for Schleifen ganz einfach und schnell schreiben kann.
C#define LOOP(%0,%1) for(new %1 = 0; %1 < %0; %1++) #define LOOPEx(%2,%0,%1) for(new %1 = %2; %1 < %0; %1++)
Sollte es diese Funktion schon geben, dann ist dies nur eine Ergänzung. -
Naja...ist es jetzt nicht so das wahre
Man sollte eher foreach nutzen oder wenn dann so eine PlayerLoop:
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
//Hier der Rest
}Bei dir macht das nicht wirklich was schneller, zudem kann man den Variablennamen nicht ändern...
Sehe den Sinn darin nicht so ganz... -
Bei dir macht das nicht wirklich was schneller, zudem kann man den Variablennamen nicht ändern...
Sehe den Sinn darin nicht so ganz...Der Sinn seiner Schreibweise ist nicht die Performance sondern die Schnelligkeit im Code-Schreiben. Prinzipiell das Gleiche wie ein Define von SendClientMessage nach SCM.
Mit foreach kann das nicht wirklich verglichen werden.So kann anstatt
for(new i = 0; i < 10; i++)
einfach
LOOP(10, i)
geschrieben werden.Natürlich macht die Abwandlung nur bedingt Sinn, aber einige nutzen dies wohl auch dem Verständnis halber, zumindest habe ich diese Schreibweise schon des Öfteren gesehen.