3D Text Label verschwindet nicht

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
  • Hallöchen,


    wenn ein Spieler sich teleportiert, soll für kurze Zeit, solange die Spawnprotection aktiv ist, ein Label erscheinen. Nun ist es aber so, dass es nach dem 2x Porten immer besteht und nicht mehr zerstört wird.


    Hier ist die SpawnProtectionInfo von Relevanz.
    stock SetSpawnProtection(playerid)
    {
    SetPlayerHealth(playerid, 99999);
    InProtectionMode[playerid] = true;

    //Erstellen des Labels für playerid
    SpawnProtectionInfo[playerid] = CreateDynamic3DTextLabel("SPAWN PROTECTION", C_RED, 0.0, 0.0, 0.0, 50.0, playerid, INVALID_VEHICLE_ID, 1, -1, -1, -1, 100.0);

    if(GetPlayerVirtualWorld(playerid) == 0) SetTimerEx("EndSpawnProtection", 3000, false, "i", playerid);
    else SetTimerEx("EndGodMode", 3000, false, "i", playerid);
    return 1;
    }


    forward EndSpawnProtection(playerid);
    public EndSpawnProtection(playerid)
    {
    if(0 < PlayerHPandAP[playerid][health] < 100) ReturnPlayerHPandAP(playerid);
    else SetPlayerHealth(playerid, 100);

    InProtectionMode[playerid] = false;

    //Zerstören des Labels als Abbruchbedingung für den Timer
    DestroyDynamic3DTextLabel(SpawnProtectionInfo[playerid]);
    return 1;
    }


    stock AddTeleport(playerid, textDE[], textEN[], Float:PedX, Float:PedY, Float:PedZ, Float:PedA, Float:VehX, Float:VehY, Float:VehZ, Float:VehA, cost, bool:buffer, bool:spawnprotect, bool:msgtoall, worldid = 0, interiorid = 0)
    {
    if(PlayerActionForbidden(playerid)) return 1;
    if(buffer) if(BufferCMD(playerid)) return 1;
    if(GetPlayerMoney(playerid) >= cost)
    {
    if(spawnprotect == true)
    {
    SavePlayerHPandAP(playerid);
    SetSpawnProtection(playerid);
    }

    if(msgtoall == false) return SendLanguageMessage(playerid, C_GOLD, textDE, textEN);
    else if(msgtoall == true) return SendLanguageMessageToAll(C_GOLD, textDE, textEN);


    GivePlayerMoneyEx(playerid, -cost);
    SetPlayerPos(playerid, PedX, PedY, PedZ);
    SetPlayerFacingAngle(playerid, PedA);
    SetVehiclePos(GetPlayerVehicleID(playerid), VehX, VehY, VehZ);
    SetVehicleZAngle(GetPlayerVehicleID(playerid), VehA);
    PutPlayerInVehicle(playerid, GetPlayerVehicleID(playerid), 0);
    SetPlayerVirtualWorld(playerid, worldid);
    SetPlayerInterior(playerid, interiorid);
    SetCameraBehindPlayer(playerid);
    }
    else SendLanguageMessage(playerid, C_RED, "»WARNUNG« Du hast nicht genug Geld!", "»WARNING« You don't have enough money!");
    return 1;
    }


    //==================================================================================================================================================================================================================================


    COMMAND:ls(playerid, params[])
    {
    new stringDE[128],
    stringEN[128],
    pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(stringDE, sizeof(stringDE), "»TELEPORT« {%06x}%s "#C_GOLD_E"hat sich nach Los Santos teleportiert! [/LS]", GetPlayerColor(playerid) >>> 8, pName);
    format(stringEN, sizeof(stringEN), "»TELEPORT« {%06x}%s "#C_GOLD_E"has teleported to Los Santos! [/LS]", GetPlayerColor(playerid) >>> 8, pName);
    AddTeleport(playerid, stringDE, stringEN, 2492.7268, -1668.3849, 13.3438, WEST, 2492.7268, -1668.3849, 13.3438, WEST, 200, true, true, true, 0, 0);
    return 1;
    }

  • //Erstellen des Labels für playerid
    SpawnProtectionInfo[playerid] = CreateDynamic3DTextLabel("SPAWN PROTECTION", C_RED, 0.0, 0.0, 0.0, 50.0, playerid, INVALID_VEHICLE_ID, 1, -1, -1, -1, 100.0);

    Zu
    if(SpawnProtectionInfo[playerid]!=Text3D:-1) DestroyDynamic3DTextLabel(SpawnProtectionInfo[playerid]);
    SpawnProtectionInfo[playerid]=Text3D:-1;
    //Erstellen des Labels für playerid
    SpawnProtectionInfo[playerid] = CreateDynamic3DTextLabel("SPAWN PROTECTION", C_RED, 0.0, 0.0, 0.0, 50.0, playerid, INVALID_VEHICLE_ID, 1, -1, -1, -1, 100.0);


    Und die Deklaration:
    SpawnProtectionInfo[MAX_PLAYERS]={Text3D:-1,...};
    Die drei Punkte sollen da sein, das sagt dem Compiler, dass es für alle Indizes gemacht wird.



    Außerdem solltest du bei deinem EndSpawnProtection abfragen, ob er die Protection noch hat.
    if(!InProtectionMode[playerid]) return 1;

  • Okay, das ganze funktioniert nun zwar in der virtuellen Welt 0, aber in allen ab 1+ nicht mehr. Da will das Label nun nicht verschwinden.
    Ist es normal, dass man ein Label, dass gerade erst erstellt wurde erst sieht, wenn man sich bewegt?

  • Na du hast ja hier zwei Timer angegeben. Ist das nicht gewollt?
    if(GetPlayerVirtualWorld(playerid) == 0) SetTimerEx("EndSpawnProtection", 3000, false, "i", playerid);
    else SetTimerEx("EndGodMode", 3000, false, "i", playerid);


    Dann ändere es zu:
    if(GetPlayerVirtualWorld(playerid) == 0) SetTimerEx("EndSpawnProtection", 3000, false, "i", playerid);
    else SetTimerEx("EndSpawnProtection", 3000, false, "i", playerid);
    Bzw mach die Abfrage ganz weg, einfach nur:
    SetTimerEx("EndSpawnProtection", 3000, false, "i", playerid);


    Falls es doch so gewollt ist, poste die EndGodMode Funktion.

  • Oh natürlich, ich hab vollkommen vergessen, dass ich zwei verschiedene Timer habe.
    Und ja, es ist gewollt.
    EndSpawnProtection gibt die HP und AP zurück, die der Spieler vor der Spawnprotection hatte, also, wenn ein Spieler sich mit 50HP portet, wird er für 3 Sekunden in die Spawnprotection mit 99999HP gesetzt, und anschließen werden die 50HP in der Abbruchbedingung des Timers wieder zurück gegeben.
    forward EndSpawnProtection(playerid);
    public EndSpawnProtection(playerid)
    {
    if(0 < PlayerHPandAP[playerid][health] < 100) ReturnPlayerHPandAP(playerid);
    else SetPlayerHealth(playerid, 100);

    if(!InProtectionMode[playerid]) return 1;
    else InProtectionMode[playerid] = false;

    DestroyDynamic3DTextLabel(SpawnProtectionInfo[playerid]);
    return 1;
    }


    EndGodMode unterscheidet sich im HP und AP Aspekt: hier werden 100HP zurückgegeben. EndGodMode ist spezifisch für DMs gedacht, da hier immer 100HP zurückgegeben werden.
    forward EndGodMode(playerid);
    public EndGodMode(playerid)
    {
    if(!InProtectionMode[playerid]) return 1;
    else InProtectionMode[playerid] = false;
    SetPlayerHealth(playerid, 100);
    return 1;
    }


    Ich hab mir auch schon überlegt beides in einen Timer zu packen, eben mit if-Abfragen zur virtuellen Welt...

  • Na dann musst du dort das Label auch entfernen lassen:


    forward EndGodMode(playerid);
    public EndGodMode(playerid)
    {
    if(!InProtectionMode[playerid]) return 1;
    else InProtectionMode[playerid] = false;
    SetPlayerHealth(playerid, 100);

    DestroyDynamic3DTextLabel(SpawnProtectionInfo[playerid]);
    SpawnProtectionInfo[playerid]=Text3D:-1; //Das hier übrigens auch beim anderen hin machen.
    return 1;
    }

  • Das ist nötig, damit das Label nicht nochmal zerstört wird, denn die ID des Labels bleibt ja in der Variable, rufst du dann mit dieser Variable die Methode zum zerstören noch mal auf, kann es sein, dass ein Label eines anderen Spielers weg geht. Deshalb leeren wir die Variable zusätzlich, indem wir sie auf -1 setzen.