von jeder tankstelle den Namen auslesen lasse also nach ID nach?
Was ist das für ein Deutsch? hahaha xD
Aber ja einfach mit einer Schleife?
von jeder tankstelle den Namen auslesen lasse also nach ID nach?
Was ist das für ein Deutsch? hahaha xD
Aber ja einfach mit einer Schleife?
Ja,
Ich habe es falsch ausgedrückt bin total müde sry.
ocmd:lieferung(playerid)
{
#define getProdukts(%0) (floatround(Tanke[%0][tMaxLiter]-floatround(Tanke[%0][tLiter])))
#define getTankName(%0) (Tanke[%0][tName])
new string[550];
format(string,sizeof(string),"%s\t\t\t\tBenötigt: %d Liter\n%s\t\t\t\tBenötigt: %d Liter\n%s\t\t\tBenötigt: %d Liter\n",
getTankName(1), getProdukts(1), getTankName(2), getProdukts(2), getTankName(3), getProdukts(3));
format(string,sizeof(string),"%sVerona Oil Tanke\t\t\tBenötigt: %d Liter\nTemple Tanke\t\t\t\tBenötigt: %d Liter\nFlint County\t\t\t\tBenötigt: %d Liter\n",
string, getProdukts(4), getProdukts(5), getProdukts(6));
format(string,sizeof(string),"%sEaster Basin Tanke\t\t\tBenötigt: %d Liter\nDoherty Tanke\t\t\t\tBenötigt: %d Liter\nJuniper Hollow Tanke\t\t\tBenötigt: %d Liter",
string, getProdukts(7), getProdukts(8), getProdukts(9));
ShowPlayerDialog(playerid, DIALOG_TANKSTELLEN, DIALOG_STYLE_LIST,"Transport GmbH - Tankstellen Übersicht",string,"GPS","Schließen");
#undef getProdukts
#undef getTankName
return 1;
}
Alles anzeigen
Habe das nun so gemacht
Warum ignorierst du denn einfach Kalibers Code?
new string[550];
for(new i; i<sizeof(Tanke); i++)
{
format(string,sizeof(string),"%s\n%s\t\t\t\tBenötigt: %d Liter",string,getTankName(i), getProdukts(i));
}
ShowPlayerDialog(playerid, DIALOG_TANKSTELLEN, DIALOG_STYLE_LIST,"Transport GmbH - Tankstellen Übersicht",string,"GPS","Schließen");
Hallo,
Habe das Problem habe ingesamt momentan 6 Tankstellen.
Werden geladen alles kein Problem.
Die Sache ist nun wen ich /lieferung ausführe wird mir kaum was angezeigt außer von der letzten Tankstelle die ich in der DB drinnen habe.
ocmd:lieferung(playerid)
{
new string[1024];
for(new i; i<sizeof(Tanke); i++)
{
#define getProdukts(%0) (floatround(Tanke[%0][tMaxLiter]-floatround(Tanke[%0][tLiter])))
format(string,sizeof(string),"%s\n%s\t\t\t\tBenötigt: %d/%d Liter", string, Tanke[i][tName], getProdukts(i), floatround(Tanke[i][tMaxLiter]));
}
ShowPlayerDialog(playerid, DIALOG_TANKSTELLEN, DIALOG_STYLE_LIST,"Transport GmbH - Tankstellen Übersicht", string,"GPS","Schließen");
#undef getProdukts
return 1;
}
Alles anzeigen
Datenkbank:
Dialog:
1. Für die Übersicht http://wiki.sa-mp.com/wiki/Dialog_Styles wurde extra z.B. DIALOG_STYLE_TABLIST_HEADERS dafür eingeführt.
2. Es scheint, als würden wohl nicht alle deine Tankstellen geladen werden...wenn die Arrays leer sind, sind sie leer.
3. Lerne zu debuggen, du siehst hier oh, es scheint als wäre das leer.
Es stand ja immer da das 6/6 Tankstellen geladen wurden wen ich ingame gehe sind die Tankstellen auch da an der Richtigen Position der Name ect.
public LoadTanken()
{
new rows, count;
cache_get_row_count(rows);
for(new i=0;i<rows;i++)
{
new tankeID = cache_get_value_name_int(i, "id", Tanke[tankeID][tdbID]);
if(tankeID < MAX_TANKEN)
{
Tanke[tankeID][tCreated] = 1;
cache_get_value_name_int(i, "id", Tanke[tankeID][tdbID]);
cache_get_value_name_float(i, "PickupX", Tanke[tankeID][tPickupX]);
cache_get_value_name_float(i, "PickupY", Tanke[tankeID][tPickupY]);
cache_get_value_name_float(i, "PickupZ", Tanke[tankeID][tPickupZ]);
cache_get_value_name(i, "Besitzer", Tanke[tankeID][tBesitzer], MAX_PLAYER_NAME);
cache_get_value_name(i, "Name", Tanke[tankeID][tName], 64);
cache_get_value_name(i, "Teilhaber", Tanke[tankeID][tTeilhaber], MAX_PLAYER_NAME);
cache_get_value_name_int(i, "Preis", Tanke[tankeID][tPreis]);
cache_get_value_name_int(i, "Lock", Tanke[tankeID][tLock]);
cache_get_value_name_int(i, "PreisProLiter", Tanke[tankeID][tPreisProLiter]);
cache_get_value_name_float(i, "Liter", Tanke[tankeID][tLiter]);
cache_get_value_name_float(i, "MaxLiter", Tanke[tankeID][tMaxLiter]);
cache_get_value_name_int(i, "Kasse", Tanke[tankeID][tKasse]);
cache_get_value_name_int(i, "BenzinAnkauf", Tanke[tankeID][tBenzinAnkauf]);
cache_get_value_name_int(i, "Owned", Tanke[tankeID][tOwned]);
Tanke[tankeID][tText] = CreateDynamic3DTextLabel("Laedt ...", COLOR_WHITE, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 20.0);
if(Tanke[tankeID][tOwned] == 1)
{
Tanke[tankeID][tPickup] = CreatePickup(TANK_OWNER, 1, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 0);
}
else if(Tanke[tankeID][tOwned] == 0)
{
Tanke[tankeID][tPickup] = CreatePickup(NO_TANK_OWNER, 1, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 0);
}
UpdateTankLabel(tankeID, Tanke[tankeID][tOwned]);
count++;
}
}
printf("[LOAD] Tankstellen geladen: %d/%d", count, MAX_TANKEN);
return 1;
}
Alles anzeigen
So sieht das aus es wird alles erstellt alles geladen laut den Sprint auch die Namen. Es steht überall der Name richtig von den Tankstellen.
new tankeID = cache_get_value_name_int(i, "id", Tanke[tankeID][tdbID]);
Das hier ist dein Fehler.
Die Zeile macht keinen Sinn, da die Funktion cache_get_value_name_int immer nur den selben Wert returnt, somit überschreibst du fortwährend dein Array.
Deshalb wird dir alles angezeigt, aber letztlich wird das alles nur in einem Feld gespeichert und immer überschrieben.
Deshalb lösche diese Variable und verwende anstelle von tankeID einfach dein i ![]()
Es stand ja immer da das 6/6 Tankstellen geladen wurden wen ich ingame gehe sind die Tankstellen auch da an der Richtigen Position der Name ect.
CodeAlles anzeigenpublic LoadTanken() { new rows, count; cache_get_row_count(rows); for(new i=0;i<rows;i++) { new tankeID = cache_get_value_name_int(i, "id", Tanke[tankeID][tdbID]); if(tankeID < MAX_TANKEN) { Tanke[tankeID][tCreated] = 1; cache_get_value_name_int(i, "id", Tanke[tankeID][tdbID]); cache_get_value_name_float(i, "PickupX", Tanke[tankeID][tPickupX]); cache_get_value_name_float(i, "PickupY", Tanke[tankeID][tPickupY]); cache_get_value_name_float(i, "PickupZ", Tanke[tankeID][tPickupZ]); cache_get_value_name(i, "Besitzer", Tanke[tankeID][tBesitzer], MAX_PLAYER_NAME); cache_get_value_name(i, "Name", Tanke[tankeID][tName], 64); cache_get_value_name(i, "Teilhaber", Tanke[tankeID][tTeilhaber], MAX_PLAYER_NAME); cache_get_value_name_int(i, "Preis", Tanke[tankeID][tPreis]); cache_get_value_name_int(i, "Lock", Tanke[tankeID][tLock]); cache_get_value_name_int(i, "PreisProLiter", Tanke[tankeID][tPreisProLiter]); cache_get_value_name_float(i, "Liter", Tanke[tankeID][tLiter]); cache_get_value_name_float(i, "MaxLiter", Tanke[tankeID][tMaxLiter]); cache_get_value_name_int(i, "Kasse", Tanke[tankeID][tKasse]); cache_get_value_name_int(i, "BenzinAnkauf", Tanke[tankeID][tBenzinAnkauf]); cache_get_value_name_int(i, "Owned", Tanke[tankeID][tOwned]); Tanke[tankeID][tText] = CreateDynamic3DTextLabel("Laedt ...", COLOR_WHITE, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 20.0); if(Tanke[tankeID][tOwned] == 1) { Tanke[tankeID][tPickup] = CreatePickup(TANK_OWNER, 1, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 0); } else if(Tanke[tankeID][tOwned] == 0) { Tanke[tankeID][tPickup] = CreatePickup(NO_TANK_OWNER, 1, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 0); } UpdateTankLabel(tankeID, Tanke[tankeID][tOwned]); count++; } } printf("[LOAD] Tankstellen geladen: %d/%d", count, MAX_TANKEN); return 1; }
So sieht das aus es wird alles erstellt alles geladen laut den Sprint auch die Namen. Es steht überall der Name richtig von den Tankstellen.
Wenn du schon aus dem Virtual Reallife Script kopierst und es nur leicht umgeändert einfügst, brauchst du dich nicht wundern, wenn du nur Fehler bekommst.
public LoadTanken()
{
new rows, fields, count;
cache_get_data(rows, fields);
for(new i=0;i<rows;i++)
{
new tankeID = cache_get_field_content_int(i, "id");
if(tankeID < MAX_TANKEN)
{
Tanke[tankeID][tCreated] = 1;
Tanke[tankeID][tdbID] = cache_get_field_content_int(i, "id");
Tanke[tankeID][tPickupX] = cache_get_field_content_float(i, "PickupX");
Tanke[tankeID][tPickupY] = cache_get_field_content_float(i, "PickupY");
Tanke[tankeID][tPickupZ] = cache_get_field_content_float(i, "PickupZ");
cache_get_field_content(i, "Besitzer", Tanke[tankeID][tBesitzer], myCon, 32);
cache_get_field_content(i, "Name", Tanke[tankeID][tName], myCon, 32);
cache_get_field_content(i, "Teilhaber", Tanke[tankeID][tTeilhaber], myCon, 32);
Tanke[tankeID][tPreis] = cache_get_field_content_int(i, "Preis");
Tanke[tankeID][tLock] = cache_get_field_content_int(i, "Lock");
Tanke[tankeID][tPreisProLiter] = cache_get_field_content_int(i, "PreisProLiter");
Tanke[tankeID][tLiter] = cache_get_field_content_float(i, "Liter");
Tanke[tankeID][tMaxLiter] = cache_get_field_content_float(i, "MaxLiter");
Tanke[tankeID][tKasse] = cache_get_field_content_int(i, "Kasse");
Tanke[tankeID][tBenzinAnkauf] = cache_get_field_content_int(i, "BenzinAnkauf");
Tanke[tankeID][tOwned] = cache_get_field_content_int(i, "Owned");
Tanke[tankeID][tText] = CreateDynamic3DTextLabel("Laedt ...", COLOR_ALPHA_WHITE, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 20.0);
if(Tanke[tankeID][tOwned] == 1)
{
Tanke[tankeID][tPickup] = CreatePickup(TANK_OWNER, 1, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 0);
}
else if(Tanke[tankeID][tOwned] == 0)
{
Tanke[tankeID][tPickup] = CreatePickup(NO_TANK_OWNER, 1, Tanke[tankeID][tPickupX], Tanke[tankeID][tPickupY], Tanke[tankeID][tPickupZ], 0);
}
UpdateTankLabel(tankeID, Tanke[tankeID][tOwned]);
count++;
}
}
printf("[LOAD] Tankstellen geladen: %d/%d", count, MAX_TANKEN);
return 1;
}
Alles anzeigen
Habe ich verstanden werde so nun auch weiter arbeiten.
Dachte halt nur das es sein muss das man den nochmal auslesen muss dachte aber nicht das es überschrieben wird?
Habe das nun beim Haus system auch ausgebessert.
Klar möchte ich damit arbeiten aber irgendwie spinnt das bei mir bei mir wird das alles 5 mal ausgegeben ?
ocmd:lieferung(playerid)
{
new string[1024];
for(new i; i<sizeof(Tanke); i++)
{
#define getProdukts(%0) (floatround(Tanke[%0][tMaxLiter]-floatround(Tanke[%0][tLiter])))
format(string,sizeof(string),"Tankstelle\tBenötigt\tBezugspreis\n %s\n%s\t%d/%d Liter", string, Tanke[i][tName], getProdukts(i), floatround(Tanke[i][tMaxLiter]));
}
ShowPlayerDialog(playerid, DIALOG_TANKSTELLEN, DIALOG_STYLE_TABLIST_HEADERS,"Transport GmbH - Tankstellen Übersicht", string,"GPS","Schließen");
#undef getProdukts
return 1;
}
Alles anzeigen
Liegt das eventuell am string oder an was kann das liegen?
aber irgendwie spinnt das bei mir bei mir wird das alles 5 mal ausgegeben ?
Nein da spinnt nichts, du formatierst den String nur immer wieder in den String, deshalb wird das 5x ausgegeben ![]()
ocmd:lieferung(playerid)
{
#define getProdukts(%0) (floatround(Tanke[%0][tMaxLiter]-floatround(Tanke[%0][tLiter])))
new string[1024] = "Tankstelle\tBenötigt\tBezugspreis";
for(new i; i<sizeof(Tanke); i++)
{
format(string,sizeof(string),"%s\n%s\t%d/%d Liter\t%d$", string, Tanke[i][tName], getProdukts(i), floatround(Tanke[i][tMaxLiter]), Tanke[i][tPreisProLiter]);
}
ShowPlayerDialog(playerid, DIALOG_TANKSTELLEN, DIALOG_STYLE_TABLIST_HEADERS,"Transport GmbH - Tankstellen Übersicht", string,"GPS","Schließen");
#undef getProdukts
return 1;
}
Alles anzeigen
Als "Bezugspreis" hab ich nur so den PreisProLiter angegeben, kp was du damit aussagen magst.
Danke @Kaliber
Wollte kurz fragen wie kann ich machen das er keine menge mehr angeben muss um das abzuladen?
Das heißt er fährt einfach dahin gibt /unload ein dann wird die menge abgegeben die im Truck sind falls das zuviel sind wird nur das angeliefert was benötigt wird und der rest bleibt dann ja drinnen wen es zuviel war..
CMD:unload(playerid, params[])
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(GetVehicleTrailer(vehicleid)) == 584)
{
new string[128], int;
if(sscanf(params, "i", int))return SendClientMessage(playerid, COLOR_GREY, "{247BA6}* Benutze {33AA33}/unload [Menge]");
if(!IsPlayerInAnyVehicle(playerid))return SendClientMessage(playerid, COLOR_GREY, "** Du befindest dich in keinem Tanker.");
if(!(Spieler[playerid][pFraktion] == 13))return SendClientMessage(playerid, COLOR_GREY, "Du bist kein Member der Transport GmbH.");
if(int < 1 || int > 2500)return SendClientMessage(playerid, COLOR_GREY, "** Du kannst nur maximal 2500 Liter abladen.");
if(int > Vehicle[GetVehicleTrailer(vehicleid)][vehProds])return SendClientMessage(playerid, COLOR_GREY, "** Soviel Liter hast du nicht dabei.");
for(new it=1;it<MAX_TANKEN;it++)
{
if(Tanke[it][tCreated] == 1)
{
if(IsPlayerInRangeOfPoint(playerid, 5.0, Tanke[it][tPickupX], Tanke[it][tPickupY], Tanke[it][tPickupZ]))
{
if(Tanke[it][tLiter] == Tanke[it][tMaxLiter])return SendClientMessage(playerid, COLOR_GREY, "** Diese Tankstelle hat bereits die maximale Anzahl an Benzin.");
new cash = Tanke[it][tKasse];
new kosten = (Tanke[it][tBenzinAnkauf]*int);
if(cash < kosten)return SendClientMessage(playerid, COLOR_GREY, "** Die Kasse hat nicht genügend Geld für das Benzin.");
if(int > (Tanke[it][tMaxLiter]-Tanke[it][tLiter]))return SendClientMessage(playerid, COLOR_GREY, "** Soviel Liter kann diese Tankstelle nicht haben.");
Vehicle[GetVehicleTrailer(vehicleid)][vehProds] -= int;
new Float:intfloat = float(int);
new Float:add = floatadd(intfloat, Tanke[it][tLiter]);
Tanke[it][tLiter] = add;
format(string, sizeof(string), "* Du hast der Tankstelle %d Liter für $%d verkauft.", int, kosten);
Tanke[it][tKasse] -= kosten;
GiveMoney(playerid, kosten);
SendClientMessage(playerid, COLOR_GREEN, string);
UpdateTankLabel(it, Tanke[it][tOwned]);
}
}
}
}
return 1;
}
Alles anzeigen
Wollte kurz fragen wie kann ich machen das er keine menge mehr angeben muss um das abzuladen?
Ja, versuch dich mal daran, das ist ja nicht so schwer.
Und dann bist du feritg, komm, das schaffst du! ![]()
Wenn ich mit der Maus drüber gehe kann ich es trotzdem noch Anklicken aber wieso ?
Weil die TextSize nicht richtig ist ![]()
Jeffry hat das doch gut erklärt gehabt: [SAMMELTHREAD] Kleine Scripting Fragen
Meinst du so?
new int = Tanke[it][tLiter] -= Tanke[it][tMaxLiter];
Ich hoffe das stimmt so & ja ich möchte das alleine hin bekommen ![]()
Will nur auf nummer sicher gehn ob idas so richtig ist?
Will nur auf nummer sicher gehn ob idas so richtig ist?
Dann lies dir nochmal durch, was ich geschrieben habe.
Ich sagte MAX - AKTUELL.
Du rechnest AKTUELL - MAX.
Die Subtraktion ist nicht kommutativ, das lernt man glaube ich in der 5. Klasse.
3 - 5 != 5 - 3
Und wieso verwendest du in der Gleichung -=?
Das macht keinen Sinn, einfach nur -.
Schau dir eventuell noch mal die Basic Syntax in Pawn an: http://wiki.sa-mp.com/wiki/Scripting_Basics
//Edit:
Weil ich da bestimmte Anklickbar haben will aber die anderen nicht
2 Möglichkeiten:
C:\Users\ASUS\Desktop\Coming Soon\gamemodes\CS.pwn(14442) : warning 213: tag mismatch
Sagt der mir immer wieder,
Ja das habe ich verstanden max minus liter war von mir ein fehler
new int = Tanke[it][tMaxLiter] - Tanke[it][tLiter];
Sagt der mir immer wieder,
Weil wie es scheint du den Liter als Float deklariert hast.
Sprich du müsstest so etwas tun:
new Float:int = Tanke[it][tMaxLiter] - Tanke[it][tLiter];