Beiträge von Caglar

    Wenn der Text eines Eintrags nur einmal vorkommen kann (zum Beispiel: Kennzeichen), kannst du auch danach suchen.
    Bei einem Listen-Dialog beinhaltet "inputtext" den Text des Eintrags, auf den der Spieler geklickt hat.


    Edit:
    Übrigens solltest du die Variable "globalId" vor beginn der Schleife erstellen.

    Es werden mehrere Fahrzeuge aufgelistet, nicht nur eine, daher auch die globale ID in der Schleife.
    Es geht hier nicht um das Kennzeichen (das würde ich ja genau so wenig herrausfinden, wenn ich nicht weiß, auf welches der Spieler geklickt hat).
    Ich könnte höchstwahrscheinlich nur in einer Variable alles abspeichern. Meine Frage ist ja aber, ob es eine alternative, bessere Möglichkeit gibt.

    Ich habe ein Dialog welches die Fahrzeuge des Spielers auflistet (geladen wird es von der Datenbank).
    Wie kann ich aber bei der Auswahl herrausfinden, auf welches Fahrzeug der Spieler geklickt hat?
    Müsste ich dafür dann eine Variable definieren und jedesmal mit einer Schleife drüber gehen?



    new String[2048] = "";
    for(new i = 0; i < num_rows; i++) {
    new globalId;
    globalId = cache_get_field_content_int(i, "Id", Database);
    format(String, sizeof(String), "%s%s (Id: %i)\n", String, VehicleNames[VehicleInfo[globalId][vModelId] - 400], VehicleInfo[globalId][vId]);
    }


    ShowPlayerDialog(playerid, DIALOG_PV_2, DIALOG_STYLE_LIST, "{FFFFFF}Fahrzeuge", String, "Finden", "Schließen");

    Nützlich für bspw. die näherste Tankstelle auf der Map makieren o.Ä.
    Rechnet die Reichweite vom Spieler und den Koordinaten und wählt davon das, welches dem Spieler am nähesten ist.


    new Float:tankstellen[2][] = {
    {-1471.5, 1863.75, 32.7},
    {-1326.5, 2677.5, 50.1}
    };


    new Float:distance[sizeof(tankstellen)], Float:minimum, x;
    for(new i = 0; i < sizeof(tankstellen); i++) {
    distance[i] = GetPlayerDistanceFromPoint(playerid, tankstellen[i][0], tankstellen[i][1], tankstellen[i][2]);
    }


    for(new i = 0; i < sizeof(distance); i++) {
    if(distance[i] < minimum || minimum == 0) {
    minimum = distance[i];
    x = i;
    }
    }

    Darf ich deinen Server, welches du von mir gesponsort bekommen hast somit deaktivieren?
    Finde ich etwas schade, dass man nicht Bescheid gibt, immerhin nutzt du den Speicher, welches andere Nutzer haben könnten.
    Dein Problem lag eher darin, dass du die libmysql.dll nicht im direkten Server Pfad hattest.

    Du kannst ein TableLayout nutzen, worin sich die ImageButtons befinden.
    Ich habe dir mal ein Beispiel in XML erstellt, vielleicht hilft es dir.
    Wenn du Probleme mit der Hintergrundfarbe und dem Rand hast, kannst du dich an mich wenden.


    Ich lade meine Interiors aus der Datenbank und erstelle demnach einen Pickup für den Eingang des Interiors.
    Ich habe es printen lassen und merkte, das OnPlayerPickUpPickup erst garnicht aufgerufen wird, aber wieso?
    Die Pickups und 3DTextLabels werden erstellt und angezeigt.


    public OnPlayerPickUpPickup(playerid, pickupid) {
    for(new i = 0; i < sizeof(InteriorInfo); i++) {
    if(pickupid == InteriorInfo[i][iPickup]) {
    SetPlayerInterior(playerid, InteriorInfo[i][iInterior]);
    SetPlayerVirtualWorld(playerid, InteriorInfo[i][iWorld]);
    SetPlayerPos(playerid, InteriorInfo[i][iInteriorEingangX], InteriorInfo[i][iInteriorEingangY], InteriorInfo[i][iInteriorEingangZ]);
    //SetPlayerFacingAngle(playerid, InteriorInfo[i][iInteriorEingangA]);
    return 1;
    }
    }
    return 1;
    }


    public LoadInteriors() {
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields, Database);
    if(!num_rows) return 1;


    new iname[128];
    for(new i = 0; i < num_rows; i++) {
    cache_get_field_content(i, "Name", iname, Database);
    InteriorInfo[i][iName] = iname;
    InteriorInfo[i][iWorld] = cache_get_field_content_int(i, "World", Database);
    InteriorInfo[i][iInterior] = cache_get_field_content_int(i, "Interior", Database);
    InteriorInfo[i][iInteriorEingangX] = cache_get_field_content_float(i, "InteriorEingangX", Database);
    InteriorInfo[i][iInteriorEingangY] = cache_get_field_content_float(i, "InteriorEingangY", Database);
    InteriorInfo[i][iInteriorEingangZ] = cache_get_field_content_float(i, "InteriorEingangZ", Database);
    InteriorInfo[i][iEingangX] = cache_get_field_content_float(i, "EingangX", Database);
    InteriorInfo[i][iEingangY] = cache_get_field_content_float(i, "EingangY", Database);
    InteriorInfo[i][iEingangZ] = cache_get_field_content_float(i, "EingangZ", Database);
    InteriorInfo[i][iAusgangX] = cache_get_field_content_float(i, "AusgangX", Database);
    InteriorInfo[i][iAusgangY] = cache_get_field_content_float(i, "AusgangY", Database);
    InteriorInfo[i][iAusgangZ] = cache_get_field_content_float(i, "AusgangZ", Database);
    InteriorInfo[i][iAusgangA] = cache_get_field_content_float(i, "AusgangA", Database);


    new String[256];
    format(String, sizeof(String), "%s", InteriorInfo[i][iName]);
    Create3DTextLabel(String, COLOR_YELLOW, InteriorInfo[i][iEingangX], InteriorInfo[i][iEingangY], InteriorInfo[i][iEingangZ], 40.0, 0, 0);
    InteriorInfo[i][iPickup] = CreatePickup(1318, 0, InteriorInfo[i][iEingangX], InteriorInfo[i][iEingangY], InteriorInfo[i][iEingangZ], 0);
    }
    return 1;
    }

    Naja, übertreiben solltest du es nicht, weil du bedenken musst, dass der Speicher dafür reserviert wird, die amx Datei größer wird und der Compiler länger braucht zum kompilieren.
    Das Limit ist also abhängig von den Ressourcen.


    Angenommen du hast 10 Registrationen pro Tag auf deinem Server, dann reichen 10000 für die nächsten drei Jahre. Erst dann müsstest du es erhöhen. Ich, an deiner Stelle, würde es auf 1000 lassen und beobachten wie viele Spieler pro Tag dazu kommen. Entsprechend kannst du es dann anpassen.

    Ich mache es dann lieber so, dass der Benutzername in der Datenbank vom Besitzer des Fahrzeuges gespeichert wird und lese es direkt aus.
    Ich glaube das wird so sonst zu resourcefressend.

    Jeffry:
    So habe ich es nun. Zu meinem Problem:
    public LoadGlobalNames() {
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields, Database);
    if(num_rows) {
    new id, name[MAX_PLAYER_NAME];
    for(new i = 0; i < num_rows; i++) {
    id = cache_get_field_content_int(i, "Id", Database);
    cache_get_field_content(i, "Username", name, Database);
    PlayerGlobalName[id] = name;
    printf("Spielername: #%i %s (%s)", id, name, PlayerGlobalName[id]);
    }
    }
    }

    Zitat

    [18:06:37] Spielername: #1 xQueen. ()
    [18:06:37] Spielername: #3 xKing. (xKing.)
    [18:06:37] Spielername: #6 Portgras (Portgras)
    [18:06:37] Spielername: #7 Portgas (Portgas)

    Es liegt aufjedenfall nicht an der Datenbank, das habe ich bereits geprüft.
    Ist etwas am Code falsch?


    Edit:
    So habe ich's definiert
    new PlayerGlobalName[][MAX_PLAYER_NAME];

    Das ist auch keine so gute Idee, da du davon ausgehen musst, dass du vielleicht mal 100.000 registrierte Benutzer hast, und das würde doch ziemlich Speicher nutzen und auch etwas beim Laden dauern.
    Kannst du zwar machen (funktioniert auch), ist aber ebenfalls nicht empfohlen.

    Wie kann ich's denn am besten lösen?
    Also das der Serverstart etwas länger braucht ist ja egal, aber würde es Ladeprobleme geben, wenn ich dann bspw.
    new test[128] = PlayerGlobalName[PlayerInfo[playerid][pId]];
    nutzen würde?

    Du kannst auch beim neuen Plugin mysql_query verwenden, dann kannst du das über einen stock zurück geben, aber empfohlen ist es nicht.

    Wenn ich es per Array mache sprich, wenn ich die Spielernamen in einem Array beim Serverstart und bei der Registrierung hinzufüge, würde es doch auch klappen oder? Aber wie sieht es dann bei 500 registrierten Nutzer aus :S

    Ich möchte mittels einer Funktion den globalen Spielernamen (aus der Datenbank) ausgeben.
    Wie mache ich das bei MySQL? Publics returnen keinen String und stocks kann ich für den Callback ja nicht nutzen.
    Gibt es eine Variante ohne Callbacks zu arbeiten?
    stock GetPlayerGlobalName(globalid) {
    new Name[128];
    // sql..
    return Name;
    }