Wie kann ich denn nur ein 3D Text Label für einen einzigen Spieler erstellen und entfernen? :o Es ist ein Mysterium! (auch hallo, android :D)

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,


    ich habe gerade ein ziemlich großes Problem. Und zwar frage ich mich, ob es möglich ist 3D Text Labels spezifisch für einen Spieler erscheinen zu lassen und ebenso spezifisch für einen Spieler zu zerstören.
    Ich habe eine Fülle an 3D Text Labels erstellt, die je nach Spracheinstellung ihren Inhalt wechseln (Deutsch & Englisch). Mit UpdateDynamic3DTextLabel kann ich nicht arbeiten, da es den Text aller Labels für alle Spieler updatet, und das ist ja genau das, was ich nicht will. Hat jemand eine alternative Lösung? Hat es etwas wie "Create3DTextLabelForPlayer", "Destroy3DTextLabelForPlayer" oder "Update3DTextLabelForPlayer"?


    Grüße,


    Many

    Einmal editiert, zuletzt von Manyula ()

  • Das Problem ist dann eben nur noch, dass ich keinen "playerid" Parameter in DestroyDynamic3DTextLabel habe, der das Label nur für den einen Spieler zerstört. Ich hoffe, mein Problem ist nun etwas verständlicher... :S


    Edit: Hier einmal der Code, wie ich es mit dem Updatedn anstelle.


    stock UpdateLanguageLabels(playerid)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE)
    {
    UpdateDynamic3DTextLabelText(TeleportLabel[16], C_PURPLE, "» Teleport «\n"#C_WHITE_E"San Fierro Denkmal\n/SFD");
    UpdateDynamic3DTextLabelText(TeleportLabel[23], C_PURPLE, "» Teleport «\n"#C_WHITE_E"The Big Ear Satellit Station\n/Satellit");
    UpdateDynamic3DTextLabelText(TeleportLabel[24], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Verlassener Flughafen\n/VF");
    UpdateDynamic3DTextLabelText(TeleportLabel[27], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Geistersee\n/GS");

    for(new i = 0; i < sizeof(GW_Name); i++)
    {
    new string[128];
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][0]);
    UpdateDynamic3DTextLabelText(GangZoneLabel[i], C_ORANGE, string);
    }
    }
    if(pInfo[playerid][Language] == LANGUAGE_EN)
    {
    UpdateDynamic3DTextLabelText(TeleportLabel[16], C_PURPLE, "» Teleport «\n"#C_WHITE_E"San Fierro Memorial\n/SFM");
    UpdateDynamic3DTextLabelText(TeleportLabel[23], C_PURPLE, "» Teleport «\n"#C_WHITE_E"The Big Ear Satellite Station\n/Satellite");
    UpdateDynamic3DTextLabelText(TeleportLabel[24], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Abandoned Airport\n/AA");
    UpdateDynamic3DTextLabelText(TeleportLabel[27], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Ghost Lake\n/GL");


    for(new i = 0; i < sizeof(GW_Name); i++)
    {
    new string[128];
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][1]);
    UpdateDynamic3DTextLabelText(GangZoneLabel[i], C_ORANGE, string);
    }
    }
    return 1;
    }

  • Also, folgendes möchte ich machen:


    Der Spieler kann mittels eines CMDs seine Sprache auswählen. Diese Sprachauswahl hat dann u.a. zur Folge, dass die Namen der GangZonen übersetzt werden, aber eben nur für den Spieler, der die Sprache gewechselt hat, und nicht für alle.

  • new Player3DText:Label[MAX_PLAYERS];


    Label[playerid] = CreatePlayer3DTextLabel(playerid,"Hello\nI'm at your position",0x008080FF,X,Y,Z,40.0);


    Über Label[playerid] kannst es auch wieder löschen.



    Nach dem selben Prinzip funktioniert es auch mit den Streamer Labels.

  • public OnGameModeInit()
    {
    new string[80];
    for(new i = 0; i < MAX_GANG_ZONES; i++)
    {
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][0]);
    GangZoneLabel[i] = CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, 0, -1, -1, 100.0);
    GangZone[i] = GangZoneCreate(GW_ZoneCoordinates[i][0], GW_ZoneCoordinates[i][1], GW_ZoneCoordinates[i][2], GW_ZoneCoordinates[i][3]);
    }
    return GANG_OnGameModeInit();
    }


    Wie stelle ich das dann hier am besten an? Ich brauche einerseits einen Loop durch MAX_PLAYERS dann um das Label für playerid zu erstellen, aber andererseits auch einen Loop durch MAX_GANG_ZONES, um die korrekte Anzahl an Zonen mit den entsprechenden IDs zu erstellen.

  • In dem Loop für alle Gang Zonen noch einen Loop packen durch alle Spieler. Also zwei ineinander geschlachtete Schleifen.


    Und die Variable:
    GangZoneLabel[g][i]


    Aber achte drauf, dass die GangZone Erstellung nicht in dem Loop durch alle Spieler ist, sondern nur das Label.

  • Also, im Klartext bedeutet das dann das hier?


    new PlayerText3D:GangZoneLabel[MAX_PLAYERS][MAX_GANG_ZONES];


    public OnGameModeInit()
    {
    new string[80];
    for(new i = 0; i < MAX_GANG_ZONES; i++)
    {
    GangZone[i] = GangZoneCreate(GW_ZoneCoordinates[i][0], GW_ZoneCoordinates[i][1], GW_ZoneCoordinates[i][2], GW_ZoneCoordinates[i][3]);
    for(new g = 0; g < MAX_PLAYERS; g++)
    {
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][0]);
    GangZoneLabel[g][i] = CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, 0, -1, -1, 100.0);
    }
    }
    return GANG_OnGameModeInit();
    }

  • Folgender Code...
    public OnGameModeInit()
    {
    new string[80];
    for(new i = 0; i < MAX_GANG_ZONES; i++)
    {
    GangZone[i] = GangZoneCreate(GW_ZoneCoordinates[i][0], GW_ZoneCoordinates[i][1], GW_ZoneCoordinates[i][2], GW_ZoneCoordinates[i][3]);
    for(new g = 0; g < MAX_PLAYERS; g++)
    {
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][0]);
    GangZoneLabel[g][i] = CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, g, INVALID_VEHICLE_ID, 1, 0, -1, -1, 100.0); //Tag Mismatch
    }
    }
    return GANG_OnGameModeInit();
    }


    ...liefert einen tag mismatch bei Erstellen des Labels.


    EDIT: Ich habe "PlayerText3D" zu "Text3D" umgeschrieben. Jetzt spuckt er zumindest keine Warnings oder Errors mehr aus.

  • public OnGameModeInit()
    {
    new string[80];
    for(new i = 0; i < MAX_GANG_ZONES; i++)
    {
    GangZone[i] = GangZoneCreate(GW_ZoneCoordinates[i][0], GW_ZoneCoordinates[i][1], GW_ZoneCoordinates[i][2], GW_ZoneCoordinates[i][3]);
    for(new g = 0; g < MAX_PLAYERS; g++)
    {
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][0]);
    GangZoneLabel[g][i] = CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, g, INVALID_VEHICLE_ID, 1, 0, -1, -1, 100.0);
    }
    }
    return GANG_OnGameModeInit();
    }


    forward GANG_OnGameModeInit();
    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit GANG_OnGameModeInit


    Das hier ist der aktuelle Code. Wie gesagt, die Zone wird erstellt, aber scheinbar kommt der Compiler nicht an die verschachtelte MAX_PLAYER Schleife.


    PS: Danke, für deine Hilfsbereitschaft! :thumbup:

  • GangZoneLabel[g][i] = CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, 0, -1, g, 100.0);
    So muss es sein.


    Du hast es an den Spieler attached, nicht aber für den Spieler erstellt.

  • Wunderbar, nun werden sie angezeigt! :)


    Bleibt noch ein Problem. Folgender Code ist ein riesiges Durcheinander, da ich hier und da etwas neu geschrieben habe und auch noch altes hab stehen lassen.


    stock UpdateLanguageLabels(playerid)
    {
    if(pInfo[playerid][Language] == LANGUAGE_DE)
    {
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][16], C_PURPLE, "» Teleport «\n"#C_WHITE_E"San Fierro Denkmal\n/SFD");
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][23], C_PURPLE, "» Teleport «\n"#C_WHITE_E"The Big Ear Satellit Station\n/Satellit");
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][24], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Verlassener Flughafen\n/VF");
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][27], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Geistersee\n/GS");

    for(new i = 0; i < MAX_GANG_ZONES; i++)
    {
    for(new g = 0; g < MAX_PLAYERS; g++)
    {
    new string[128];
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][0]);
    DestroyDynamic3DTextLabel(GangZoneLabel[g][i]);
    CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, g, INVALID_VEHICLE_ID, 1, 0, -1, -1, 100.0);
    }
    }
    }
    if(pInfo[playerid][Language] == LANGUAGE_EN)
    {
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][16], C_PURPLE, "» Teleport «\n"#C_WHITE_E"San Fierro Memorial\n/SFM");
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][23], C_PURPLE, "» Teleport «\n"#C_WHITE_E"The Big Ear Satellite Station\n/Satellite");
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][24], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Abandoned Airport\n/AA");
    UpdateDynamic3DTextLabelText(TeleportLabel[playerid][27], C_PURPLE, "» Teleport «\n"#C_WHITE_E"Ghost Lake\n/GL");


    for(new i = 0; i < MAX_GANG_ZONES; i++)
    {
    for(new g = 0; g < MAX_PLAYERS; g++)
    {
    new string[128];
    format(string, sizeof(string), "» GANG ZONE «\n"#C_WHITE_E"ID: %i\n%s", i, GW_Name[i][1]);
    DestroyDynamic3DTextLabel(GangZoneLabel[g][i]);
    CreateDynamic3DTextLabel(string, C_ORANGE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, g, INVALID_VEHICLE_ID, 1, 0, -1, -1, 100.0);
    }
    }
    }
    return 1;
    }


    Wie unschwer zu erkennen ist, möchte ich die TeleportLabel auch "updaten", jedoch nicht alle, sondern nur die ausgewählten: 16, 23, 24 und 27, also lohnt sich ein Loop nicht. Muss ich diese bei einem Sprachwechsel dann einfach zerstören und neu erstellen, oder wie stelle ich das an?

  • Nein, neu erstellen brauchst du sie nicht. Du kannst einfach die 4 Labels mit einem Loop durch alle Spieler für jeden Spieler updaten, oder eben nur für den Spieler für den du es willst. Das machst du einfach über die Variable, da das Label ja nur für den einen Spieler sichtbar ist.


    Destroy und Create hintereinander macht keinen Sinn, da kannst du Update verwenden.

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