Schon mal den ganzen Topic durchgelesen ?
http://forum.sa-mp.com/showthread.php?t=264178
http://forum.sa-mp.com/showpost.php?p=2498551&postcount=63
ZitatPawn is not thread-safe. This plugin is useful only if you want to crash your server.
^ ^ ^ ^
Schon mal den ganzen Topic durchgelesen ?
http://forum.sa-mp.com/showthread.php?t=264178
http://forum.sa-mp.com/showpost.php?p=2498551&postcount=63
ZitatPawn is not thread-safe. This plugin is useful only if you want to crash your server.
^ ^ ^ ^
Dein Script hat sicherlich irgendwo Fehler, diese Fehler nutzt der "Angreifer" genau aus.
am besten du versuchst folgendes Plugin zu installieren:
http://forum.sa-mp.com/showthread.php?t=262796
dann wird dir angezeigt wo im Script dein Server abstürzt
alternativ kannst du noch mit printf(..) Befehlen arbeiten
Gibt es eine 0.3x Version ?
ja die gibt es, von Leuten die nicht Fake-Spieler Funktionen einbauen ![]()
hier: http://forum.sa-mp.com/showthread.php?t=355849
und hier: http://forum.sa-mp.com/showthread.php?t=428066
Alles anzeigennew string[64];
new File:file = fopen("FKassen.ini", io_read);
while(fread(file, string)) /
{
if(strcmp(string, "\n", true) == 0)
{
}
}
das while(fread(...)) geht alleine durch alle Zeilen durch ![]()
lediglich noch eine IF-Abfrage um sicher zu sein das die Zeile nicht leer ist und schon bist du fertig
new string[64];
new File:file = fopen("FKassen.ini", io_read);
new id=0;
while(fread(file, string))
{
if(string[0] != 0 && string[0] != '\n') // zeile nicht leer ?
{
FKasse[id] = strval(string);
id++;
}
}
http://wiki.sa-mp.com/wiki/Fread
Schau den Teil an: Reading Line-by-Line
nebenbei: wenn der server die FKassen das zweite mal speichert, dann sind alle Kassen 2 Mal eingetragen da du die Datei mit io_append (anhängen) öffnest:
new File:File = fopen("FKassen.ini",io_append);
wenn du io_write verwendest wird die Datei erst geleert und dann mit den neuen FKassen beschrieben:
new File:File = fopen("FKassen.ini",io_write);
Heyho,
kennt jemand die Animation für die "Arme nach vorne strecken" ?
Finde irgendwie keine passende Animation, die so ausschaut![]()
SetPlayerSpecialAction(playerid, SPECIAL_ACTION_CARRY);
funktioniert erst ab SA-MP 0.3x
Das was Arendium gepostet hat erfüllt seinen Zweck recht gut ![]()
http://www.woltlab.com/de/plug…plugin.html?pluginID=1131
mit so einer Frage: http://nsg-page.de/forum/index.php?page=Register
unterbindet so gut wie ALLE Bot-Registrierungen
wenn du ein "\" einfügen willst, musst du ein doppeltes \ schreiben:
"Logs\\Error.log"
\ wird als escape-Zeichen verwendet, also quasi:
"Text \" text geht weiter, obwohl schon ein Anführungszeichen geschrieben wurde"
mit 2 \\ fügst du ein normales \ Zeichen ein ![]()
HTTP(0, HTTP_GET, "localhost/home.php?name=Beavis&reason=Testzweck", "", "KickPlayer");
HTTP_GET und die komplette url einfach vorne einfügen ![]()
EDIT: und im php-Code mit $_GET arbeiten
Alles anzeigenIch hab mal ne Frage
bei den hier:
function GetTimeStampFormDatabase($input)
{
$ergebnis = mysql_query("SELECT FROM_UNIXTIME($input, '%d.%m.%Y %T');");
return $ergebnis;
}
Wie kann ich es machen das er mir das ergebnis ausgibt?
In pawn nutz ich das so:
Spoiler anzeigen GetTimestamp(Timestamp)
{
new Wert[50],query[128];
format(query, 128, "SELECT FROM_UNIXTIME(%d, '%s.%s.%s %s');", Timestamp, "%d","%m","%Y","%T");
mysql_query(query, (-1), (0), SQL);
mysql_store_result(SQL);
mysql_fetch_string(Wert,SQL);
mysql_free_result(SQL);
return Wert;
}
nur wie mach ich sowas in php?
Auslesen tue ich es soo:
$UserDabei = GetTimeStampFormDatabase($RegisterTime);
die Verwendung von mysql um einen Timestamp zu einem Datum umzurechnen ist in PAWN schon WIRKLICH dämlich.
und in php ERST RECHT dämlich, gibt dazu extra eine Funktion...
man braucht doch dafür echt kein sscanf ![]()
ocmd:nummernschild(playerid,params[])
{
new len = strlen(params);
if( len < 1 || len > 2 )
{
return SendClientMessage(playerid,clearrot,"Benutze: /nummernschild [2 Buchstaben]");
}
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) // ist der spieler überhaupt in einem auto ?
{
new string[16];
format(string,sizeof(string),"LS-%s",params);
SetVehicleNumberPlate(GetPlayerVehicleID(playerid),string);
}
return 1;
}
EDIT: Nebenbei: das Fahrzeug muss erst respawnen damit das Nummernschild auch erscheint
format(Haus[i][hBesitzer], MAX_PLAYER_NAME, SpielerInfo[playerid][pName]);
Kurz gesagt: strings weißt man nicht mit = zu
Wo ist mein jetzt falsch / "falsch" ?
Sieht komischerweise exakt wie deins aus
war auf Topic-Ersteller + erste Antwort bezogen ![]()
beides "falsch"
Hier 2 Beispiele:
Ist der erste Buchstabe ein T ?
if(text[0] == 'T')
Ist der erste Buchstabe ein N ?
if(text[0] == 'N')
Sind Strings wieder entbuggt bei SetTimerEx?
MfG
ZitatSetTimerEx - Arrays and strings do not work correctly - they will always pass only one string.
ich benutze in meinem Beispiel nur einen, also gibt es keine Probleme
glaub kaum das Arendiums Version oberhalb so klappen wird ![]()
Habe im Prinzip das gleiche schon einmal für meinen Server gebraucht:
Funktion für Globale TextDraws:
SetTextDrawDelayString(Text:textid, text[], timePerChar) // by nsg-page.de
{
if(text[0] != '\0') SetTimerEx("TextStepByStep", timePerChar, 0, "dsdd", _:textid, text, timePerChar, 1);
return 1;
}
forward TextStepByStep(Text:textid, text[], timePerChar, num);
public TextStepByStep(Text:textid, text[], timePerChar, num)
{
new newText[128];
format(newText, sizeof(newText), "%s", text);
if(newText[num] != '\0')
{
SetTimerEx("TextStepByStep", timePerChar, 0, "dsdd", _:textid, newText, timePerChar, num+1);
}
newText[num] = '\0'; // cut text
TextDrawSetString(textid, newText);
}
Verwendung:
SetTextDrawDelayString(textdrawid, "Dein Text", 200);
Funktion für Playerbezogene TextDraws:
SetPlayerTextDrawDelayString(playerid, PlayerText:textid, text[], timePerChar) // by nsg-page.de
{
if(text[0] != '\0') SetTimerEx("PlayerTextStepByStep", timePerChar, 0, "ddsdd", playerid, _:textid, text, timePerChar, 1);
return 1;
}
forward PlayerTextStepByStep(playerid, PlayerText:textid, text[], timePerChar, num);
public PlayerTextStepByStep(playerid, PlayerText:textid, text[], timePerChar, num)
{
new newText[128];
format(newText, sizeof(newText), "%s", text);
if(newText[num] != '\0')
{
SetTimerEx("PlayerTextStepByStep", timePerChar, 0, "ddsdd", playerid, _:textid, newText, timePerChar, num+1);
}
newText[num] = '\0'; // cut text
PlayerTextDrawSetString(playerid, textid, newText);
}Verwendung:
SetPlayerTextDrawDelayString(playerid, textdrawid, "Dein Text", 200);
Alles anzeigenEs soll ja auch nur einmal Funktionieren, da
{2307.9595,2418.8325,10.8203,"{FF8400}Buslinie 1:\nBank\nVisage Hotel\nAirport\nAutohaus Autobahn\nSupermarkt\nSteakhaus\nAmmunation\nPolice Department"},
{2142.4578,2358.4353,10.8203,"{FF8400}Buslinie 1:\nVisage Hotel\nAirport\nAutohaus Autobahn\nSupermarkt\nSteakhaus\nAmmunation\nPolice Department\nBank"},
{2049.8838,1918.2258,12.3294,"{FF8400}Buslinie 1:\nAirport\nAutohaus Autobahn\nSupermarkt\nSteakhaus\nAmmunation\nPolice Department\nBank\nVisage Hotel"},
{1716.2192,1377.9611,10.6406,"{FF8400}Buslinie 1:\nAutohaus Autobahn\nSupermarkt\nSteakhaus\nAmmunation\nPolice Department\nBank\nVisage Hotel\nAirport"},
{2078.6287,1413.8086,10.8203,"{FF8400}Buslinie 1:\nSupermarkt\nSteakhaus\nAmmunation\nPolice Department\nBank\nVisage Hotel\nAirport\nAutohaus Autobahn"},
{2158.1570,1992.6667,10.8203,"{FF8400}Buslinie 1:\nSteakhaus\nAmmunation\nPolice Department\nBank\nVisage Hotel\nAirport\nAutohaus Autobahn\nSupermarkt"},
{2386.3877,1967.5383,10.8203,"{FF8400}Buslinie 1:\nAmmunation\nPolice Department\nBank\nVisage Hotel\nAirport\nAutohaus Autobahn\nSupermarkt\nSteakhaus"},
{2533.2708,2092.8899,10.8203,"{FF8400}Buslinie 1:\nPolice Department\nBank\nVisage Hotel\nAirport\nAutohaus Autobahn\nSupermarkt\nSteakhaus\nAmmunation"}
sobald dein Bus die Linie ein zweites mal fährt sind die Daten leider gelöscht ![]()
EDIT:
Hier ist der ganze Code ohne dem "num" Parameter, da du den anscheinend gar nicht brauchst ![]()
stock FindNextHaltestelle(Input[])
{
new i = 0;
new result[64], result_num = -1;
while(Input[i] != '\0')
{
if(Input[i] == '\n')
{
if(result_num != -1)break;
result_num = 0;
i+=1; // setze *i* nach "\n"
}
if(result_num > -1)
{
result[result_num] = Input[i];
result_num++;
}
i++;
}
return result;
}
Beavis:
sobald du deine Funktion einmal ausgeführt hast wird der Inhalt von "BusInfo[code=c][bLable]" bis auf das eine Ergebnis gelöscht ... heißt es Funktioniert nur ein einziges mal deine "bessere" Funktion
beachte lieber meinen oberen Beitrag, da hatte ich es schon erklärt
EDIT: nebenbei, das ist nicht aufwendig sofern man Arrays/Zeichenketten komplett verstanden hat. So ein Code ist innerhalb von 2-3 Minuten fertig (schneller als ewig mit strdel zu spielen ![]()
Alles anzeigenIch brauch mal ein Denkanstupser
Ich habe mir die Funktion gebastelt:
stock FindNextHaltestelle(Input[])
{
new str[128];
new pos = strfind(Input,"\n");
strdel(Input,0,pos);
format(str,128,"%s",Input);
pos = strfind(Input,"\n");
strdel(str,pos,sizeof(str));
return str;
}
So mit der Funktion möchte ich den Text aufteilen bzw die erste Haltestelle anzeigen lassen
Das ist mein Input:
"{FF8400}Buslinie 1:\nBank\nVisage Hotel\nAirport\nAutohaus Autobahn\nSupermarkt\nSteakhaus\nAmmunation\nPolice Department"
Ich möchte das er mir nur Bank ausgibt, doch leider gibt er mir nichts aus
Hat jemand ne idee wo ich was falsch gemacht habe?
//edit
Habe das jetzt so
stock FindNextHaltestelle(Input[])
{
new pos = strfind(Input,"\n");
strdel(Input,0,pos+1);
pos = strfind(Input,"\n");
strdel(Input,pos,strlen(Input));
return Input;
}
Lass ich es in der Funktion printen, dann zeigt er alles Sauber an
Lass ich es aber als Message senden, dann sendet der mir irgendein Mist von A-Z Sonderzeichen etc
Alle Zeichenketten/Strings werden als original an Funktionen Übergeben
heißt wenn du mit strdel arbeitest löscht du einfach den Rest und kannst danach gar keine weitere Haltestelle mehr abrufen, weil die Daten gelöscht wurden (bei Syno: seinem Beispiel der selbe Fehler
)
So sollte es klappen:
stock FindHaltestelle(Input[], num)
{
new num_count = 0, i = 0;
new result[64], result_num = 0;
while(Input[i] != '\0')
{
if(Input[i] == '\n')
{
if(Input[i+1] == '\0')break; // *Input[]* endet mit "\n" (danach ist nichts mehr zu finden) -> BREAK
num_count++;
i+=1; // setze *i* nach "\n"
}
if(num_count == num)
{
result[result_num] = Input[i];
result_num++;
}
i++;
}
return result;
}
Laut deinem beispiel-text:
FindHaltestelle(Input[], 0) -> "{FF8400}Buslinie 1:"
FindHaltestelle(Input[], 1) -> "Bank"
FindHaltestelle(Input[], 2) -> "Visage Hotel"
FindHaltestelle(Input[], 3) -> "Airport"
...
Hat viel mit Standort des Servers und den Ping zum Master Server zu tun.
Eigentlich hat das damit überhaupt nichts zu tun ![]()
Der SA-MP Browser holt die Liste aller Server(5000-7000) von der SA-MP Seite. Der Browser geht dann diese Liste von oben nach unten durch. Wenn der Server weit oben in der Liste ist wird er schneller geladen, wenn er weiter unten ist wird er natürlich später geladen(kann bis zu 15 Minuten dauern bis alle Server geladen sind).
Die Anordnung der Server-Liste ändert sich alle 10-20 Minuten und diese Anordnung hat nichts mit Ping/Standort zu tun ![]()