OnPlayerClickPlayerTextDraw Frage

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
  • Hallo Breadfish,


    bin momentan an eine Art "Pin" System für die Bank am werkeln und stoße jetzt auf viele verschiedene Probleme.
    Erstmal allerdings einen kleinen Codeausschnitt um zu verdeutlichen, was ich so denke:



    if(playertextid==PinCode1[playerid]) //Geht von PinCode1 - PinCode9
    {
    if(pincodestufe[playerid]==0) // Das ist die Stufe, also quasi ob er (wie hier) beim ersten Zeichen ist oder vielleicht beim dritten (von vier).
    {
    new string[4];
    pincodestufe[playerid]=1; // Da er jetzt eine Zahl angegeben hat, ist er auf Stufe 1.
    format(string,sizeof(string),"%s",pincodecensor[playerid]); // Weiter unten
    PlayerTextDrawSetString(playerid,PinCodeX[playerid],string);
    SetPVarInt(playerid,"PINCODENUMBER1",1); // Die Nummer die er eingegeben hat muss ich ja auch irgendwie zwischenspeichern.
    }


    // Das hier ist pincodecensor


    new pincodecensor[MAX_PLAYERS]="*";


    // Wie ich z.b. die Zahl 1 erstelle


    PinCode1[playerid] = CreatePlayerTextDraw(playerid,250.000000, 171.000000, "1");
    PlayerTextDrawBackgroundColor(playerid,PinCode1[playerid], 255);
    PlayerTextDrawFont(playerid,PinCode1[playerid], 1);
    PlayerTextDrawLetterSize(playerid,PinCode1[playerid], 0.500000, 2.200000);
    PlayerTextDrawColor(playerid,PinCode1[playerid], 16711935);
    PlayerTextDrawSetOutline(playerid,PinCode1[playerid], 0);
    PlayerTextDrawSetProportional(playerid,PinCode1[playerid], 1);
    PlayerTextDrawSetShadow(playerid,PinCode1[playerid], 1);
    PlayerTextDrawBoxColor(playerid,PinCode1[playerid], 255);
    PlayerTextDrawTextSize(playerid,PinCode1[playerid], 262.000000, 8.000000);
    PlayerTextDrawSetSelectable(playerid,PinCode1[playerid], 1);
    PlayerTextDrawHide(playerid,PinCode1[playerid]);


    Meine Probleme sind jetzt folgende: Wenn er ausversehen eine falsche Zahl gedrückt hat, habe ich natürlich einen Button erstellt, womit er das letzte Zeichen löschen kann. Wie kann ich sowas verwirklichen?
    2tes Problem: Ich muss die 4 gedrückten Zahlen aneinanderreihen (er drückt 5 - 3 - 9 - 7 == 5397) und diese dann mit seinem Pin abgleichen (pInfo[playerid][pBankkartenpin]).
    3tes Problem: Er erstellt kein * sobald auf ich auf eine Zahl drücke.
    Über Vorschläge wäre ich extrem glücklich.

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht

  • Nutz doch dafür einfach einen String


    Hier eine kleine Funktion wie man sowas umsetzen kann (du musst jedoch das ganze noch anpassen)


  • Genau.


    1.: Wenn mindestens eine Zahl eingegeben wurde, dann erstellt er ein PlayerTextDraw, welches der Löschbutton ist. Dieser löscht die letzte Zahl und somit verschwindet er wieder, wenn keine Zahl eingegeben wurde.
    2.: Formatiere deine Eingaben in Strings und füge diese einfach zusammen ;)
    3.: Setze den Text als '*', aber speichere im Hintergrund die Zahl. Sowas könnte man über Strukturen lösen ;)

  • Danke schon einmal für die Hilfe!
    Wofür steht bei new number das + 1?
    Habe das jetzt mal auf 4 + 1 geändert, weil ich ja nur 4 '*' brauche.


    Verwende ich deine Funtkion dann dementsprechend so (wobei ich noch nicht ganz bei den Parametern durchblicke)?



    if(playertextid==PinCode1[playerid])
    {
    PlayerTextDrawSetString(playerid,PinCodeX[playerid],addCharacter(/*?*/));
    }

    Und bei bei meinem Löschen-Textdraw dann logischerweise mit deleteCharacter.


    + Kann ich das irgendwo besser lösen mit den Zahlen im Hintergrund speichern?
    Dann könnte ich ja theoretisch (falls das möglich ist) in einem PVar mehrere (am besten 4) Zahlen speichern. Dann bräuchte ich einfach nur die letzte Zahl, die gedrückt wurde, zu speichern, oder muss ich dann bei jedem Zahlenfeld die entsprechende Zahl speichern (z.B. PinCode1 == SetPVarInt 1, PinCode2 == SetPVarInt 2 usw...)?


    mfg.

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht

  • Code
    new PinCode[MAX_PLAYERS][4+1];	
    
    
    //initalisieren
        PinCode[playerid] = "****";
        addCharacter(playerid,'1');
        addCharacter(playerid,'2');
        deleteCharacter(playerid);




    Im kontext zu deinem Beispiel


    Code
    if(playertextid==PinCode1[playerid])
    	{
    	    addCharacter(playerid,'1');
    		PlayerTextDrawSetString(playerid,PinCodeX[playerid],PinCode[playerid]);
    	}
  • Klappt perfekt, danke Prototype.
    Mache ich die Abspeicherung am besten mit PVars oder/und nem Array (oder sonst irgendwas).


    //Edit:


    Nvm, habs selbst. Das letzte Problem ist, dass obwohl alles übereinstimmt trotzdem "Vorgang abgebrochen." kommt.



    (strval war nur ein Versuch, klappte auch ohne nicht.)

    if(playertextid==PinCodeAccept[playerid])
    {
    printf("Ergebnis : %s",PinString);
    strval(PinString);
    printf("Ergebnis 2 : %i",PinString);
    printf("Mein Pin : %i",pInfo[playerid][pBankkartenpin]);
    if(strlen(PinString)!=pInfo[playerid][pBankkartenpin])
    {
    strdel(PinString,0,5);
    deleteCharacter(playerid);
    deleteCharacter(playerid);
    deleteCharacter(playerid);
    deleteCharacter(playerid);
    PlayerTextDrawSetString(playerid,PinCodeX[playerid],PinCode[playerid]);
    SendClientMessage(playerid,CLR_RED,"Vorgang abgebrochen.");
    }
    else
    {
    SendClientMessage(playerid,CLR_GREEN,"Erfolgreich.");
    strdel(PinString,0,5);
    deleteCharacter(playerid);
    deleteCharacter(playerid);
    deleteCharacter(playerid);
    deleteCharacter(playerid);
    PlayerTextDrawSetString(playerid,PinCodeX[playerid],PinCode[playerid]);
    PlayerTextDrawHide(playerid,PinCodeEingabe[playerid]);
    PlayerTextDrawHide(playerid,PinCode1[playerid]);
    PlayerTextDrawHide(playerid,PinCode2[playerid]);
    PlayerTextDrawHide(playerid,PinCode3[playerid]);
    PlayerTextDrawHide(playerid,PinCode4[playerid]);
    PlayerTextDrawHide(playerid,PinCode5[playerid]);
    PlayerTextDrawHide(playerid,PinCode6[playerid]);
    PlayerTextDrawHide(playerid,PinCode7[playerid]);
    PlayerTextDrawHide(playerid,PinCode8[playerid]);
    PlayerTextDrawHide(playerid,PinCode9[playerid]);
    PlayerTextDrawHide(playerid,PinCodeX[playerid]);
    PlayerTextDrawHide(playerid,PinCodeAccept[playerid]);
    PlayerTextDrawHide(playerid,PinCodeBack[playerid]);
    PlayerTextDrawHide(playerid,PinCodeCancel[playerid]);
    CancelSelectTextDraw(playerid);
    TogglePlayerControllable(playerid,1);
    }

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht

    Einmal editiert, zuletzt von #S. ()

    • Offizieller Beitrag

    if(strlen(PinString)!=pInfo[playerid][pBankkartenpin])


    Du fragst hier grade folgendes ab: "Wenn die Länge von PingString nicht ist gleich pBankkartenpin ist dann breche ab"


    Desweiteren speicherst du die Variable (Zeile 4) nirgendwo ab.

  • Lol, ziemlicher dummer Fehler. Naja, man lernt nie aus.
    Vielen Dank für eure Hilfe.

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht

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