Beiträge von Jeffry

    Sorry, bin gestern Abend nicht mehr dazu gekommen und bin erst jetzt wieder heim gekommen.
    Versuche es so:

    C
    for(new i=0; i<sizeof(WantedPlayerLabel); i++)
    {
    	DeletePlayer3DTextLabel(i, WantedPlayerLabel[giveplayerid][i]);
    	WantedPlayerLabel[giveplayerid][i]  = PlayerText3D:INVALID_3DTEXT_ID;
    }

    Das dürfte dann klappen, da ich grade bemerkt habe, dass du bei /clear eine ID eingibst.

    Entschuldige für meine Dummheit.

    Ohh, nee, das war mein Fehler, ist habe das nicht mehr ersetzt. Sorry!



    Wie kommst du darauf das es so geht?

    Ich habe mir die Dokumentation im sscanf Thread angeschaut. Dieser ' was bei dir noch am Ende war hat einen neuen String angefangen, dadurch hat sscanf eine weitere Variable erwartet. Ohne den ' ging es, aber dann war alles vom Name an nach hinten im String. Daher habe ich den nächsten Teil als {s} angegeben, das heißt der String wird ignoriert. Somit passt es, da der Rest vom String ignoriert wird.

    Schreibe die Funktion jetzt bitte mal so:



    Im Befehl:

    C
    CreateWantedLabel(giveplayerid,0);


    zu:

    C
    for(new i=0; i<sizeof(WantedPlayerLabel); i++)
    {
    	DeletePlayer3DTextLabel(i, WantedPlayerLabel[playerid][i]);
    	WantedPlayerLabel[playerid][i]  = PlayerText3D:INVALID_3DTEXT_ID;
    }
    C
    stock static RandomSpawn(id, Modelidc, Float:X, Float:Y, Float:Z, Float:rZ)
    {
        spawnmodel[id] = Modelidc;
        spawnx[id] = X;
        spawny[id] = Y;
        spawnz[id] = Z;
        spawnzz[id] = rZ;
        return 1;
    }





    Deine Variablen änderst du von:
    new Float:spawnzz;
    zu:
    new Float:spawnzz[15];
    Für alle 5 natürlich so.



    Und beim Einlesen (count fängt bei 0 an, daher drunter):

    C
    RandomSpawn(count, mapValues[pMmodelids], mapValues[pMXs], mapValues[pMYs], mapValues[pMZs]+offZ, mapValues[pMRZs]);
    ++count;



    Dann kannst du die Koordinate so bekommen:

    C
    new rnd = random(15);
    SetPlayerPos(playerid, spawnx[rnd], spawny[rnd], spawnz[rnd]);

    Je nach dem wie seine NPCs auf mehrere Spieler gleichzeitig in der Nähe reagieren sollen macht das natürlich Sinn, ja. Soll der NPC aber nur eine Nachricht anzeigen, die alle Spieler sehen, dann macht es wenig Sinn zig Labels zu verwenden.


    Allerdings bringt es nichts darüber zu spekulieren, da es dutzende Möglichkeiten gibt, das zu realiseren, je nach dem was das System können soll. Er soll es einfach ausprobieren und gegebenenfalls Änderungswünsche äußern, falls er die Änderungen nicht selbst vornehmen kann.

    Der Stream Radius ist dafür aber viel zu groß.
    Außerdem, wenn er einmal eingestreamt ist, und dann ein anderer Spieler eingestreamt wird, dann ändert sich die Nachricht zu der, die dem anderen Spieler angezeigt werden soll (mit dessen Name), auch wenn man selbst den NPC vielleicht noch gar nicht sieht (drei Blöcke weiter). Außerdem wird das Callback nur einmal aufgerufen, sprich wenn du in dem Stream Radius 2 NPCs hast klappt es nicht mehr, wenn man von A zu B laufen soll.


    Ein Timer ist hier besser.

    Ich kann es mir nicht erklären, außer, dass du das Limit erreicht hast. Ich habe dir jetzt mal zu Testzwecken diese Schleife eingebaut, um die ersten 1000 Labels des Spielers zu löschen, vielleicht gibt das ja Aufschluss.



    Außerdem habe ich ein paar kleine Dinge hinzugefügt und die prints umgestellt. So muss es laut Code klappen, schauen wir mal was die prints jetzt sagen.

    Das Array um den nächsten NPC zu speichern brauchst du eigentlich nicht.
    Starte bei OnGameModeInit den Timer:

    C
    SetTimer("CheckNPCBubble", 1000, true);


    Und dann das public dazu:


    Falls alle NPCs in der Nähe eine Nachricht ausgeben sollen, und nicht nur der nächste, dann so: