dass all nicht definiert ist
Ah okay, dann nutzt du nicht die Aktuellste MySQL Version ![]()
Wird denn ein mysql_log erstellt? ![]()
dass all nicht definiert ist
Ah okay, dann nutzt du nicht die Aktuellste MySQL Version ![]()
Wird denn ein mysql_log erstellt? ![]()
Wie gesagt, aktiviere den MySQL Log über mysql_log(ALL); unter OnGameModeInit uuund dann schau in den Ordner logs und poste diesen ![]()
Hast du mysql_log(ALL); unter OnGameModeInit?
Dann wird ein Ordner Namens logs erstellt (nicht in den scriptfiles, sondern eins drüber, beim server_log)
somit die Koordinaten auch nicht
Sehr gut, jetzt weißt du, dass der Fehler beim Laden liegt ![]()
Musst mal in den MySQL Log schauen ![]()
Musste mal n print setzen in der Schleife unter OnPlayerSpawn und schauen, was für Werte die einzelnen Sachen haben.
Sind denn die 3DTextLabel da?
Danke im Voraus
Mit dem Alpha Kanal.
Sagen wir du hast 0xFF0000FF das ist ein rot.
Denn der Code ist so aufgebaut:
RGBA = Red Green Blue Alpha
0x = Sagt nur aus, dass es eine Hex Zahl ist
FF = Der Rot wert, in diesem Fall volle Lotte
00 = Green wir haben kein Grün
00 = Blue kein Blau
FF = Der Alpha kanal, FF heißt volle lotte, also keine Transparenz. Schreibst du aber AA oder 88 also verringerst es, wird es transparenter ![]()
Was sagt denn der MySQL-Log? ![]()
Was sollen die viele Schleifen?!
Du musst dich immer fragen, wie kann ich Dinge ohne Schleifen nutzen ![]()
Nur im äußersten Notfall, ist es mal nötig, Aber generell sollte man darauf verzichten können ![]()
ich möchte nach dem Kauf eines Fahrzeuges
Schleifen nutzt man ja immer, um etwas zu suchen.
Aber hier, hast du doch schon das Fahrzeug gefunden.
Speichere doch die vehicleid zwischen und verwende sie einfach direkt für das Setzen des Tankes ![]()
ich hoffe ich finde hier einen der mir hilft , der mir per Teamspeak helfen kann etc...
Nah, TeamSpeak ist immer nur die Letzte Option.
Pack mal unter OnGameModeInit mysql_log(ALL);.
Dann wird ein Ordner erstellt Namens logs (nicht in den scriptfiles, sondern 1 drüber..wieso auch immer).
Und dort, kannst du dann genau verfolgen, was deine Datenbank macht, bzw zensiere dort das Passwort und poste mal den Log ![]()
Ja klar, wenn du die Funktion nur nutzt.
e_fuel = maxFuel - random(8)
Wieso machst du es nicht so?! ![]()
Wie lasse ich die Ränge z.b als Erster einzeigen:
Hatte da mal was geschrieben gehabt:
Verwende diese Include: https://raw.githubusercontent.…d-sort/master/md-sort.inc
Und dann so:
CMD:admins(playerid)
{
new string[18 + MAX_PLAYER_NAME];
new a_rang[][] = {"Communityhelfer", "Supporter", "Moderator", "Admin", "Head Admin", "Projektleiter"};
new sort[20][2],c;
SendClientMessage(playerid, COLOR_WHITE, "{AFAFAF}Teammitglieder online:");
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(!IsLoggedIn(i) || !PlayerInfo[i][pAdmin]) continue;
sort[c][0] = PlayerInfo[i][pAdmin], sort[c++][1] = i;
}
if(c > 0)
{
SortDeepArray(sort, 0);
for(new i=sizeof(sort)-1; i != -1; i--)
{
if(!sort[i][0]) continue;
format(string,sizeof(string),"%s: %s",a_rang[sort[i][0]-1],PlayerInfo[sort[i][1]][pName]); //evtl [pName] anpassen
SendClientMessage(playerid,Grau,string);
}
}
else return SendClientMessage(playerid,Grau,"Zurzeit ist kein Teammitglied online.");
return 1;
}
Alles anzeigen
Hast du noch eine Idee?
Ja..das ist richtig.
Der prüft ja nur, ob du an einem stehst, deshalb iteriert er da durch, das ist alles richtig.
Kannst du auch wieder löschen.
Kann man das theoretisch machen?
Nein, da ja nur eine Millisekunde vergeht bis zur vorherigen Abfrage.
Und dort hast du ja geprüft, ob er wirklich in dem Fahrzeug ist oder nicht.
Das hatte ich auch oben geschrieben xD
Alles anzeigenfor(new d; d < sizeof(PCar[]); d++)
{
if(PCar[playerid][d][P_MID] == 0)
{
//Prüfe, ob Fahrzeug existiert. Wenn nicht, nutze den Slot und lege das Fahrzeug an.
SetPVarInt(playerid,"_tmp_veh",d);
StartGenerateUniqueRandomNumber(playerid, handle, NUMBER_PLATE_POOL, 0);
break;
}
}
Schau mal..so sieht meine Code aus..
...siehst du den Unterschied?
Bei dir ist keine if-Abfrage..nur ein break..was keinen Sinn macht...
//Edit:
Und sag mal willst du mich hier trollen oder so?! ![]()
PCar[playerid][d][P_MID] = GetPlayerVehicleID(playerid);
Ich sagte, du sollst es ersetzen..und nicht das GetVehicleModel drum herum löschen...
wie finde ich die Koordinaten dafür ?
Mit einem TextDraw-Editor.
https://forum.sa-mp.com/showthread.php?t=543002
https://forum.sa-mp.com/showthread.php?p=3927120
ich kann den Code nicht benutzen den du geschrieben hast weil i nicht definiert ist, deswegen die Schleife.
Lösche die Schleife!
Nutze dort einfach: GetPlayerVehicleID(playerid) anstatt Autohausauto1[i], du hast ja schon vorher gecheckt, ob er da wirklich drinnen sitzt.
öfters
benutzen kann.
Das habe ich doch auch erklärt, du änderst einfach den Token:
StartGenerateUniqueRandomNumber(playerid, handle, NUMBER_PLATE_POOL, 1);
und dann kannst du im Callback:
//Im Callback OnRandomNumberGenerated
public OnRandomNumberGenerated(playerid, const pool, const token, const status)
{
if(status == -1) return printf("Der Random Pool (%d), ist leer!",pool);
switch(pool)
{
case SMALL_EXAMPLE_POOL:
{
switch(token)
{
case 0: ApplyNumberPlate(playerid, status);
case 1: AnotherFunction(playerid, status); //<< wird dann nur aufgerufen bei token 1
}
}
}
return 1;
}
Alles anzeigen
//Edit:
irgendwie geht das nicht.
Was machst du da auch?! Wieso änderst du den Code?
Warum löschst du einfach ein break und die if-Abfrage in der Schleife?!
Wieso packst du in die andere Funktion eine Schleife mit i die vorher gar nicht da war?!?!
Nutze dort einfach: GetPlayerVehicleID(playerid) anstatt Autohausauto1[i], du hast ja schon vorher gecheckt, ob er da wirklich drinnen sitzt.
So kann das natürlich nicht funktionieren...wenn da keine Code-Logik dahinter steht..
Nimm doch einfach den Code, wie ich ihn geschrieben hatte...
Schreibst das dann einfach so:
for(new d; d < sizeof(PCar[]); d++)
{
if(PCar[playerid][d][P_MID] == 0)
{
//Prüfe, ob Fahrzeug existiert. Wenn nicht, nutze den Slot und lege das Fahrzeug an.
SetPVarInt(playerid,"_tmp_veh",d);
StartGenerateUniqueRandomNumber(playerid, handle, NUMBER_PLATE_POOL, 0);
break;
}
}
Und der ganze Rest, kommt dann in das Callback, z.B. so:
//Im Callback OnRandomNumberGenerated
public OnRandomNumberGenerated(playerid, const pool, const token, const status)
{
if(status == -1) return printf("Der Random Pool (%d), ist leer!",pool);
switch(pool)
{
case SMALL_EXAMPLE_POOL:
{
switch(token)
{
case 0: ApplyNumberPlate(playerid, status);
}
}
}
return 1;
}
Alles anzeigen
Und dann packst das einfach alles in die Funktion:
stock ApplyNumberPlate(playerid, number) //number ist die eindeutig zufällige Zahl
{
new d = GetPVarInt(playerid,"_tmp_veh"), SP = random(sizeof(SAHSpawn)), FB = random(127);
DeletePVar(playerid, "_tmp_veh");
PCar[playerid][d][P_KZ] = number;
PCar[playerid][d][P_uID] = pInfo[playerid][db_id];
PCar[playerid][d][P_X] = SAHSpawn[SP][0];
PCar[playerid][d][P_Y] = SAHSpawn[SP][1];
PCar[playerid][d][P_Z] = SAHSpawn[SP][2];
PCar[playerid][d][P_R] = SAHSpawn[SP][3];
PCar[playerid][d][P_C1] = FB;
PCar[playerid][d][P_C2] = FB;
PCar[playerid][d][P_MID] = GetVehicleModel(Autohausauto1[i]);
PCar[playerid][d][P_dbID] = pInfo[playerid][db_id];
PCar[playerid][d][P_VID] = CreateVehicle(PCar[playerid][d][P_MID],PCar[playerid][d][P_X] , PCar[playerid][d][P_Y], PCar[playerid][d][P_Z], PCar[playerid][d][P_R], PCar[playerid][d][P_C1], PCar[playerid][d][P_C2], -1);
new query[256];
mysql_format(handle, query, sizeof(query), "INSERT INTO personalcars (P_X, P_Y, P_Z, P_R, P_C1, P_C2, P_MID, P_uID) VALUES ('%f','%f','%f','%f','%d','%d','%d','%d')",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_C1],PCar[playerid][d][P_C2],PCar[playerid][d][P_MID],PCar[playerid][d][P_uID]);
mysql_pquery(handle,query);
}
Alles anzeigen
Zu deiner 1. Frage mit dem Enter, schreib das mal so:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(!IsPlayerInAnyVehicle(playerid) && (newkeys & KEY_SECONDARY_ATTACK))// Enter
{
// Öffentliche Gebäude
if(GetPVarInt(playerid,"InBuilding")!=-1)
{
new e=GetPVarInt(playerid,"InBuilding");
if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][IX],Building[e][IY],Building[e][IZ]))
{
SetPlayerPos(playerid,Building[e][EX],Building[e][EY],Building[e][EZ]);
SetPlayerInterior(playerid,0);
SetPlayerVirtualWorld(playerid,0);
SetPVarInt(playerid,"InBuilding",-1);
return 1;
}
}
else
{
for(new e;e<sizeof (Building);e++)
{
if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][EX],Building[e][EY],Building[e][EZ]))
{
SetPlayerPos(playerid,Building[e][IX],Building[e][IY],Building[e][IZ]);
if(Building[e][Interior]!=0)SetPlayerInterior(playerid,Building[e][Interior]);
if(Building[e][Welt]!=0)SetPlayerVirtualWorld(playerid,Building[e][Welt]);
SetPVarInt(playerid,"InBuilding",e);
return 1;
}
}
}
// Biz
if(GetPVarInt(playerid,"InBiz")!=-1)
{
new b=GetPVarInt(playerid,"InBiz");
new bi=bInfo[b][bInterior];
if(IsPlayerInRangeOfPoint(playerid,3.0,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]))
{
SetPlayerPos(playerid,bInfo[b][bX],bInfo[b][bY],bInfo[b][bZ]);
SetPlayerInterior(playerid,0);
SetPlayerVirtualWorld(playerid,0);
SetPVarInt(playerid,"InBiz",-1);
return 1;
}
}
else
{
for(new b;b<sizeof(bInfo);b++)
{
printf("A: %d",b);
if(IsPlayerInRangeOfPoint(playerid,5.0,bInfo[b][bX],bInfo[b][bY],bInfo[b][bZ]))
{
if(bInfo[b][biztype]==3)return SendClientMessage(playerid,-1,"Diesen BizTyp kannst du nicht betreten!");
new bi=bInfo[b][bInterior];
SetPlayerPos(playerid,BizInts[bi][IX],BizInts[bi][IY],BizInts[bi][IZ]);
SetPlayerInterior(playerid,BizInts[bi][Interior]);
SetPlayerVirtualWorld(playerid,BizInts[bi][Welt]);
SetPVarInt(playerid,"InBiz",b);
new string[250];
format(string,sizeof(string),"Binfo Interior: %d | BizInfo Y: %f | BizInfo Interior: %d",bi,BizInts[bi][IY],BizInts[bi][Interior]);
printf(string);
return 1;
}
}
}
}
return 1;
}
Alles anzeigen
Zu deiner 2. Frage naja, was heißt Fehler, es ist halt komplett unnötig, du verwendest ja diese Dinge nicht.
Solltest du so schreiben:
stock const Float:SAHSpawn[][] =
{
{770.2623,-1360.5071,13.4866,90.3064}, // 1
{769.7510,-1364.0002,13.4859,89.2629}, // 2
{769.6163,-1367.4791,13.4856,89.5874}, // 3
{769.5392,-1370.8284,13.4845,89.2213}, // 4
{769.7069,-1374.3871,13.4850,89.7537}, // 5
{769.9338,-1378.0271,13.4861,89.0365}, // 6
{769.6988,-1381.5538,13.4854,89.0018}, // 7
{758.9918,-1381.4570,13.4671,270.7707}, // 8
{758.7995,-1378.0237,13.4667,269.7128}, // 9
{759.1549,-1374.4269,13.4650,268.9954}, // 10
{758.9277,-1370.9075,13.4665,268.7696}, // 11
{759.0135,-1367.4722,13.4659,269.2463}, // 12
{758.9769,-1363.9332,13.4660,270.8068}, // 13
{758.6721,-1360.5215,13.4664,269.2405} // 14
};
Alles anzeigen
Diese 15 bezieht sich übrigens nicht auf die Anzahl der Einträge, sondern auf die Länge.
Sprich du hast X, Y, Z, A, aber da sagst du nein, du hast nicht 4, sondern 15. Der Ganze Rest ist halt 0.
Du hast nicht richtig gelesen.
Das startet nur die Generierung.
Du musst dass dann im Callback zuweisen.
//Da du noch d als Parameter hast, musst du den noch übergeben:
SetPVarInt(playerid,"_tmp_veh",d);
StartGenerateUniqueRandomNumber(playerid, handle, NUMBER_PLATE_POOL, 0);
//Im Callback OnRandomNumberGenerated
public OnRandomNumberGenerated(playerid, const pool, const token, const status)
{
if(status == -1) return printf("Der Random Pool (%d), ist leer!",pool);
switch(pool)
{
case SMALL_EXAMPLE_POOL:
{
switch(token)
{
case 0:
{
new d = GetPVarInt(playerid,"_tmp_veh");
DeletePVar(playerid, "_tmp_veh");
PCar[playerid][d][P_KZ] = status;
//Und dann hier eine Funktion aufrufen, wo es weiter gehen soll :)
}
}
}
}
return 1;
}
Alles anzeigen
Das ist asynchron, so wie eben ein mysql Query.
Habe ich ja oben alles erklärt ![]()