Anklichbarer Textdraw

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
  • Guten Tag,
    ich versuche derzeit dieses Textdraw Anklickbar zu machen


    STATSdraw[ShowPlayerid][2] = CreatePlayerTextDraw(ShowPlayerid, 307.666595, 112.829559, "Skills");
    PlayerTextDrawLetterSize(ShowPlayerid, STATSdraw[ShowPlayerid][2], 0.533999, 2.251260);
    PlayerTextDrawTextSize(ShowPlayerid, STATSdraw[ShowPlayerid][2], 55.666656, 14.518519);
    PlayerTextDrawAlignment(ShowPlayerid, STATSdraw[ShowPlayerid][2], 1);
    PlayerTextDrawColor(ShowPlayerid, STATSdraw[ShowPlayerid][2], 65535);
    PlayerTextDrawSetShadow(ShowPlayerid, STATSdraw[ShowPlayerid][2], 0);
    PlayerTextDrawSetOutline(ShowPlayerid, STATSdraw[ShowPlayerid][2], 1);
    PlayerTextDrawBackgroundColor(ShowPlayerid, STATSdraw[ShowPlayerid][2], 51);
    PlayerTextDrawFont(ShowPlayerid, STATSdraw[ShowPlayerid][2], 1);
    PlayerTextDrawSetProportional(ShowPlayerid, STATSdraw[ShowPlayerid][2], 1);
    PlayerTextDrawSetSelectable(ShowPlayerid, STATSdraw[ShowPlayerid][2], true);


    Allerdings funktioniert das nicht, woran liegt das?


    Mit freundlichen Grüßen
    PermanenT

  • PlayerTextDrawTextSize(ShowPlayerid, STATSdraw[ShowPlayerid][2], 55.666656, 14.518519);
    Das Textdraw erstellst du aber bei 307. Bei der TextDrawTextSize im X Parameter muss man die Position PLUS die Größe rein schreiben (beim Y nur die Größe). Frag mich nicht, wer sich den Quatsch ausgedacht hat, aber so ist es halt. ^^


    Sprich du musst in etwa abschätzen, wie lang dein Textdraw ist.
    PlayerTextDrawTextSize(ShowPlayerid, STATSdraw[ShowPlayerid][2], 350.0000, 14.518519);
    Ich hab dir einfach mal 350.0000 reingeschrieben, musst halt ausprobieren, wie weit der anklickbare Bereich gehen darf.

  • Jeffry:
    Danke das hat geklappt, nun wenn ich drauf klicke komme ich allerdings wieder in die registration


    public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
    {
    if(playertextid == tRegister[1][playerid])return ShowPlayerDialog(playerid, DIALOG_RName, DIALOG_STYLE_INPUT, #DIALOG_Start"Registrierung [Benutzername]","Gebe deinen gewünschten Benutzernamen ein:","Weiter","Abbrechen");
    else if(playertextid == tRegister[2][playerid])return ShowPlayerDialog(playerid, DIALOG_RPass, DIALOG_STYLE_PASSWORD, #DIALOG_Start"Registrierung [Passwort]","Gebe deinen gewünschtes Passwort ein:","Weiter","Abbrechen");
    else if(playertextid == tRegister[3][playerid])return ShowPlayerDialog(playerid, DIALOG_REMail, DIALOG_STYLE_INPUT, #DIALOG_Start"Registrierung [E-Mail Adresse]","Gebe deinen E-mail Adresse ein:","Weiter","Abbrechen");
    else if(playertextid == tRegister[4][playerid])return ShowPlayerDialog(playerid, DIALOG_RGeschlecht, DIALOG_STYLE_LIST, #DIALOG_Start"Registrierung [Geschlecht]","Männlich\nWeiblich","Weiter","Abbrechen");
    else if(playertextid == tRegister[5][playerid])return ShowPlayerDialog(playerid, DIALOG_RAlter, DIALOG_STYLE_INPUT, #DIALOG_Start"Registrierung [Alter]","Gebe dein Geburtsdatum ein:","Weiter","Abbrechen");
    else if(playertextid == tRegister[6][playerid])
    {
    if(RLFill[2][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst deinen gewünschten Benutzernamen eintragen.");
    else if(RLFill[3][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst dein gewünschtes Passwort eintragen.");
    else if(RLFill[4][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst deine E-Mail Adresse eintragen.");
    else if(RLFill[5][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst dein Geschlecht auswählen.");
    else if(RLFill[6][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst dein Alter angeben.");
    else return LoginOrRegister(playerid);
    }
    else if(playertextid == tLogin[1][playerid])return ShowPlayerDialog(playerid, DIALOG_LName, DIALOG_STYLE_INPUT, #DIALOG_Start"Login [Benutzername]","Gebe deinen Benutzernamen ein:","Weiter","Abbrechen");
    else if(playertextid == tLogin[2][playerid])return ShowPlayerDialog(playerid, DIALOG_LPass, DIALOG_STYLE_INPUT, #DIALOG_Start"Login [Passwort]","Gebe dein Passwort ein:","Weiter","Abbrechen");
    else if(playertextid == tLogin[3][playerid])
    {
    if(RLFill[0][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst deinen Benutzernamen eintragen.");
    if(RLFill[1][playerid] != 1)return SendClientMessage(playerid,ROT,"Du musst dein Passwort eintragen.");
    new query[80 + MAX_PLAYER_NAME];
    mysql_format(mycon, query, sizeof(query), "SELECT COUNT(*) AS `count` FROM `"#SERVERTAG"_Account` WHERE `Name` = '%e' AND `Passwort` = '%e'",PlayerInfo[playerid][pName],PlayerInfo[playerid][pPass]);
    mysql_function_query(mycon, query, true, "LoadPlayerDataSequence","dd",playerid,2);
    LoginVersuche[playerid] ++;
    return 1;
    }


    else if(playertextid == STATSdraw[playerid][1]) //Stats
    {
    new Geschlecht[10];
    switch(PlayerInfo[playerid][pGeschlecht])
    {
    case 0: Geschlecht = "Männlich";
    case 1: Geschlecht = "Weiblich";
    default: Geschlecht = "ERROR";
    }

    new Profil[256], Account[256], Sonstiges[256];
    format(Profil,sizeof(Profil),"~r~Account ~w~~n~Name: %s~n~Level: %d~n~Geld: %d~n~Geschlecht: %s~n~Registiert: %s~n~Adminstatus: %s",
    PlayerInfo[playerid][pName],
    PlayerInfo[playerid][pLevel],
    PlayerInfo[playerid][pGeld],
    Geschlecht,
    PlayerInfo[playerid][pRegDatum],
    Adminrang(playerid));
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][6],Profil);

    format(Account,sizeof(Account),"~r~Account ~w~~n~Nextlevel: %i/"#FORNEXTLEVEL" Kills ~n~Verwarnungen: %i/3 ~n~Mute: %i:%02d Minuten ~n~Spawn: %i ~n~Skin: %i",
    PlayerInfo[playerid][pNextLevel],
    PlayerInfo[playerid][pWarns],
    floatround(PlayerInfo[playerid][pMuteTime]/60),floatround(PlayerInfo[playerid][pMuteTime]%60),
    PlayerInfo[playerid][pSpawns],
    PlayerInfo[playerid][pSkin]);
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][7],Account);

    new Float:KD = PlayerInfo[playerid][pKills]/PlayerInfo[playerid][pTode];
    printf("Sonstiges: %s KD: %f",Sonstiges,KD);
    format(Sonstiges,sizeof(Sonstiges),"~r~Sonstiges ~w~~n~Clan: %s ~n~Kills: %i ~n~Tode: %i ~n~K/D: %f ~n~Killstreaks: %i ~n~Bester Killstreak: %i",
    PlayerInfo[playerid][pClan],
    PlayerInfo[playerid][pKills],
    PlayerInfo[playerid][pTode],
    KD,
    PlayerInfo[playerid][pKillstreak][0],
    PlayerInfo[playerid][pKillstreak][1]);
    printf("Sonstiges: %s",Sonstiges);
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][8],Sonstiges);
    return 1;
    }
    else if(playertextid == STATSdraw[playerid][2]) //Skills
    {
    new Skills[256];
    format(Skills,sizeof(Skills),"~r~Skill 1");
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][6],Skills);

    format(Skills,sizeof(Skills),"~r~Skill 2");
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][7],Skills);

    format(Skills,sizeof(Skills),"~r~Skill 3");
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][8],Skills);
    return 1;
    }
    else if(playertextid == STATSdraw[playerid][3]) //Config
    {
    return 1;
    }


    return 1;
    }
    Dabei müsste ja eigentlich dieser Teil aufgerufen werden

    else if(playertextid == STATSdraw[playerid][2]) //Skills
    {
    new Skills[256];
    format(Skills,sizeof(Skills),"~r~Skill 1");
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][6],Skills);

    format(Skills,sizeof(Skills),"~r~Skill 2");
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][7],Skills);

    format(Skills,sizeof(Skills),"~r~Skill 3");
    PlayerTextDrawSetString(playerid,STATSdraw[playerid][8],Skills);
    return 1;
    }

  • Angenommen das Register-Textdraw hat die ID 1 wenn es erstellt wird. Dann gehst du her und löschst es, sagen wir es steht in der Variable regTD.
    PlayerTextDrawDestroy(playerid, regTD[playerid]);
    Jetzt steht ja in regTD immernoch die 1 drin.
    Erstellst du nun dein Stats-Textdraw, dann bekommt das die kleinste freie ID, in dem Fall die 1.
    Somit steht in STATSdraw sowie in regTD die 1. Da du im Callback zuerst das regTD abfragst, wird dieses als erstes erkannt.


    Daher musst du nach dem Löschen die Variable zurücksetzen (das macht man auch bei Fahrzeugen, Pickups, ...).
    PlayerTextDrawDestroy(playerid, regTD[playerid]);
    regTD[playerid] = PlayerText:-1;


    Dann steht in regTD eine -1 und da es kein Textdraw mit der ID -1 gibt passt alles.

  • Jeffry:


    Klappt natürlich alles Dankeschön.


    Nun zu der letzten Sache.


    Mir wir das letze Textdraw nicht angezeigt, sprich der Text nicht.


    new Profil[256], Account[256], Sonstiges[256];
    format(Profil,sizeof(Profil),"~r~Account ~w~~n~Name: %s~n~Level: %d~n~Geld: %d~n~Geschlecht: %s~n~Registiert: %s~n~Adminstatus: %s",
    PlayerInfo[playerid][pName],
    PlayerInfo[playerid][pLevel],
    PlayerInfo[playerid][pGeld],
    Geschlecht,
    PlayerInfo[playerid][pRegDatum],
    Adminrang(playerid));
    PlayerTextDrawSetString(ShowPlayerid,STATSdraw[ShowPlayerid][6],Profil);

    format(Account,sizeof(Account),"~r~Account ~w~~n~Nextlevel: %i/"#FORNEXTLEVEL" Kills ~n~Verwarnungen: %i/3 ~n~Mute: %i:%02d Minuten ~n~Spawn: %i ~n~Skin: %i",
    PlayerInfo[playerid][pNextLevel],
    PlayerInfo[playerid][pWarns],
    floatround(PlayerInfo[playerid][pMuteTime]/60),floatround(PlayerInfo[playerid][pMuteTime]%60),
    PlayerInfo[playerid][pSpawns],
    PlayerInfo[playerid][pSkin]);
    PlayerTextDrawSetString(ShowPlayerid,STATSdraw[ShowPlayerid][7],Account);

    new Float:KD = PlayerInfo[playerid][pKills]/PlayerInfo[playerid][pTode];
    printf("Sonstiges: %s KD: %f",Sonstiges,KD);
    format(Sonstiges,sizeof(Sonstiges),"~r~Sonstiges ~w~~n~Clan: %s ~n~Kills: %i ~n~Tode: %i ~n~K/D: %f ~n~Killstreaks: %i ~n~Bester Killstreak: %i",
    PlayerInfo[playerid][pClan],
    PlayerInfo[playerid][pKills],
    PlayerInfo[playerid][pTode],
    KD,
    PlayerInfo[playerid][pKillstreak][0],
    PlayerInfo[playerid][pKillstreak][1]);
    printf("Sonstiges: %s",Sonstiges);
    PlayerTextDrawSetString(ShowPlayerid,STATSdraw[ShowPlayerid][8],Sonstiges);


    Wenn ich dort allerdings was anderes rein schreibe funktioniert es.
    In der Console steht auch nichts.
    new Float:KD = PlayerInfo[playerid][pKills]/PlayerInfo[playerid][pTode];
    printf("Sonstiges: %s KD: %f",Sonstiges,KD);
    format(Sonstiges,sizeof(Sonstiges),"~r~Sonstiges ~w~~n~Clan: %s ~n~Kills: %i ~n~Tode: %i ~n~K/D: %f ~n~Killstreaks: %i ~n~Bester Killstreak: %i",
    PlayerInfo[playerid][pClan],
    PlayerInfo[playerid][pKills],
    PlayerInfo[playerid][pTode],
    KD,
    PlayerInfo[playerid][pKillstreak][0],
    PlayerInfo[playerid][pKillstreak][1]);
    printf("Sonstiges: %s",Sonstiges);
    PlayerTextDrawSetString(ShowPlayerid,STATSdraw[ShowPlayerid][8],Sonstiges);


    Also das wird mir nicht angezeigt

  • Ich könnte mir vorstellen, dass hier der Fehler liegt.
    new Float:KD = PlayerInfo[playerid][pKills] / PlayerInfo[playerid][pTode];
    Warum?
    Wenn pTode 0 ist, teilt er durch 0, und das geht bekanntlich nicht.
    Ändere es zu:
    new tmpdeaths = PlayerInfo[playerid][pTode];
    if(tmpdeaths == 0) tmpdeaths = 1;
    new Float:KD = float(PlayerInfo[playerid][pKills]) / float(tmpdeaths);