[SAMMELTHREAD] Kleine Scripting Fragen

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • Komisch. pNutzer ist der normale Name. Dieser wird anhand von GetPlayerName rausgezogen und mit pButzer formatiert.
    Das Problem ist, ich kann eingeben was ich will, er kommt immer durch. Auch wenn ich es leer lasse. Kann mir einer sagen, worin sich das Problem beläuft ?




    if(!strcmp(Spieler[playerid][pNutzer],inputtext,true))
    {
    SendClientMessage(playerid, COLOR_RED, "Weiter");
    }
    else{
    SendClientMessage(playerid, COLOR_RED, "Geht nicht Weiter!");
    }

  • Lasse dir mal ausgeben, was in den Variablen steht. Außerdem musst du prüfen ob inputtext nicht leer ist.
    printf("Name: %s / inputtext: %s", Spieler[playerid][pNutzer],inputtext);
    if(!strcmp(Spieler[playerid][pNutzer],inputtext,true) && strlen(inputtext))


    Möglicherweise fehlt im enum bei pNutzer das Array von MAX_PLAYER_NAME.

  • @Jeffry


    Wenn ich eine Vari = 0 nehme und CreateObj drin speichere, weißt du warum der Wert ab 80 anfängt?
    Sprich in dem Fall arbeite ich mit Slots aber anstatt 0-1-2-3 ändert er diese auf 81-82-83 usw. obwohl diese Variable vorm createn den Wert 0 hat.

    KleineHilfe 2.0

  • CreateObject gibt die ID des Objektes zurück, das erstellt wurde. Das ist in deinem Fall die 80, somit hat die Variable den Wert 80.

    Eben nicht. Ich setze die Objekte in leere Slots. In dem Fall sind es ID's in Höhe von 700. Erstelle ich diese zB 3x, ist es das gleiche. 81, 82, 83 kriege ich als output in der variable.
    Das Objekt wird normal erstellt.
    Edit:



    enum ObjDetails
    {
    slotti[3]
    }
    new Objjs[MAX_PLAYERS][ObjDetails];



    if(sscanf(params,"i",obj2))return SendClientMessage(playerid,-1,"/obj");
    //Fori
    if(Objjs[playerid][slotti][i] == 0)
    {
    Objjs[playerid][slotti][i] = CreateObject(obj2, x, y, z,0.0,0.0,0.0,0.0);


    So sieht der Spaß aus.
    Sollte ich den slot lieber seperat neu definieren?

    KleineHilfe 2.0

  • Beitrag von malE ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Warning aufgeklärt ().
  • @YaBroo
    Das hier gibt dir 81 aus?
    Objjs[playerid][slotti][i]
    Das wäre korrekt, da CreateObject dann die 81 zurück gegeben hat.
    Den Wert von i kann ich diesem Code nicht entnehmen.



    @malE
    Das heißt, dass du irgendwo versuchst einen Cache auszulesen, obwohl es keinen gibt.
    Inwiefern das Probleme verursacht kann man nicht sagen, ohne zu wissen, welcher Code das verursacht. Als Beispiel könnte es sein, dass der Spieler beim Login kein Geld bekommt (Beispiel!). Du willst eben irgendwo was laden, wo nichts existiert.
    Das wirst du nur durch suchen oder debuggen (prints) herausfinden können, wo das ist.

  • @Jeffry
    Ist zwar jetzt ein bisschen dump, aber kannst du mir ein Beispiel geben wie ich die Slots richtig fülle?
    Ich wollte quasi den freien Slot suchen, das Object in diesem erstellen und joa, das wars schon für's nachträgliche deleten einzelner Objekte.
    Scheinbar funzenukelt der Spaß nicht so ganz, alleine weil schon ganze Zeit der Output 81 ist beim ersten Objekt und nicht 0 oder 1.
    Maximal verwirrt.

    KleineHilfe 2.0

  • Jetzt verwirsst du mich auch so langsam. :S Du willst einen freien Slot (i) suchen?
    Das wäre dann so:
    for(new i = 0; i < 3; i++)
    {
    if(Objjs[playerid][slotti][i] == 0)
    {
    Objjs[playerid][slotti][i] = CreateObject(obj2, x, y, z,0.0,0.0,0.0,0.0);
    break; //Um die Schleife zu stoppen.
    }
    }
    Das kann aber sein, dass du das schon hast, ich weiß nicht wie du i definiert hast, ob das schon die Schleife ist, eben vor dem sscanf.
    In dem Falle wäre das korrekt.


    Slot 0 (i) hat dann den Wert (Objekt ID) 81.


    Besser wäre es allerdings, die drei Objjs[playerid][slotti][i] mit -1 zu instanziieren, bei OnGameModeInit, und in der Schleife auf -1 zu prüfen, da es eine Objekt ID 0 geben kann, die du dann nicht mehr löschen könntest, sofern sie mit diesem Befehl erstellt würde.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Meine Schleife sieht exakt genau so aus. Grundsätzlich möchte ich nur das man den slot 1-3 (Bei 3 Objekten) deleten kann und nicht 81-83. ;)
    Es soll einfach 1-3 heißen und nicht 80-83 das ist was ich vorhatte,
    Ich probiere mal weiter rum, bis dahin trotzdem danke für den Tipp.

    KleineHilfe 2.0

    Einmal editiert, zuletzt von YaBroo ()

  • Beitrag von AirM4X ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Ja, das kannst du dann genau so machen.
    Nochmal zur Erläuterung:
    Objjs[playerid][slotti][i]
    Heißt dann:
    Objjs[playerid][slotti][0] hat den Wert 81.
    Objjs[playerid][slotti][1] hat den Wert 82.
    Objjs[playerid][slotti][2] hat den Wert 83.


    Willst du nun Slot 0 löschen, dann löschst du das Objekt: Objjs[playerid][slotti][0]
    Damit wird Slot 0 gelöscht und das Objekt mit der ID 81 entfernt.

  • Beim delete habe ich es wie folgt.



    for(new i; i<3;i ++)
    {
    if(Objjs[playerid][slotti][i] == obj2)
    {
    DestroyObject(Objjs[playerid][slotti][i]);


    Das funzenukelt nun mit den ID's 81, 82 und co aber nicht mit 0,1,2. Kannst du mir dort auf die Sprünge helfen?

    KleineHilfe 2.0

  • DestroyObject(Objjs[playerid][slotti][obj2]);
    So, und ohne die Schleife.


    Dann kannst du 0,1,2 eingeben.

    Ich muss ja schon abfragen ob es ein gültiger Slot ist.
    Aber jetzt wo ich noch mal hingeschaut habe habe ich die Abfrage angepasst. So funktionierts.
    for(new i; i<4;i ++){if(Objjs[playerid][slotti][i] == Objjs[playerid][slotti][obj2]){DestroyObject(Objjs[playerid][slotti][i]);
    Im Endeffekt könnte ich aber auch einfach abfragen ob
    Merci sir jeffry


    //Edit
    Auf Krampf komm raus funktioniert es nun.

    KleineHilfe 2.0

    2 Mal editiert, zuletzt von YaBroo ()

  • Ok, letzte Frage, hoffe ich natürlich.
    Ich möchte, dass wen ich z.B. in einem Dialog den Namen "Klaus" eingebe, dieser mehrere Male in der Datenbank existiert, diese alle aufgelistet werden.


    Beispiel:
    Klaus_Kleber
    Franz_Klaus
    Klaus_Gustav


    format(sql, sizeof(sql), "SELECT name FROM accounts WHERE name LIKE '%s%%'", inputtext);
    mysql_pquery(Handle, sql, "GibNamenHer", "i", playerid);


    Wenn ich printen lasse, ist alles richtig, also die Query. Jedoch, wie muss ich den Public nun aufbauen ?


    Ich weiß, dass ich diese Abfrage nutzen muss, jedoch weiß ich leider nicht weiter.
    Vielleicht, kann mir einer nen Tipp geben :D

  • Auf Krampf komm raus funktioniert es nun.

    Lass die Schleife weg und mache es lieber so, das ist besser, und du kannst das Array nicht sprengen:
    if(obj2 >= 0 && obj2 < 3 && Objjs[playerid][slotti][obj2] != 0)
    {
    DestroyObject(Objjs[playerid][slotti][obj2]);
    }


    Jedoch, wie muss ich den Public nun aufbauen ?

    Mit einer Schleife durch den Cache.
    Gleich wie hier beim Laden der Fahrzeuge: [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-2
    Versuche mal, ob du damit so klar kommst.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen