Beiträge von Jeffry

    Die Gründe warum ich auf die Scripting Base verweise






    Hallo zusammen,


    da ich trotz dem, meiner Meinung nach doch recht auffälligen, Hinweis auf meinem Profil sich bezüglich Scripting Problemen, vor allem denen die PAWN Codes betreffen, über die Scripting Base an helfende User zu wenden, fast täglich Nachrichten bekomme, in denen Fragen zu PAWN Codes, oft auch mit PAWN Codes dabei, bekomme, möchte ich hier einmal kurz erläutern, warum ich diese Fragen nicht privat beantworte.
    Außerdem schildere ich kurz um welche Fragen es geht und welche Ausreden ich ständig lese, warum, trotz des Hinweises, dennoch eine Nachricht geschickt wird.




    Welche Fragen gehören dazu?

    • Jede Frage die einen PAWN Code mit sich bringt.
    • Fragen zu Scripting Funktionen.
    • Fragen zum Vorgehen beim Erstellen von diversen Systemen.
    • Alle weiteren Fragen, die sich in irgendeiner Art und Weise auf PAWN-Codes beziehen.
    • Anfragen bezüglich TeamViewer, Skype, TeamSpeak, ...




    Welche Ausreden werden häufig gebracht und warum sind sie ungültig?

    • "Meine Idee ist einzigartig und gab es so noch nie."
      => Interessanterweise habe ich die sogenannte einzigartige Idee, genau wenn diese Ausrede kommt, schon mehrmals alleine hier im Forum gesehen, in der einen oder anderen Variation, aber vom Prinzip her genau gleich. Nur in ganz seltenen Fällen ist so eine Idee wirklich neu, aber auch das gibt keinen Grund die Scripting Base zu meiden, irgendwann stellt dort ja immer jemand die erste Frage zu einem System/Problem.


    • "Ich möchte meinen Code nicht veröffentlichen."
      => Dies ist meiner Meinung nach die schlechteste Ausrede überhaupt und geht total am Sinn eines Forums vorbei, dazu später mehr.


    • "TeamViewer (etc.) ist geschickter und geht schneller."
      => Nein. Ganz einfach deshalb, da man dann oft, und ich spreche da aus Erfahrung, ein-zwei Stunden dran sitzt, bis das Problem tatsächlich behoben ist und alles getestet ist. Diese Zeit fällt bei der Hilfe über die Scripting Base weg, was mehr Zeit für andere hilfesuchende User bringt. Außerdem können solche Posts in ein paar Minuten geschrieben werden, eine TeamViewer Session ist nicht nach 5 Minuten beendet, da viele alleine so lange dafür brauchen, um ihren Code zum Host hochzuladen.


    • "Es ist nur eine kleine Frage, eine PN geht schneller."
      => Für kleine Fragen gibt es den Sammelthread für kleine Scripting Fragen, zudem wüsste ich nicht, wie eine PN, die an einen User geht, schneller beantwortet sein kann, als eine Frage, die sich an hunderte User richtet und die der eine User dort ja auch sieht und somit mindestens gleichschnell beantworten kann. Schneller geht das also auf keinen Fall.


    • "Nur einmal eine Ausnahme."
      => Wenn mir jemand rechtfertigen kann, warum er/sie eine Ausnahme wert ist, dann würde ich diese Ausrede akzeptieren. Allerdings kann dies niemand rechtfertigen. Außerdem bleibt das aus Erfahrung nie bei dem einen mal.


    • "Ich will nicht, dass das jemand vor mir fertig hat oder macht."
      => Ein Forum basiert auch darauf, dass man Ideen finden kann. Möchte man das nicht, ist man hier falsch am Platz. Dazu aber auch später mehr.


    • "Ich will nicht extra einen Thread erstellen."
      => Da frage ich mich, warum? Ein neuer Thread nimmt auf der Datenbank wohl kaum mehr Speicher ein als eine neue Konversation, warum dann also kein neuer Thread? Und wenn es nur eine kleine Frage ist, dann kann diese im Sammelthread für kleine Scripting Fragen gestellt werden.




    Warum verweise ich also auf die Scripting Base?

    • Der Grund ist ganz einfach: Private Anfragen zu Scripting Problemen gehen am Sinn des Forums vorbei.
      Der Sinn des Forums, vor allem der der Scripting Base, ist es doch, dass möglichst viele User möglichst schnell eine Lösung auf ihr Problem finden können. Es gibt tausende von Usern, die täglich Lösungen im Forum finden, da die gleiche Frage, die sie haben, bereits gestellt und beantwortet wurde. Würden alle diese Fragen nur in privaten Konversationen beantwortet werden, dann könnte niemand die Lösung finden, somit müsste jede Frage beantwortet werden und zwar ständig und immer wieder die gleichen Fragen. Außerdem besteht keine Möglichkeit jemanden an eine Konversation zu verweisen, in dem die Lösung zu finden ist. Dies bringt daher alles einen extremen Mehraufwand, der nichts zur Aktivität des Forums beisteuert.
    • Ein Forum lebt ja schließlich durch seine Aktivität, also durch seine Posts. Ein Forum, das nur aus privaten Konversationen besteht würde nicht lange überleben. Dazu gehören somit auch TeamViewer Sessions und andere private, nicht öffentlich dokumentierte, Lösungswege. Daher ist die Ausrede, dass ein Code nicht öffentlich sein sollte wenn man nach Hilfe sucht, meiner Meinung nach die schlimmste Ausrede, da sich ein Forum aus Geben und Nehmen am Leben hält, das heißt man gibt etwas, in dem Fall Code, Ideen oder ähnliches, und nimmt dafür kostenlose Hilfe in Anspruch. Wer als Hilfesuchender Ansprüche stellt und sich weigert den gewünschten Weg zu nehmen, der hat meiner Meinung nach keine Hilfe nötig.
    • Jedes Support-Forum besteht auf dem Prinzip der Gegenseitigkeit. Ich unterstütze die Umgehung dieses Prinzips nicht und gebe daher keinen Support via privaten Konversationen, auch nicht ausnahmsweise.



    Vielen Dank für euer Verständnis.


    Beste Grüße,
    Jeffry 8)

    Die Zeile ist dem Compiler zu lang.
    Versuche es so:
    stock SpielerSpeichern(playerid)
    {
    if(sInfo[playerid][pEingeloggt] == 0)return 1;
    new query[512];
    format(query, sizeof(query), "UPDATE user SET Level='%i', Respektpunkte='%i', BarGeld='%i', BankKonto='%i', BankGeld='%i', Fraktion='%i', FraktionRang='%i', Spawn='%i', Handy='%i',",
    GetPlayerScore(playerid), sInfo[playerid][pRespektpunkte], GetPlayerMoney(playerid), sInfo[playerid][pBankKonto], sInfo[playerid][pBankGeld], sInfo[playerid][pFraktion],
    sInfo[playerid][pFraktionRang], sInfo[playerid][pSpawn], sInfo[playerid][pHandy], sInfo[playerid][pHandynummer]);
    format(query, sizeof(query), "%sHandynummer='%i', PayDay='%i', Spielzeit='%i', Jail='%i', JailTime='%i', Prison='%i', PrisonCheckpoints='%i', AdminLevel='%i' WHERE id='%i'",
    query, sInfo[playerid][pPayDay], sInfo[playerid][pJail], sInfo[playerid][pJailTime], sInfo[playerid][pPrison], sInfo[playerid][pPrisonCheckpoints],
    sInfo[playerid][pAdminLevel],sInfo[playerid][pID]);
    mysql_function_query(Handle, query, false, "", "");
    SpielerReset(playerid);
    return 1;
    }

    Das Problem ist, dass du das Array gesprengt hast, mit der [128] Angabe. Die darf dort nicht stehen.
    Versuche es so:


    stock LoadNames()
    {
    new indu = 0;
    new str1[48];
    while(indu < MAX_RANKS)
    {
    format(str1, sizeof(str1), "%d", indu);
    format(rankInfo[indu][name1],128, mysql_GetString("fraktionsranke", "name1", "FrakID", str1));
    format(rankInfo[indu][name2],128, mysql_GetString("fraktionsranke", "name2", "FrakID", str1));
    format(rankInfo[indu][name3],128, mysql_GetString("fraktionsranke", "name3", "FrakID", str1));
    format(rankInfo[indu][name4],128, mysql_GetString("fraktionsranke", "name4", "FrakID", str1));
    format(rankInfo[indu][name5],128, mysql_GetString("fraktionsranke", "name5", "FrakID", str1));
    format(rankInfo[indu][name6],128, mysql_GetString("fraktionsranke", "name6", "FrakID", str1));
    printf("LoadFraktionRangs - rangname1: %s",rankInfo[indu][name1]);
    printf("LoadFraktionRangs - rangname2: %s",rankInfo[indu][name2]);
    printf("LoadFraktionRangs - rangname3: %s",rankInfo[indu][name3]);
    printf("LoadFraktionRangs - rangname4: %s",rankInfo[indu][name4]);
    printf("LoadFraktionRangs - rangname5: %s",rankInfo[indu][name5]);
    printf("LoadFraktionRangs - rangname6: %s",rankInfo[indu][name6]);
    indu++;
    }
    return;
    }

    Also ein Beispiel sieht dann z.B. so aus:

    Das würde aber keinen Sinn machen, da würde man Speicher verschwenden, dass es knallt. Außerdem war die Aussage auf den Code von m4a_X bezogen.



    Klappt bei mir wunderbar

    Sind auch keine 4 Dimensionen ;)



    wen dann aber so.

    Genau das wird dir auf Grund der 4 Dimensionen (zwei davon im enum) mehrere Errors bringen.


    Und zwar diese:
    error 001: expected token: "}", but found "["
    error 010: invalid function or declaration


    Das klappt also wie gesagt nicht.

    @m4a_X Das geht hier nicht, da er dann 4 Dimensionen hat, das ist nicht möglich.



    Das, was du da vor hast, ist so nicht möglich, du kannst keine Variable dir "zusammenformatieren" und dann auf diese per String zugreifen.
    Du musst dafür ein mehrdimensionales Array anlegen, das geht hier aber auch nicht mehr, da du dann wie gesagt 4 Dimensionen (Fraktion, Enum, Rang, Namenslänge) benötigst. Du könntest entweder die Namen aus dem enum auslagern, oder du machst es so:
    new team = PlayerInfo[i][Team];
    switch(PlayerInfo[i][rankteam])
    {
    case 1: format(string2, sizeof(string2), "%s %s %d" ,Fraktionenranke[team][name1] ,Spielername(i), i);
    case 2: format(string2, sizeof(string2), "%s %s %d" ,Fraktionenranke[team][name2] ,Spielername(i), i);
    case 3: format(string2, sizeof(string2), "%s %s %d" ,Fraktionenranke[team][name3] ,Spielername(i), i);
    }


    Beim Auslagern hättest du dann eine Variable:
    new frakRangNames[MAX_FRAKS][MAX_RANKS][32];
    Dann könntest du so darauf zugreifen:
    new team = PlayerInfo[i][Team], rank = PlayerInfo[i][rankteam];
    format(string2, sizeof(string2), "%s %s %d" ,frakRangNames[team][rank] ,Spielername(i), i);

    In PAWN ist es von der Deklaration und dem Datenaufbau her das gleiche, ein String ist eine Verkettung von Zeichen, in dem Fall ein Array.


    Wenn du zu viel eingibst wird zu viel Speicher reserviert, erstmal ist das nicht schlimm, man sollte es aber nicht übertreiben, und für eine Namensvariable 5000 Zeichen reservieren.

    Wenn du in eine Variable mehrere einzelne Werte speichern willst, dann brauchst du das.
    Sprich zum Beispiel bei Strings, da hast du ja mehrere Zeichen hintereinander, oder bei Spielervariablen, da hast du ja die gleiche Bezeichnung für jeden Spieler.


    Sowas nennt sich dann ein Array.
    Ist das Array zu klein, fehlen am Ende eben Werte.

    Dann ist etwas am Code fehlerhaft.
    Das kannst du herausfinden, indem du solange so viel Code auskommentierst (/* */), bis der Compiler nicht mehr abstürzt, so dass du die Stelle findest, die den Absturzt verursacht.


    Oder du setzt dich mit dem Ersteller des Codes in Verbindung.