Gibt es irgendeine simple Moeglichkeit um zu schauen ob der Spieler am skydiven ist?
Nützliche Codeschnipsel - IsPlayerSkydiving
Was hat es mit "for(;;)" auf sich?
Das ist eine Endlosschleife bis zum break.
Gleich wie while(true) vom Prinzip.
Gibt es irgendeine simple Moeglichkeit um zu schauen ob der Spieler am skydiven ist?
Nützliche Codeschnipsel - IsPlayerSkydiving
Was hat es mit "for(;;)" auf sich?
Das ist eine Endlosschleife bis zum break.
Gleich wie while(true) vom Prinzip.
Der X Wert ist die Position PLUS die Größe des nach rechts anklickbaren Bereiches. Der Y Wert ist die geschätzte Höhe.
Angenommen du erstellst dein Textdraw bei X = 120 und Y = 90. Dann machst du den Text "Hallo Welt" da rein. Sagen wir, der Text ist so groß, dass er in etwa über ein Zehntel deines Bildschirmes geht (musst du abschätzen, oder mit einem Lineal abmessen), dann heißt das 640 durch 10, das wäre 64. Somit ist PlayerTextDrawTextSize-X = 120 + 64 = 184.
Nun misst, bzw. schätzt, du die Höhe des Textdraws, sagen wir mal du bekommst den Text in etwa 20 mal untereinander hin, bis dein Bildschirm von oben nach unten voll damit wäre. Heißt also: 480 durch 20, das gibt 24. Somit wäre PlayerTextDrawTextSize-Y = 24.
In deinem Fall in etwa so:
PlayerTextDrawTextSize(playerid, Beenden[playerid], 374.0 + 50.0, 20.0);
Die 50 und 20 sind nur geschätzt. Das kann natürlich mehr/weniger sein. Passe es dann entsprechend an.
Da wird dann immer 0 ausgeben, außer die Health ist 1000.
So wäre es korrekt:
format(str,sizeof(str),"Der Zustand deines Fahrzeugs beträgt %i%%.",floatround((hp-250.0)/7.5));
Prüfe vor dem CreateObject:
if(!Blitzer[i][Erstellt]) continue;
So:
cache_get_field_content(0,"bangrund",sInfo[playerid][bangrund],dbhandle,32);
Sprich ohne Gleichzeichen und mit der Längenangabe hinten (eventuell anpassen).
Nutze dafür cache_get_field_content.
Das Problem ist, dass du es mit dem ersten Query erst setzt und dann wieder entfernst, mit dem zweiten Query.
Entferne den bangrund aus dem savePlayer, dann geht es.
Die Variable ist zu klein.
new query[128];
zu:
new query[256];
Bezüglich dem Skin:
Speichere ihn beim Login in einer Spieler-Variable und setze den Skin zusätzlich noch bei OnPlayerSpawn.
Ich nehme an, dass dein "normaler Adminrang" im Gamemode verwaltet wird.
Daher im Gamemode das hinzufügen:
forward getAdminLevel(playerid);
public getAdminLevel(playerid) return SpielerInfo[playerid][AdminLevel];
Die SpielerInfo Variable gegebenenfalls anpassen, wenn die AdminLevel Variable bei dir anders heißt.
Dann im Filterscript alle
if(!IsPlayerAdmin(playerid)) return SCM...
ändern zu:
if(CallRemoteFunction("getAdminLevel", "d", playerid) < 3) return SCM...
3 habe ich als Beispiel genommen, da hieße, dass man mindestens Admin Level 3 benötigt.
Grundsätzlich geht das.
Folgende Punkte solltest du dabei beachten:
format(string, sizeof(string), "SELECT * FROM `Settings` WHERE `pSetting` = '%d'", aSetting);
Zu
format(string, sizeof(string), "SELECT * FROM `Settings` WHERE `id` = '0'");
Deshalb das INSERT OR IGNORE Query zusammen mit einem primary key (id zum Beispiel).
Das wird dann nur ausgeführt, wenn die Zeile mit der id nicht existiert.
INSERT OR IGNORE INTO Settings VALUES (0, 0);
Die Tabelle hat dann zwei Spalten, einmal id als primary key und als zweites die pSetting.
Nutze INSERT OR IGNORE um nur einmal einen Wert einzufügen.
Beachten, dass es dazu einen primary key geben muss.
Beispiel siehe hier: stackoverflow.com/questions/2717590/sqlite-upsert-on-duplicate-key-update
Was ist daran falsch? Brauche ich fuer jeden Wert ne neue Variable?
Nein, das Problem ist die Vorbelegung des Arrays im stock.
Mache es so:
stock TeleportPlayerToRandomPosition(playerid)
{
new Float:Z;
new Float:rx1=((frandom((floatabs(MAP_WORLDBOUNDS[0][0]-MAP_WORLDBOUNDS[0][1])))+MAP_WORLDBOUNDS[0][1]));
new Float:ry2=((frandom((floatabs(MAP_WORLDBOUNDS[0][2]-MAP_WORLDBOUNDS[0][3])))+MAP_WORLDBOUNDS[0][3]));
MapAndreas_FindZ_For2DCoord(rx1,ry2,Z);
SetPlayerPos(playerid,rx1,ry2,Z);
}
Wird das savePlayer denn aufgerufen? Lasse dir das Query dort mal per Print ausgeben.
Also das heisst wenn ich das richtig verstehe, kann ich strcmp bei OnPlayerCommandText auch fuer jeden Command durch sscanf ersetzen?
Nein, das geht nicht.
Sscanf teilt ja nur den eingegeben String, es prüft nicht, welchen Text du eingegeben hast.
Wie kann ich das MapAndreas Include nutzen?
new Float:z;
MapAndreas_FindZ_For2DCoord(xCoord, yCoord, z);
SetPlayerPos(playerid, xCoord, yCoord, z);
Weiterhin eine andere Frage: Was fuer einen Return Wert hat sscanf?
0 wenn alle Parameter korrekt eingegeben werden.
Du kannst es dir auch per print ausgeben lassen.
printf("sscanf: %d", sscanf(params, "d", id));
Warum bringt das hier Errors?
Versuche
{ COLOR_GREY },
zu:
COLOR_GREY ,
Für alle natürlich.
Versuche
mysql_log(LOG_ALL);
Welche MySQL Version nutzt du denn?
Gerne! ![]()
Falls noch etwas sein sollte hoffe ich, dass ich dich einfach im Thread makieren wenn ich deine Hilfe benötigen sollte
Natürlich. Sobald ich dazu komme schaue i heute mir das Problem dann an.
ändern richtig?
Ja, die result Variable ist zu klein. Habe ich auch nicht drauf geachtet.