zuwas wurde
fVehicle[fV][dbID] = cache_insert_id(MySQL_Connection);
umgennant MySQL R40?
fVehicle[fV][dbID] = cache_insert_id();
zuwas wurde
fVehicle[fV][dbID] = cache_insert_id(MySQL_Connection);
umgennant MySQL R40?
fVehicle[fV][dbID] = cache_insert_id();
Huhu,
ich bin ja aktuell dabei ein Haussystem zu scripten.
Ich wollte jetzt anfangen mit dem Interiorsystem, habe jedoch eine Probleme bzw. Fragen dazu:
1. Nehmen wir an, ich mappe einen eigenen Interior für ein Haus. Muss ich jetzt trotzdem per SetPlayerInterior den Interior wechseln, oder kann diese einfach 0 bleiben, da ich ja eh eine VW setze.
2. Ich habe gesehen, dass man die VirtualWorlds(VW) auf den selben Wert setzen soll, der die HausID ist(damit jeder nur die Leute im selben Haus sieht). Wenn ich dann jedoch ein Haus und eine Biz mit der ID 1 habe, wie gehe ich vor? Oder kann ich das außer Beachtung lassen, da die Ints sowieso alle an unterschiedl. Positionen sind?
Ich danke schonmal wie immer im Voraus.
//e:
Zu BrightLeaN:
Ich hab dass zwar selbst noch nicht gebraucht, jedoch könntest du ihn mithilfe eines Timers wieder auf seine alte Position setzen.
Oder immer wenn ein neuer Spieler den Actor lädt (OnActorSteamIn) diesen zurück auf seine Position setzen.
Hab auch bock.
Alles anzeigenNur mal kurz was fundamentales, was mich daran stört.
Von der Geschwindigkeit her, wäre es hier besser direkt MAX_HOUSES in der Bedingung zu verwenden, da das eine Konstante ist.
Du packt es in eine Variable, das macht es langsamer. Das würde nur Sinn machen, wenn MAX_HOUSES eine Funktion wäre xD
Und davon abgesehen, solltest du bei 0 starten und nicht bei 1
Zudem musst du die ID auch zurückgeben und nicht nur 1
Und wichtig ist auch, dass es kleiner als MAX_HOUSES ist und nicht kleiner gleich
Und die 0 wäre kein invalider Index hahaha xD
Also die ganze Funktion mal so schreiben:
Cstock getFreeHouseID() { for(new i; i<MAX_HOUSES; i++) { if(!hInfo[i][hID]) return i; } return -1; }
Cstock createHouse(playerid, Float:X, Float:Y, Float:Z) { new query[256],fid=getFreeHouseID(); if(fid == -1) return 0; //Hier wären alle Häuser voll! mysql_format(handle, query, sizeof(query), "INSERT INTO houses (h_id, h_x, h_y, h_z) VALUES ('%d','%f', '%f', '%f')", fid, X, Y, Z); mysql_pquery(handle, query, "OnHouseCreated", "ddfff", playerid, fid, X, Y, Z); return 1; }
Die Beschreibung wird nicht gesetzt, da du bei dem einen insID und bei dem Anderen houseid verwendest...
Sind diese Werte identisch? Was genau machst du da xD
oof oof oof oooof...
Was meinst du wie lange ich mir die schei*e angeschaut und das nicht gemerkt hab xD ?
Die for Schleife hab ich selbst schon bemerkt.
Zu dem Rest braucht man glaubig auch nicht viel mehr sagen...
ka warum ich manchmal so enorm brainafk bin.
Danke für eure Hilfe ^^.
Nochmal ein Problem:
Die folgende getFreeHouseID() Funktion sollte eigtl. eine freie(unbesetzte) ID für das zu erstellende Haus in createHouse zurückgeben.
Allerdings wird immer die 1 zurückgegeben und am Ende haben alle Häuser die selbe ID.
Außerdem wird die Beschreibung aus der Enumvariable nicht an folgender Stelle eingefügt.
In der Tabelle steht auch bei jedem erstellten Haus die 1.
//e: Kann man den getFreeHouseID stock irgendwie anders schreiben ?
getFreeHouseID:
stock getFreeHouseID()
{
for(new i=1, j=MAX_HOUSES; i<=j; i++)
{
if(hInfo[i][hID] == 0) return 1;
}
return 0;
}
createHouse:
stock createHouse(playerid, Float:X, Float:Y, Float:Z)
{
new query[256];
new fid=getFreeHouseID();
mysql_format(handle, query, sizeof(query), "INSERT INTO houses (h_id, h_x, h_y, h_z) VALUES ('%d','%f', '%f', '%f')",
fid, X, Y, Z);
mysql_pquery(handle, query, "OnHouseCreated", "ddfff", playerid, fid, X, Y, Z);
return 1;
}
hier wird die Beschreibung nicht gesetzt:
format(hInfo[insID][hDesc], MAX_HOUSE_DESC, "Dieses Haus steht zum Verkauf."); //HIER WIRD DIE BESCHREIBUNG DEFINIERT
//HIER EINGESETZT:
format(string1, sizeof(string1), "[Haus Nummer: %d]\nBesitzer: %s\nBeschreibung: %s\nPreis: %d\n Miete: %d$", hInfo[houseid][hID], owner, hInfo[houseid][hDesc], hInfo[houseid][hPrice], hInfo[houseid][hRent]);
BrainAFK
Wieder mal eine Frage meinerseits:
Ist es möglich zu prüfen ob die params bei OCMD null sind? Oder ist das ganze nichtmal nötig?
Zu BrightLeaN
Wie hole ich mir dann diesen Wert aus der Datenbank ohne einen großartigen Aufruf zu machen?
Bin mir nicht sicher, du könntest jedoch folgendes mal versuchen:
Bei der Query ein Callback auslösen z.B.
und dann...
forward OnGarageCreated();
public OnGarageCreated()
{
new insID;
insID = cache_insert_id();
cache_get_value_name_int(insID, "WERT", variableZumSpeichern);
return 1;
}
und in "variableZumSpeichern" würdest du dann den Wert aus dem Cache gespeichert haben.
Ah ok, im Endeffekt bleibt es ja fast gleich. #BrainDamagedHorse
Eine Sache noch:
-Die h_db ist mein Primary Key in der Enumvariable sollte i allerdings hID(Wert der die houseid speichert) sein.
Kann ich dann einfach folgendes machen?
new houseid; //dies
for(new i=0, j=rows; i<j; i++)
{
cache_get_value_name_int(i, "h_id", houseid);//und dies
cache_get_value_name_int(i, "h_db", hInfo[houseid][hDB]);
cache_get_value_name_float(i, "h_x", hInfo[houseid][hX]);
cache_get_value_name_float(i, "h_y", hInfo[houseid][hY]);
cache_get_value_name_float(i, "h_z", hInfo[houseid][hZ]);
cache_get_value_name_int(i, "h_owner", hInfo[houseid][hOwner]);
cache_get_value_name_int(i, "h_int", hInfo[houseid][hInt]);
cache_get_value_name_int(i, "h_price", hInfo[houseid][hPrice]);
cache_get_value_name_int(i, "h_rent", hInfo[houseid][hRent]);
cache_get_value_name_int(i, "h_rentable", hInfo[houseid][hRentable]);
cache_get_value_name_int(i, "h_level", hInfo[houseid][hLevel]);
cache_get_value_name(i, "h_db", hInfo[houseid][hDesc]);
updateHouse(houseid);
loadedHouses++;
}
Alles anzeigen
https://forum.sa-mp.com/showthread.php?t=376758
und der Download, falls man ihn übersieht:
http://www.mediafire.com/file/…TextDraw+Editor+(All).rar
viele Probleme werden bereits duurch das Q&A im forenthread geklärt.
Warum lädst du nicht einfach alle Häuser aus der Datenbank, indem du das WHERE Statement weglässt und loopst dann durch alle Zeilen durch? Dann lädst du doch alle vorhandenen Häuser.
Hey, danke für den Tipp. Könntest du mir ggf. auch sagen, wie ich durch die Zeilen loope?
Und prüfe welche hID die entsprechende Zeile hat bzw. diese dann zuweise?
Stelle mir das wie folgt vor, bin mir aber ein wenig unsicher.
stock loadHouses()
{
new query[256];
mysql_format(handle, query, sizeof(query), "SELECT * FROM houses");
mysql_pquery(handle, query, "onHouseLoaded");
return 1;
}
forward onHouseLoaded(houseid);
public onHouseLoaded(houseid)
{
new rows;
cache_get_row_count(rows);
if(rows != 0)
{
for(new i=0, j=MAX_HOUSES; i<=j; i++) //gehört hier j=MAX_HOUSES(700) oder j=rows hin ?
{
//ka wie ich jetzt prüfe, in welche hID in dieser row gespeichert ist
}
}
return 1;
}
Alles anzeigen
Huhu,
ich habe vor wenn der Server startet alle Häuser aus der MySQl-Tabelle in die Enumvariable zu setzen.
Es gibt max. 700 Häuser(MAX_HOUSES). Und da ich aktuell per Schleife 700 Datenbankanfragen habe, suche ich nach einer besseren alternative, die häuser anhand ihrer hID in die richtige Variable zu setzen.
Ein Haus, dass einmal die hID 15 hatte, soll diese nach dem Speichern und laden auch weiterhin behalten.
Soweit klappt es nur stört mich diese Schleife im....
...OnGameModeInit:
for(new i=0, j=MAX_HOUSES; i<=j; i++)
{
loadHouse(i);//Hier lade ich das Haus anhand seiner ID
}
new housesstring[64];
format(housesstring, sizeof(housesstring), "Geladene Häuser: %d", loadedHouses);
print(housesstring);
stock loadHouse(houseid):
stock loadHouse(houseid)
{
new query[256];
mysql_format(handle, query, sizeof(query), "SELECT * FROM houses WHERE h_id = '%d'", houseid);
mysql_pquery(handle, query, "onHouseLoaded", "d", houseid);
return 1;
}
onHouseLoaded:
forward onHouseLoaded(houseid);
public onHouseLoaded(houseid)
{
new rows;
cache_get_row_count(rows);
if(rows != 0)
{
cache_get_value_name_int(0, "h_db", hInfo[houseid][hDB]);
cache_get_value_name_float(0, "h_x", hInfo[houseid][hX]);
cache_get_value_name_float(0, "h_y", hInfo[houseid][hY]);
cache_get_value_name_float(0, "h_z", hInfo[houseid][hZ]);
cache_get_value_name_int(0, "h_owner", hInfo[houseid][hOwner]);
cache_get_value_name_int(0, "h_int", hInfo[houseid][hInt]);
cache_get_value_name_int(0, "h_price", hInfo[houseid][hPrice]);
cache_get_value_name_int(0, "h_rent", hInfo[houseid][hRent]);
cache_get_value_name_int(0, "h_rentable", hInfo[houseid][hRentable]);
cache_get_value_name_int(0, "h_level", hInfo[houseid][hLevel]);
cache_get_value_name(0, "h_db", hInfo[houseid][hDesc]);
updateHouse(houseid);
loadedHouses++;
}
return 1;
}
Alles anzeigen
Ich bedanke mich schonmal im Voraus und hoffe auf eine passendere Lösung.
Wenn das nicht mal wieder ein supergeiles Spiel wird. Kann mich den anderen nur anschließen. Hoffentlich wird's was.
Wie erstelle ich ein DynamicPickup in allen Virtuellen Welten? Das selbe auch für 3DTextLabels,
soll ich wirklich eine Schleife durchlaufen lassen? Oder gibts da was anderes?
Normalerweise solltest du beim Pickups-Erstellen eine virtuelle welt eintragen können. Wenn du dort -1 einträgst, ist dieses in allen VW's sichtbar.
}
for(new i;i<sizeof(gInfo);i++)
{
if(IsPlayerInRangeOfPoint(playerid,2.5,gInfo[i][gX],gInfo[i][gY],gInfo[i][gZ]))
{
if(gInfo[i][gLock] > 0)
{
//was von hier
if(gInfo[i][gBesitzer_dbID] == pInfo[playerid][pGarage])
{
SCM(playerid,-1,"TEST_1");
return 1;
}
else
{
if(IsPlayerInAnyVehicle(playerid))
{
SCM(playerid,-1,"Test_0");
}
}//bis hier passieren soll ist mir ein wenig unschlüssig.
}
} else SCM(playerid, -1, "Nicht in der Nähe!");
}
return 1;
}
Alles anzeigen
Einfach alle Returns rausnehmen und anders bauen. So sollte es klappen, allerdings ist mir die Funktion des Bereichs zwischen meinen Kommentaren ein wenig fragwürdig.
Alles anzeigenSTRG + F gedrückt und geschaut, wird sonst nicht ausgeführt, nur beim Disconnect erscheint beides sofort.
Ist auch egal, Fehler wurde aufgeschrieben, bis ich vorerst keine negativen Auswirkungen festelle, verschiebe ich das mal...
Bin gerade überfordert, wie frage ich in einer Schleife ab, ob ein Spieler in der Nähe ist mit einer Nachricht wenn nicht.
So hört er ja komplett auf, wenn ich das return und wenn ich in der schleife den else part mache ist ja komplett doof
Was wäre effektiv? (Zeile 4.)
Also so gehts nicht
CodeAlles anzeigen{ for(new i;i<sizeof(gInfo);i++) { if(!IsPlayerInRangeOfPoint(playerid,2.5,gInfo[i][gX],gInfo[i][gY],gInfo[i][gZ])) return SCM(playerid,-1,"Nicht in näheee"); { if(gInfo[i][gLock] > 0) return 1; if(gInfo[i][gBesitzer_dbID] == pInfo[playerid][pGarage]) { SCM(playerid,-1,"TEST_1"); return 1; } else { if(IsPlayerInAnyVehicle(playerid)) return SCM(playerid,-1,"Test_0"); } } } return 1; }
{
for(new i;i<sizeof(gInfo);i++)
{
if(!IsPlayerInRangeOfPoint(playerid,2.5,gInfo[i][gX],gInfo[i][gY],gInfo[i][gZ])) return SCM(playerid,-1,"Nicht in näheee");
if(gInfo[i][gLock] > 0) return 1;
if(gInfo[i][gBesitzer_dbID] == pInfo[playerid][pGarage])
{
SCM(playerid,-1,"TEST_1");
return 1;
}
else
{
if(IsPlayerInAnyVehicle(playerid)) return SCM(playerid,-1,"Test_0");
}
}
return 1;
}
Alles anzeigen
versuchs mal damit.
Wenn du diese Zeile nutzt, solltest du dahinter keine Klammer öffnen. Es sind beide Fälle durchs return geregelt:
if(!IsPlayerInRangeOfPoint(playerid,2.5,gInfo[i][gX],gInfo[i][gY],gInfo[i][gZ])) return SCM(playerid,-1,"Nicht in näheee");
ich hoffe mal ich habe das ganze richtig verstanden
Das ist auch richtig so, da das der Sinn ist von einem PRIMARY Key mit AUTO_INCREMENT.
Heißt, man kann das nicht ändern und müsste somit einfach einen weiteren ID Wert zuweisen, der dann die HausID wieder annimmt, die gerade frei ist?
Hi.
Ich bin gerade ein wenig aufgeschmissen. Ich habe ein Haussystem gescriptet und dann ist mir aufgefallen, dass wenn ich ein Haus gelöscht hab und ich dann ein neues erstelle, der PRIMARY KEY Wert mit Auto_Increment einfach dort das neue Haus speichert, wo er vorher stehen geblieben ist.
Heißt ich lösche ein Haus, welches in der MySQL Tabelle beim Primary_key den Wert 9 hatte und erstelle dann ein neues und der Wert 9 wird nicht wieder genutzt, obwohl er eigtl. frei ist.
Ich würde jedoch gerne prüfen ob ein Wert ungenutzt ist und dann wieder in diesen einsetzen.
Ich hoffe das ist so einigermaßen verständlich.
Danke im Voraus.
Liebe Community,
wir verlosen heute um 19:30 250k, dafür müsst ihr einfach um 19:30 auf demServer sein, eventuell werden auch Events veranstaltet.
Mit freundlichen Grüßen
Die Administration
Würde nochmal 250k draufgeben, aber für eine weitere Person.
Alles anzeigenCmysql_format(handle, query, sizeof(query), "DELETE FROM personalcars WHERE dbID = '%d'",PCar[playerid][i][P_dbID]); mysql_pquery(handle,query);
So lösche ich ja die Zeile, jetzt sind aber so noch alle Variablen gesetzt, heißt man müsste theoretisch sich neu einloggen.
Ist es möglich, alle Werte auf 0 zu setzten oder irgendwas invalides wie -1 ?
Habs noch nie gemacht
Ist i der Wert einer Schleife ? Wenn ja könntest du einfach wie folgt die Werte zurück setzen.
PCar[playerid][i][P_X] = 0;
PCar[playerid][i][P_Y] = 0;
PCar[playerid][i][P_Z] = 0;
PCar[playerid][i][P_R] = 0;
und so weiter
//edit: ich denke Leon war schneller
Wen ich mich nicht irre ss[64] weil man wahrscheinlich die Größe angeben soll bzw wieviele Zeichen darum der Fehler.
Ja habs schon gefixxt war in meinem fall s[24]s[5].
Hatte noch einen error, da man nicht s[MAX_PLAYER_NAME] machen darf. Ist aber gelöst. Trotzdem danke
Huhu,
bekomme folgende Fehlermeldung...
sscanf warning: Strings without a length are deprecated, please add a destination size.
sscanf warning: Strings without a length are deprecated, please add a destination size.
hierdurch....
new player[MAX_PLAYER_NAME], reason[64], query[256], crew;
if(sscanf(params, "ss", player, reason)) //MUSS ICH DAS ANDERS MACHEN ?
Ich nehme mal an ich muss die sscanf abfrage anders machen, damit durch die strings kein error mehr entsteht ?