Beiträge von Hagi

    Du deklariert eine Variable des Typs String


    new playername[MAX_PLAYER_NAME];


    Diese initialisiert du, indem du den Spielernamen da reinschreibst.


    GetPlayerName(playerid,playername,sizeof(playername));


    Jetzt kannst du diesen String z.B. mit SendClientMessage versenden.


    Du kannst aber auch diesen String mit dem Spielernamen in einen anderen String integrieren. Dafür nutzt du den native format



    new string[64];
    format(string,sizeof(string),"Dein Name ist %s",playername);


    Das %s fungiert hier als Platzhalter für eine Variable des Typs Zeichenkette (String). Die Platzhalter werden dann durch die Parameter, die hinten angegeben sind ersetzt. Und zwar in der Reihenfolge wie sie dort stehen.


    Möchtest du jetzt z.B. noch eine Zahl davor schreiben, lautete der Code folgendermaßen:


    format(string,sizeof(string),"Die Zahl %d und dein Name %s",24,playername);


    %d ist hier der Platzhalter für einen Integer, also eine Ganzzahl.


    edit:


    In der Variable (Zeichnkette) "string" steht jetzt dann der Text und dein Name (oder auch ne ZahL, je nachdem was du damit machst). Diesen kannst du natürlich auch in einem Dialog verwenden.


    new pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pName,sizeof(pName));
    new string[128];
    format(string,sizeof(string),"Hallo %s. Bitte wähle ein Geschlecht",pName);
    ShowPlayerDialog(playerid,DIALOG_GESCHLECHT,DIALOG_STYLE_LIST,string,"Männlich\nWeiblich","Button 1","Button 2");


    Die Überschrift des Dialog wäre damit der zuvor formatierte Text:


    Zitat

    Hallo 'hier der Spielername'. Bitte wähle dein Geschlecht

    Was mir jetzt schonmal auffällt:


    Bei dem zweiten Timer könntest du Laufzeit sparen. Denn du rufst diesen zwar mit einem Parameter auf


    SetTimerEx("ZoneTimerA", 8000,1,"i",playerid);,
    verwendest diesen aber nicht. Anstatt dessen läufst du da mit einer for alle Spieler durch.
    Ich weiß jetzt grad nicht genau was deine Methoden machen, da diese aus dem Kontex gerissen sind. Aber da könntest du ja nochmal nachschaun.


    Auch bin ich mir nicht ganz sicher, ob es nicht mehr Sinn macht nur zwei Timer zu erstellen und in den aufgerufenen publics alle Spieler mit einer for (bzw erstmal mit IsPlayerConnected) abzufragen, anstatt für jeden Spieler (beim connecten) zwei eingene Timer zu erstellen. Da müsste sich dann mal einer mit Informationen bezüglich Laufzeit bei Timern hier melden.

    Ja, da dieser als Concat für die Datenbank und die Table wirkt. Der Query wird ja auch ausgeführt, allerdings mit einem leeren Result (es steht halt noch nix in der Table). Wenn ich das ganze per Query in php My Admin ausführe, funktionierts auch perfekt.

    Sieht da wer den Fehler? Oder kanns vllt am Plugin (Stricken) liegen, dass man bei einer einzelnen Spalte store_result nicht aufrufen kann?


    Zitat

    [Fri Jun 14 19:25:54 2013] Function: mysql_query executed: "SELECT `Leiter` FROM `mydatabase`.`User_Stats` WHERE `Name` = 'Hagi_Lorma'" with result: "0".
    [Fri Jun 14 19:25:54 2013] Error (0): Function: mysql_store_result called when no prior successful query executed.


    Hier der Code dazu


    new query[512];
    format(query,sizeof(query),"SELECT `%s` FROM `%s`.`User_Stats` WHERE `Name` = '%s'",statistic,mysqldb,pName);
    mysql_query(query,-1,-1,connection);
    mysql_store_result();
    if(mysql_num_rows() == 0)
    {...


    Weil laut Log bekommt er ein leeres Resultat zurück. Um Mysql_Num_Rows auf zu rufen, muss man doch aber erst was storen oder?

    Ich bin dagegen, da die Regel mit den 48 Stunden existiert und Leute die einfach nur zu dämlich oder einfach zu arrogant sind sich dran zu halten verwarnt werden müssen. Leider wird da grad nicht so hart durchgegriffen. Aber das kann ja wieder kommen.

    Jo gute Idee. Kann den String ja einfach überschreiben.


    forward getSaltString(string[],len);
    public getSaltString(string[],len)
    {
    for(new i = 0;i<len;i++)
    {
    new rand;
    do
    {
    rand = 48+random(75); // minimum 48 | maximum 122
    format(string,len,"%s%c",string,rand);
    }
    while(rand > 57 && rand < 65 || rand > 90 && rand < 97);
    }
    print(string);
    }


    Keine Errors mehr und es funktioniert auch. Jedoch ist noch der Wurm drin. Er nimmt auch die Zeichen zwischen 57 und 65 sowie 90 und 97. Sieht jemand den Fehler in der while loop?


    Hier mal zwei erzeugte Strings. Eigentlich sollten da nur Zahlen und Buchstaben (groß und klein) drin stehen.


    [11:53:40] _fUmS6t?vPMkR9q // 16 cells
    [11:53:40] Lyu5w6Ak5:JoFDK1cCh:rh[EhIYN[?N // 32 cells

    edit: okai hat sich erledigt. Sequenzdiagramm lässt grüßen


    forward getSaltString(string[],len);
    public getSaltString(string[],len)
    {
    for(new i = 0;i<len;i++)
    {
    new rand;
    do
    {
    rand = 48+random(75); // minimum 48 | maximum 122
    }
    while(rand > 57 && rand < 65 || rand > 90 && rand < 97);
    format(string,len,"%s%c",string,rand);
    }
    print(string);
    }


    Damit bleibt leider noch das Problem, dass der Compiler gerne eine Konstante für salt hätte.





    Jo klar das ginge. Ich würde aber gerne mit der Funktion verschiedene Längen von Salt Strings erzeugen können. Und zwar immer so lang wie die zu verwendende Variable

    Okai bleibt nach wie vor das Problem, dass der Compiler für das Array eine Konstante verlangt.



    forward getSaltString(string[],len = sizeof(string)); // 11656
    public getSaltString(string[],len = sizeof(string)) // 11657
    {
    new salt[len]; // 11659
    for(new i = 0;i<len;i++)
    {
    do
    {
    new rand = 48+random(75); // minimum 48 | maximum 122
    new ch[1];
    format(ch,1,"%s",rand);
    strcat(salt,ch);
    }
    while(rand > 57 && rand < 65 || rand > 90 && rand < 97);
    }
    format(string,sizeof(string),"%s",salt);
    print(string);
    }


    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11656) : error 059: function argument may not have a default value (variable "len")
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11657) : error 059: function argument may not have a default value (variable "len")
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11659) : error 008: must be a constant expression; assumed zero
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11659) : error 009: invalid array size (negative, zero or out of bounds)
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11659) : error 036: empty statement
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11659) : fatal error 107: too many error messages on one line

    Hab mir mal was kleines gebastelt, konnte es aber noch nicht testen.


    forward getSaltString(string[]);
    public getSaltString(string[])
    {
    new len = sizeof(string); // 11659
    new salt[len]; // 11660
    for(new i = 0;i<len;i++)
    {
    do
    {
    new rand = 48+random(75); // minimum 48 | maximum 122
    new ch[1];
    format(ch,1,"%s",rand);
    strcat(salt,ch);
    }
    while(rand > 57 && rand < 65 || rand > 90 && rand < 97);
    }
    format(string,sizeof(string),"%s",salt);
    print(string);
    }


    Ich würde damit gerne die Cell Größe von String begrenzen. Allerdings möchte der compiler gerne eine konstante dafür haben. Jemand ne Idee?


    Zitat

    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11659) : warning 224: indeterminate array size in "sizeof" expression (symbol "")
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11660) : error 008: must be a constant expression; assumed zero
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11660) : error 009: invalid array size (negative, zero or out of bounds)
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11660) : error 036: empty statement
    M:\samp03x_Mafia-Police\gamemodes\Mafia-Policev9X_1.pwn(11660) : fatal error 107: too many error messages on one line


    edit: Hab die Funktion noch schnell mal überarbeitet, damit man nur einen Parameter hat.

    Ein ganz leichter Trick ist doch z.b den Zaun genau an der stelle zu verdoppeln und dann einfach um 180° zudrehen.


    Und was machst du wenn der nicht mittig rotiert, sondern weitere Außen?
    Dann passen die Stäbe usw. nicht mehr auf einander.

    Mit Move Object hast du natürlich eine gleichbleibende Geschwindigkeit. Du könntest dass natürlich auch in vielen kleinen Schritten bewegen und dabei die Geschwindigkeit immer weiter (exponential) erhöhen. Das kann natürlich recht Laufzeitintensiv sein.