Irgendein Problem mit Skinchange..

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 Leute..


    ich weiss nicht mehr weiter.. bin schon den ganzen Abend dran.


    Ich bin gerade an einem Skinchange-System dran.


    Allerdings funktioniert das nicht, wie es sollte..


    Hier mal der Code:



    //---------------OnPlayerUpdate------------
    public OnPlayerUpdate(playerid)
    {
    new Keys,ud,lr;
    GetPlayerKeys(playerid,Keys,ud,lr);
    if(ChooseSkin[playerid])
    {
    new skin = GetPlayerSkin(playerid);
    if(lr > 0)
    {
    for(new s=0;s<sizeof(maxAvailableSkins);s++)
    {
    if(skin == Skin[s][sSkin])
    {
    if(s < maxAvailableSkins) SetPlayerSkin(playerid, Skin[s+1][sSkin]);
    break; //hab es hier auch schon mit return 1; probiert..
    }
    }
    }
    else if(lr < 0)
    {
    for(new s=0;s<sizeof(maxAvailableSkins);s++)
    {
    if(skin == Skin[s][sSkin])
    {
    if(s > 0) SetPlayerSkin(playerid, Skin[s-1][sSkin]);
    break;
    }
    }
    }
    }
    return 1;
    }


    irgendwie nimmt der die Skins nicht richtig.. der erste Tastendruck funktioniert perfekt, er wechselt den Skin auf den nächsten! Danach gehts aber nicht mehr weiter..


    Ich habs schon mit debuggen versucht, dort ist dann ab dem 2. Mal drucken iwie was falsch.. vor skin == Skin[s ][sSkin] hab ich da mal eingebaut: s, aktueller skin, skin in der Variable..


    Allerdings geht er irgendwie nicht weiter.. Sollte er in der For-Schleife nicht alle nacheinander durchgehen und in der if-Abfrage diesen Test abfragen? irgendwie geht das nicht..


    Hab schon probiert statt OnPlayerUpdate einen Timer draus zu machen.. kein Erfolg.. Hat jemand eine Idee?


    Ich weiss wirklich nicht mehr weiter..


    Was mir noch aufgefallen ist!!


    Wenn ich 2 lange SendClientMessage-Texte habe:


    1x
    Hallo bla bla bla
    Hallo bla bla bla
    Hallo bla bla bla
    Hallo bla bla bla


    UND


    1x
    mach dies
    mach das
    mach jenes


    dann vermischt er die irgendwie zusammen und ab und zu werden auch aktionen nicht ausgeführt, ist das auch schon jemandem aufgefallen?


    MFG selEcT

  • Versuchs unter OnPlayerKeyStateChange?!


    Mit den SendClientMessages.. Weis jetzt nicht genau was du meinst aber wenn die zu lang sind dann versuch sie doch per format() zu definieren und dann per Message ausgeben zu lassen.. so vermischen sie sich für gewöhnlich auch nicht ;D

    [color=#0000FF]



    Suche aktive Leute die Interesse haben ein Freeroam Projekt großzuziehen! Es wird noch alles gesucht!
    Besonders: Scripter für einen GM der besonderen Art , Mapper, Brainstormer & Gehilfen! Bei Interesse einfach melden!
    Info: Server, Webspace & WBB 3 + Lizenz vorhanden!

  • schön wärs, aber unter onplayerkeystatechange funktionieren die Tasten KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN nicht ;) ich könnte zwar andere Tasten nehmen, aber mit denen wäre es mir am liebsten..


    nein nein, nicht zu lang.. ich schrieb einfach zuerst 4 mal eine message und danach kommen noch 3 weitere linien mit neuen messages dazu, die letzten 2 setzt er aber irgendwie über die ersten 4! verstehst du was ich meine?

  • Wer sagt bitte das dieses Tasten darunter nicht funktionieren? Klar gehen die...
    Und das unter OnPlayerUpdate zu tun ist absolut shit... Mach es unter OnPlayerKeyStatechange... Fang erstmal an die Tatsen mit SendClientMessage abzufragen ob sie hinhauen


    An sich verstehe ich dein Script eh nicht...


    das break bzw return 1 sollte auch in die If Verzweigung und net ausserhalb
    Du machst es komplizierter wie es ist^^

  • Wer sagt bitte das dieses Tasten darunter nicht funktionieren? Klar gehen die...


    "This callback is called when the state of any key except the movement keys (up, down, left, right) changes (i.e. are pressed or released)." (http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange)


    Nö, bei mir haben die auch nicht geklappt irgendwie.. hab auch hier im forum danach gesucht und da wurde auch gesagt, dass das dort nicht geht! Wenn es aber doch geht, weisst du bestimmt ne lösung.


    Und das unter OnPlayerUpdate zu tun ist absolut shit...


    Ja, das ist mir schon klar.. aber wenns sonst nirgends funzt :S


    Mach es unter OnPlayerKeyStatechange... Fang erstmal an die Tatsen mit SendClientMessage abzufragen ob sie hinhauen


    if(newkeys & KEY_LEFT) hat damals nicht geklappt.. hab nach der if-Abfrage SendClientMessage(playerid, farbe, "hallo") eingebaut, was nichts ausgegeben hat!


    das break bzw return 1 sollte auch in die If Verzweigung und net ausserhalb


    ich hab das ja in der if abfrage drin oO ich tu das da rein, weil er sonst noch die restlichen werte in der for-schleife durchgeht (--> performance!) oder ist das nicht gut?


    Du machst es komplizierter wie es ist^^


    anders habe ich es nicht hingebracht..

  • Also das mit OnPlayerKeyStateChange glaube ich nicht ganz da ich selber über runter und rauf Aktionen bei mir ausübe...
    Dann dein break ist nicht in der If Abfrage drin da die {} fehlen... Sonst nimmt if nur das direkt hinten dran


    Würde es dir gerne mal schnell scripten jedoch habe ich die Zeit nicht dazu...


    Auf jedenfall erstmal unter OnPlayerKeyStateChange testen... Dann die Tastenabfrage mit PRESSED machen siehe Wiki... Den genau im Drückvorgang muss OnPlayerUpdate nicht unbedingt das erfassen

  • Dann dein break ist nicht in der If Abfrage drin da die {} fehlen... Sonst nimmt if nur das direkt hinten dran


    lol?!



    if(skin == Skin[s][sSkin])
    {
    if(s < maxAvailableSkins)
    {
    SetPlayerSkin(playerid, Skin[s+1][sSkin]);
    }
    break;
    }


    vielleicht verstehst du den code so besser? Der Skin sollte nur eins weiter gehen, wenn der letzte skin noch nicht erreicht wurde, diese abfrage hat mit dem break überhaupt nichts zu tun..


    alles klar.. ich probiers dann mal wenn ich zuhause bin! Danke, das mit Pressed hab ich noch nicht ausprobiert..


    edit:


    Ich sag ja das des net geht! Wie hast du das gemacht?


    habs jetzt so:



    #define PRESSED(%0) \
    (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    new skin = GetPlayerSkin(playerid);
    if(PRESSED(KEY_RIGHT))
    {
    SendClientMessage(playerid, C_GREEN, "right");
    if(ChooseSkin[playerid])
    {
    for(new s=0;s<sizeof(maxAvailableSkins);s++)
    {
    if(skin == Skin[s][sSkin])
    {
    if(s < maxAvailableSkins) SetPlayerSkin(playerid, Skin[s+1][sSkin]);
    }
    }
    }
    }
    else if(PRESSED(KEY_LEFT))
    {
    SendClientMessage(playerid, C_GREEN, "left");
    if(ChooseSkin[playerid])
    {
    for(new s=0;s<sizeof(maxAvailableSkins);s++)
    {
    if(skin == Skin[s][sSkin])
    {
    if(s > 0) SetPlayerSkin(playerid, Skin[s-1][sSkin]);
    }
    }
    }
    }
    return 1;
    }


    und es wird mir kein left oder right angezeigt.. :( ich weiss das man den code auch vereinfachen könnte..



    edit2: LOL hab grad rausgefunden: die rechte maustaste ist KEY_RIGHT oO sind das nicht die lauf-tasten (wasd)? aber key_left geht nicht mit der linken maustaste..


    edit3:


    Das ganze system funktioniert jetzt! Allerdings hab ich das wieder in OnPlayerUpdate genommen, wo es manchmal einen skin überspringt, was natürlich einigermassen logisch ist.. gibt es was einfacheres, was gut funktioniert?