Probleme mit Befehlen

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 bin gerade dabei mein Selfmade zu testen und gerade etwas überfragt.
    Erstens bekommt ich denke nur die ID 0 den Textdraw(code unten) angezeigt.

    Spoiler anzeigen
    forward CheckTacho(playerid);
    public CheckTacho(playerid)
    {
    new string[512],Float:vHealth,vehicleid = GetPlayerVehicleID(playerid), modelid = GetVehicleModel(vehicleid);
    for(new i;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i) || !IsPlayerInAnyVehicle(i))continue;
    GetVehicleHealth(GetPlayerVehicleID(i),vHealth);
    format(string,sizeof string,"%d",GetPlayerSpeed(i));
    PlayerTextDrawSetString(i,CarSpeed[i],string);
    format(string,sizeof string,"Zustand: ~g~%i",floatround(vHealth, floatround_round)/10);
    PlayerTextDrawSetString(i,Textzustand[i],string);
    if(tuer[vehicleid] == false)
    {
    if(floatround(vHealth, floatround_round)/10 < 30) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~g~Offen~w~~n~Zustand: ~r~%d ~w~Prozent",PlayerVehicle[modelid - 400], floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 < 50) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~g~Offen~w~~n~Zustand: ~y~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 <= 100) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~g~Offen~w~~n~Zustand: ~g~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    PlayerTextDrawSetString(i,CarFahrzeug[i],string);
    }
    else if(tuer[vehicleid] == true)
    {
    if(floatround(vHealth, floatround_round)/10 < 30) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~r~Geschlossen~w~~n~Zustand: ~r~%d ~w~Prozent",PlayerVehicle[modelid - 400], floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 < 50) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~r~Geschlossen~w~~n~Zustand: ~y~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 <= 100) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~r~Geschlossen~w~~n~Zustand: ~g~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    PlayerTextDrawSetString(i,CarFahrzeug[i],string);
    }
    }
    return 1;
    }


    Zumindest bekomme ich es angezeigt und im 2 PC von mir wird es nicht angezeigt, die anderen Textdraws funktionieren perfekt! hab auch schon die Schleife rausgenommen es geht trotzdem nicht.


    Zweitens gehen bei dem Befehl die funktion nicht, also ich biete jemanden an sein Fahrzeug zu tanken doch es wird nicht getankt, der rest geht.


    Spoiler anzeigen

    ocmd:fuellen(playerid,params[])
    {
    new string[128], pID;
    if(SpielerInfo[playerid][pTeam] != 5) return SendClientMessage(playerid,error,"Diesen Befehl kannst du nicht nutzen. Benötigter Beruf: {#FF0000}Mechaniker");
    if(Werkzeug[playerid] == 1)
    {
    if(sscanf(params,"ud",pID,fill[playerid]))return SendClientMessage(playerid,info,"/fuellen ID Preis");
    if(!IsPlayerInAnyVehicle(pID)) return SendClientMessage(playerid, error, "Dieser Spieler befindet sich in keinem Fahrzeug!");
    format(string, sizeof(string), "%s hat dir ein Angebot gemacht, dein Auto für %d$ zu Tanken!",SpielerName(playerid),heilerp[playerid]);
    ShowPlayerDialog(pID,DIALOG_FILL,DIALOG_STYLE_MSGBOX,"%s möchte dein Auto Tanken",string,"Bestätigen","Abbrechen");
    kunde[pID] = playerid;
    }
    else {
    SendClientMessage(playerid, error, "Du hast keinen Werkzeugkoffer bei dir!");
    }
    return 1;
    }
    if(dialogid == DIALOG_FILL)
    {
    if(response == 1)
    {
    new string[128];
    new vehicleid = (GetPlayerVehicleID(kunde[playerid]));
    new m = GetVehicleModel(vehicleid);
    format(string, sizeof(string), "Du hast %s für %d$ Fahrzeug aufgetankt",SpielerName(kunde[playerid]),fill[kunde[playerid]]);
    SendClientMessage(kunde[playerid], info, string);
    format(string, sizeof(string), "Dein Fahrzeug wurde von %s für %i$ aufgetankt",SpielerName(kunde[playerid]),fill[kunde[playerid]]);
    SendClientMessage(playerid, erfolg, string);
    GivePlayerMoney(playerid, -fill[kunde[playerid]]);
    GivePlayerMoney(playerid, fill[kunde[playerid]]);
    Tank[vehicleid] = GetVehicleMaxTank(m);
    }
    else if(response == 0)
    {
    SendClientMessage(playerid,error ,"Du hast den Vorgang abgebrochen!");
    }


    Das war es erstmal, danke für jede Hilfe ^^


    Jeffry:


    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • da müsste eig.. dein Problem gelöst sein :)


    ...was sollte damit gelöst sein, außer dass der Code langsamer ist als zuvor?! :huh:


    Der Fehler den Pickachu macht ist, dass er eine playerid übergibt und dann eine Schleife durch alle Spieler macht...Sinn? :huh:


    Schreib das mal so:


    forward CheckTacho();
    public CheckTacho()
    {
    new string[512],Float:vHealth;
    for(new i;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i) || !IsPlayerInAnyVehicle(i))continue;
    new vehicleid = GetPlayerVehicleID(i), modelid = GetVehicleModel(vehicleid);
    GetVehicleHealth(vehicleid,vHealth);
    format(string,sizeof string,"%d",GetPlayerSpeed(i));
    PlayerTextDrawSetString(i,CarSpeed[i],string);
    format(string,sizeof string,"Zustand: ~g~%i",floatround(vHealth, floatround_round)/10);
    PlayerTextDrawSetString(i,Textzustand[i],string);
    if(tuer[vehicleid] == false)
    {
    if(floatround(vHealth, floatround_round)/10 < 30) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~g~Offen~w~~n~Zustand: ~r~%d ~w~Prozent",PlayerVehicle[modelid - 400], floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 < 50) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~g~Offen~w~~n~Zustand: ~y~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 <= 100) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~g~Offen~w~~n~Zustand: ~g~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    PlayerTextDrawSetString(i,CarFahrzeug[i],string);
    }
    else if(tuer[vehicleid] == true)
    {
    if(floatround(vHealth, floatround_round)/10 < 30) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~r~Geschlossen~w~~n~Zustand: ~r~%d ~w~Prozent",PlayerVehicle[modelid - 400], floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 < 50) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~r~Geschlossen~w~~n~Zustand: ~y~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    else if(floatround(vHealth, floatround_round)/10 <= 100) format(string,sizeof string,"Fahrzeug: ~g~%s~n~~w~Tueren: ~r~Geschlossen~w~~n~Zustand: ~g~%d ~w~Prozent",PlayerVehicle[modelid - 400],floatround(vHealth, floatround_round)/10);
    PlayerTextDrawSetString(i,CarFahrzeug[i],string);
    }
    }
    return 1;
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Hey,
    kunde[pID] = playerid;
    ich glaube diese Zeile bei dem Fehl ist falsch
    Mach es soo
    kunde[playerid] = pID;

    Das ist nicht so, denn es lässt sich aufgrund des Dialoges schließen, dass das richtig so ist, denn zuerst ist pID, der dem der Tank angeboten wird. Im zweiten Teil (also im Dialog) wird pID zu playerid, was richtig erscheint:

    //erster Teil:
    kunde[pID] = playerid;
    //zweiter Teil:
    kunde[playerid];



    Dabei hat man offensichtlich die Funktion, dass Kunde der Anbieter des Tanks ist und somit nachher in dem zum Kunden gerichteten Dialog weiterverwendet werden kann.
    Das ist nämlich so( als Beispiel vom ersten Teil): Kunde pID hat den Anbieter playerid




    Hier ist auf jeden Fall noch etwas falsch:
    GivePlayerMoney(playerid, -fill[kunde[playerid]]);
    GivePlayerMoney(playerid, fill[kunde[playerid]]);


    Dabei ziehst du einem Spieler Geld und gibst dem Gleichen das Gleiche wieder zurück.


    Du musst, noch den anderen Spieler behandeln, undzwar:

    GivePlayerMoney(playerid, -fill[kunde[playerid]]);
    GivePlayerMoney(kunde[playerid], fill[kunde[playerid]]);
    [/pwn]



    Mit der Zeile:
    new vehicleid = (GetPlayerVehicleID(kunde[playerid]));
    //und
    Tank[vehicleid] = GetVehicleMaxTank(m);

    Gibst du dem Spiele, der etwas anbietet den Tank, weil der Dialog an den Kunden gerichtet wurde. Dort müsste dann die erste Zeile zu:

    new vehicleid = GetPlayerVehicleID(playerid);

    umgeändert werden.
    Was außerdem problematisch ist, dass die Zuweisung:
    kunde[pID] = playerid;
    Hinter dem Dialog steht, sodass dieses, alles, was mit kunde[playerid] zu tun hat, in dem Dialog unfähig gemacht wird.


    Ein weiterer unlogischer Aspekt ist folgender:

    format(string, sizeof(string), "Du hast %s für %d$ Fahrzeug aufgetankt",SpielerName(kunde[playerid]),fill[kunde[playerid]]);
    SendClientMessage(kunde[playerid], info, string);


    Sagen wir kunde[playerid] heisst Peter,und es kostet 500€, dann ist das folgendes:
    An Peter wird folgendes gesendet:
    Du hast Peter für 500€ Fahrzeug aufgetankt.
    Das heißt es wird an den Spieler der eigene Name gesendet.
    Das heißt du solltest es so ändern ( Vorausgesetzt SpielerName ist eine funktionierende Funktion):

    format(string, sizeof(string), "Du hast %s für %d$ Fahrzeug aufgetankt",SpielerName(playerid),fill[kunde[playerid]]);
    SendClientMessage(kunde[playerid], info, string);

    Hier könnte man noch den Satz so umändern:

    format(string, sizeof(string), "Du hast das Fahrzeug von %s für %d$ aufgetankt.",SpielerName(playerid),fill[kunde[playerid]]);


    Aus meiner natrülich jetzt eingeschränkten Sicht ( , weil ich nicht den kompletten Code kenn, denke ich du solltest unter if(response == 0) noch schreiben, dass er kein Kunde ist also z.B.: kunde[playerid] = MAX_PLAYERS +2


    Der komplette Code ist also:

    ocmd:fuellen(playerid,params[])
    {
    new string[128], pID;
    if(SpielerInfo[playerid][pTeam] != 5) return SendClientMessage(playerid,error,"Diesen Befehl kannst du nicht nutzen. Benötigter Beruf: {#FF0000}Mechaniker");
    if(Werkzeug[playerid] == 1)
    {
    if(sscanf(params,"ud",pID,fill[playerid]))return SendClientMessage(playerid,info,"/fuellen ID Preis");
    if(!IsPlayerInAnyVehicle(pID)) return SendClientMessage(playerid, error, "Dieser Spieler befindet sich in keinem Fahrzeug!");
    format(string, sizeof(string), "%s hat dir ein Angebot gemacht, dein Auto für %d$ zu Tanken!",SpielerName(playerid),heilerp[playerid]);
    kunde[pID] = playerid;
    ShowPlayerDialog(pID,DIALOG_FILL,DIALOG_STYLE_MSGBOX,"%s möchte dein Auto Tanken",string,"Bestätigen","Abbrechen");

    }
    else
    {
    SendClientMessage(playerid, error, "Du hast keinen Werkzeugkoffer bei dir!");
    }
    return 1;
    }
    if(dialogid == DIALOG_FILL)
    {
    if(response == 1)
    {
    new string[128];
    new vehicleid = (GetPlayerVehicleID(playerid));
    new m = GetVehicleModel(vehicleid);
    format(string, sizeof(string), "Du hast das Fahrzeug von %s für %d$ aufgetankt.",SpielerName(playerid),fill[kunde[playerid]]);
    SendClientMessage(kunde[playerid], info, string);
    format(string, sizeof(string), "Dein Fahrzeug wurde von %s für %i$ aufgetankt",SpielerName(kunde[playerid]),fill[kunde[playerid]]);
    SendClientMessage(playerid, erfolg, string);
    GivePlayerMoney(playerid, -fill[kunde[playerid]]);
    GivePlayerMoney(kunde[playerid], fill[kunde[playerid]]);
    Tank[vehicleid] = GetVehicleMaxTank(m);
    }
    else if(response == 0)
    {
    //Bei Wichtigkeit:
    //kunde[playerid] = MAX_PLAYERS + 2;
    SendClientMessage(playerid,error ,"Du hast den Vorgang abgebrochen!");
    }
    }


    Ich entschuldige mich für meine vielen Grammatikfehler.

    9 Mal editiert, zuletzt von Nixon ()