Jeffry:
Wie könnte ich hier nur die Zahl 52 herrausfischen?
ZitatSultan (Besitzer: Caglar) (ID: 52)
Jeffry:
Wie könnte ich hier nur die Zahl 52 herrausfischen?
ZitatSultan (Besitzer: Caglar) (ID: 52)
Und wenn man z.B. 2x 411 (Infernus) hat?
Danke Josuha, aber bei der ID wird ja die globale ID des Fahrzeuges ausgegeben, damit könnte ich arbeiten.
Dann musst du nur prüfen, ob "inputtext" nur Zahlen enthält, ggf. vorher die ID parsen und zu einem Integer umwandeln.
Wie soll ich bei einer Liste inputtext verwenden?
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.
Die wohl beste Dokumentation ist die von Android selbst.
http://developer.android.com/develop/index.html
Zeig mal den ganzen Code der Activity und die XML.
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.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="*">
<TableRow
android:gravity="center"
android:layout_weight="1">
<ImageButton
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<ImageButton
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<ImageButton
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</TableRow>
<TableRow
android:gravity="center"
android:layout_weight="1">
<ImageButton
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<ImageButton
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<ImageButton
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</TableRow>
</TableLayout>
</LinearLayout>
Alles anzeigen
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;
}
Ist zwar eine gute Arbeit von dir, gibt es aber auch leider schon öfters.
Ja, aber die meisten funktionieren nicht oder benötigen den CLEO Mod.
Das mit den Koordinaten wäre mir aber neu, kenne nur mit der Map Makierung und dem Checkpoint.
Muss in diesem Fall nicht sein, habe es aber trotzdem mal hochgeladen.
[16:06:20] EID: 1054 | Error: Unknown column 'pBootsschein' in 'field list' | Resultid -1 | extraid: -1
pBootschein existiert in deiner Tabelle als Feld nicht.
Ich habe es beim Scripten gebraucht, um nicht jedesmal hin und her zu fahren, weil ich
auf ein Command keine Lust hatte. Vielleicht benötigt es ja jemand. Es ist nicht für verbotene Zwecke gedacht,
das man bspw. auf nem Server sich hin und her portet. Wer es dafür nutzt, der trägt auch die Haftung.
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.
Du musst die Größe angeben, sonst geht es nicht richtig.
new PlayerGlobalName[1000][MAX_PLAYER_NAME];
Die 1000 musst du gegebenenfalls erhöhen, wenn du mehr User hast.
Hat dies ein bestimmtes Limit?
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
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;
}