Beiträge von Douq

    Also ich empfehle ich dir fraktion umbenennen, in irgendetwas wie fraktionid oder frakid, weil das später, oder auch für andere Entwickler, sehr verwirrend sein kann. Ob A_I jetzt so zwingend notwendig ist weiß ich jetzt auch nicht, das kommt halt immer auf den Anwendungsbereich drauf an.


    Mit der Fraktionskammer ist es eigentlich (in meinen Augen) einfacher, als mit Autos: Du lädst unter OnGameModeInit() sämtliche Daten innerhalb der Tabelle (einfacher SELECT * FROM frakkammer), weist per cache_* den einzelnen Variablen die richtigen Werte zu und nutzt dann die Variablen in deinen Befehlen, z.B. fraktionkammer[2][frakdrugs] -= 10; zieht 10 Drogen der Fraktion ab, die im Index 2 verwaltet wird.


    Dann hast du die Möglichkeit, nach jeder Veränderung der Variable die jeweilige Information zu speichern, in einem bestimmten Intervall zu speichern, oder manuell per Befehl oder eben OnGameModeExit().

    Hey, mein Haussystem spinnt. Es werden 200 Häuser erstellt(MAX_HOUSE Wert). Kann mir einer erklären warum?
    @Jeffry


    ocmd:chouse(playerid, params[]){new price, interior, typ;if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN);if(sscanf(params,"ddd",price,interior,typ))return SCM(playerid, -1, "Tippe: /chouse [price] [interior] [typ]");for(new i=0; i<MAX_HOUSE; i++){if(strval(hInfo[i][house_id])) continue;new Float:x, Float:y, Float:z, string[64], string2[MAX_PLAYER_NAME], query[512];GetPlayerPos(playerid, x, y, z);format(string,sizeof(string), "Zum verkauf");format(string2,sizeof(string2), "Niemand");hInfo[i][house_id] = i;hInfo[i][house_owner] = string2;hInfo[i][house_description] = string;hInfo[i][house_price] = price;hInfo[i][house_interior] = interior;hInfo[i][house_typ] = typ;hInfo[i][house_x] = x;hInfo[i][house_y] = y;hInfo[i][house_z] = z;format(query, sizeof(query), "INSERT INTO houses (id, owner, description, price, interior, posx, posy, posz, typ) VALUES ('%d', '%s', '%s', '%d', '%d', '%f', '%f', '%f', '%d')",i, hInfo[i][house_owner], hInfo[i][house_description], hInfo[i][house_price], hInfo[i][house_interior], hInfo[i][house_x], hInfo[i][house_y], hInfo[i][house_z], hInfo[i][house_typ]);mysql_tquery(handle, query);format(string,sizeof(string), "Du hast erfolgreich das Haus(ID: %d) erstellt.",i);printf("%s", query);SCM(playerid, BABYBLAU, string);}return 1;}

    Erst einmal solltest du bei einer Schleife, wenn du nur ein Haus erstellen willst (wie auch Kaliber bereits meinte), die Schleife durch ein return oder break beenden, sonst durchläuft der die komplette Schleife, auch wenn bereits ein Haus erstellt wurde (-> ergibt keinen Sinn).


    Zweitens meint er, dass deine Prämisse keinen Sinn ergibt, die du dort angibst innerhalb der Schleife. Du überprüfst lediglich, ob der Wert eine Zahl ist, sonst nichts. Fraglich ist für mich auch, was es bringt einer Variable einen Index zuzuweisen, auf welche du nur zugreifen kannst, wenn du eh den Index brauchst.


    Du kannst entweder eine Variable hinzufügen (z.B. boolean), die auf true setzen wenn ein Slot / Index belegt ist und diese als Bedingung nutzen, oder eben einen Default Wert beim Besitzer setzen und ermitteln, ob dieser gegeben ist oder nicht.

    Wie hole ich im MySQL plugin R39-5 von BlueG im mysql_tquery()-Callback die Felder eines mit diesem Callback verbundenen INSERT-Queries?
    Dass ich die ID bspw. mit cache_insert_id() hole, ist mir bekannt. Ich könnte also theoretisch einfach mit der einen neuen Query senden, der dann die Daten holt. Ebenso könnte ich dem Callback auch einfach die Daten übergeben. Beides möchte ich aber vermeiden.
    Gibt es also eine Möglichkeit, die direkt im Callback des INSERT-Queries zu laden?


    Danke im Voraus.

    Also du möchtest einen Datensatz erstellen und beim Funktionsaufruf die Daten, die du übermittelt hast, direkt wieder verwenden? Funktionieren die anderen cache_* Funktionen denn nicht? Ansonsten sollte es da keine (mir bekannte) Möglichkeit geben, das abzuwickeln. Welchen Verwendungszweck soll das denn erfüllen? Eventuell kann man da einen anderen Lösungsansatz finden -> eventuell sind PVars o.ä. interessant?


    Hay.


    Also. Ich will es so ungefähr haben: Spieler spawnt (Nur wenn 2 Spieler on sind) er muss ca. 10 sekunden warten und spawnt dann in eine andere virtuelle Welt da spawn anschließend Fahrzeuge.

    Du hast eine Variable, die Spieleranzahl, die immer +1 gerechnet wird, wenn ein Spieler beitritt. Sollte diese gleich zwei sein, erstellst du einen Timer mit einem Intervall von 1000*10, welcher dann eine Funktion aufruft, der alle Spieler durchgeht und setzt deren virtuelle Welt + ersetellst Fahrzeuge. Falls nicht alle Spieler, die auf dem Server sind, in eine andere virtuelle Welt gesetzt werden soll, musst du bei der Schleife noch eine Bedingung hinzufügen.

    Und siehe da, es steht im Log und deshalb fährt der Server hinunter.
    Offensichtlich ist etwas mit den Daten falsch.


    Ich glaube mich zu erinnern, dass das Passwort nicht leer sein darf bei SA:MP.
    Also erstelle im PHPMyAdmin Panel o.ä. einen neuen Benutzer mit Passwort und verwende diese Daten :)

    Das PlugIn von BlueG hat keine Probleme mit einem Verbindungsaufbau ohne Passwort (sofern der Benutzer kein Passwort festgelegt hat).


    Als Host trag mal 127.0.0.1 an und stell das Debug level auf ALL (siehe Code, direkt vor mysql_connect hinzufügen). Starte den Server neu und zeige uns deinen mysql log.

    Code
    mysql_log(ALL);

    Ja das schon, aber man kann doch einfach jetzt mal ein cut machen und fertig, jedes Jahr ein neues Fifa, das ist doch schwachsinn. Jetzt kommen bestimmt wieder welche die sagen BF 3 & co. sind auch gleich. Wobei man aber dann die Fahrzeuge etc. betrachten muss.

    Jedes Jahr ein neues FIFA ist keinesfalls Schwachsinn. Zum einen muss FIFA jedes Jahr die Lizenzen bezahlen, zum anderen erfolgen auch jährlich Neuerungen und Änderungen.


    Als Laie wirkt es sicherlich nicht so, aber die Änderungen sind spürbar.

    @The Sensei


    Das bedeutet, dass deine Spaltenanzahl nicht der Anzahl deiner Werte entspricht. Du gibst 16 Spalten an, aber lediglich 14 Parameter für Werte.


    Der andere Fehler ist, dass du wahrscheinlich einen Array sprengst.


    Beispiel:
    Dein Array: array[5]


    Du kannst also auf den Index 0-4 zu greifen. Möchtest du nun beispielsweise auf den Index 6 zu greifen, sprengst du den Array. Solche Fehler können dir aber auch durch die Verwendung von crashdetect gezeigt werden

    Hey,
    irgendjemand eine Idee, warum mir immer angezeigt wird. /cfraktion [name] bla bla bla?
    Keine Warnings oder Errors.
    ocmd:cfraktion(playerid, params[]){new fname[256],query[256],fshortname[64],string[256],skinid,typ,cop,farbcode[64];if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN);if(sscanf(params,"s[256]s[16]ddds[56]",fname,fshortname,typ,cop,skinid,farbcode))return SCM(playerid, -1, "Tippe: /cfraktion [name] [abkürzung] [typ 0=Neutral 1=Staat] [cop 0=Nein 1=Ja] [leaderskin-id] [farbcode(HTML)]");for(new i=0; i<MAX_FRAC; i++){new Float:x, Float:y, Float:z, Float:r, interior, visualworld;GetPlayerPos(playerid, x, y, z);GetPlayerFacingAngle(playerid, r);interior = GetPlayerInterior(playerid);visualworld = GetPlayerVirtualWorld(playerid);fInfo[i][fid] = i;fInfo[i][f_name] = fname;fInfo[i][f_shortname] = fshortname;fInfo[i][f_x] = x;fInfo[i][f_y] = y;fInfo[i][f_z] = z;fInfo[i][f_r] = r;fInfo[i][f_inter] = interior;fInfo[i][f_world] = visualworld;fInfo[i][f_typ] = typ;fInfo[i][f_cop] = cop;fInfo[i][f_leaderskin] = skinid;fInfo[i][f_kasse] = 0;fInfo[i][f_mats] = 0;fInfo[i][f_drogen] = 0;fInfo[i][f_color] = farbcode;format(query, sizeof(query), "INSERT INTO Fractions (FID, Name, Shortname, X, Y, Z, R, Inter, World, Typ, Cop, Leaderskin, Kasse, Mats, Drogen, Color) VALUES ('%d', '%s', '%s', '%f', '%f', '%f', '%f', '%d', '%d', '%d', '%d', '%d', '%d', '%s')",i, fInfo[i][f_name], fInfo[i][f_shortname], fInfo[i][f_x], fInfo[i][f_y], fInfo[i][f_z], fInfo[i][f_r], fInfo[i][f_inter], fInfo[i][f_world], fInfo[i][f_typ], fInfo[i][f_cop], fInfo[i][f_leaderskin], fInfo[i][f_kasse], fInfo[i][f_mats], fInfo[i][f_drogen], fInfo[i][f_color]); format(string,sizeof(string), "Du hast erfolgreich die Fraktion %s(F-ID: %d) erstellt.", fname, i);mysql_tquery(handle, query);SCM(playerid, BABYBLAU, string);}return 1;}

    Erhöh die Länge deines Querys auf 512 o.ä. Sollte das immer noch nicht klappen, lass dir den Query per printf() ausgeben und führe in manuell durch, dann solltest du einen aufschlussreichen Fehlercode bekommen

    Hallo,


    ich könnte mir vorstellen, dass du eine ID Verschiebung verursacht beziehungsweise deine CreatePlayerObject() mit dem Streamer kollidiert (soweit ich weiß, greift dieser nämlich auch auf diese Funktion zu). In Zeile 32 überprüfst du, ob die Z Koordinarte < 127.0 ist und bewegst diese dann.


    In Zeile 75 - 77 setzt du X, Y und Z auf 0.0 und löscht das Objekt. In der Variable ist aber weiterhin die alte ID des Objektes vorhanden. IDs bei Objekten werden prinzipiell immer wieder vergeben, sofern sie frei sind -> CreateDynamicObject() vergibt also die gleiche ID wieder. Da nun deine Abfrage in Zeile 32 wahr ist (die Z Koordinate ist 0.0, also kleiner als 127.0) wird das Objekt bewegt und als Koordinaten der 0 Punkt anvisiert, da du ja in Zeile 75 - 77 die Koordinaten auf 0.0 setzt.


    Mein Tipp:
    Ergänze die Abfrage in Zeile 32 mit

    Code
    if(Weizen[i][w][w_Z] < 127.00 && Weizen[i][w][w_Objekt] != INVALID_OBJECT_ID)


    und füge unter Zeile 74 folgendes hinzu:


    Code
    Weizen[i][w][w_Objekt] = INVALID_OBJECT_ID;


    Das ist zwar alles ziemlich tricky in meinen Augen und ein ziemlich gemeiner Fehler, könnte aber rein theoretisch die Lösung deines Problemes sein.

    Dafür muss man kurz laienhaft die Vorgehensweise von sscanf erklären:


    sscanf überprüft deine Angaben nach den jeweiligen Datentypen, die du angegeben hast und teilt deine Eingaben anhand von Leerzeichen. Wenn du nun angibst, eine userID, string und eine Zahl zu übermitteln, macht sscanf folgendes


    /befehl 0(userID)|Darum(string)|2(Zahl)


    Um das zu verhindern, solltest du den string stets als letzten Parameter angeben -> dann wird diese Mechanik eben nicht mehr ausgelöst, da kein weiterer Parameter mehr erwartet wird und dementsprechend keine Teilung mehr erfolgt.


    Code
    if(sscanf(params, "uis[128]", pID,,dauer, grund))return SendClientMessage(playerid, 0xFF004BFF, "/tban [ID] [Dauer] [Grund]");

    Also wenn das normale Grand Larency geladen wird, musst du erst einmal die server.cfg anpassen und den Namen des gamemodes unter gamemode0 (o.ä.) editieren.

    Um die Problematik einmal darzustellen:


    Der SQL Server erwartet, dass nur Spaltenbezeichnungen innerhalb von Gravis (`) enthalten sind, du nutzt dieses Zeichen jedoch auch bei den letzten drei Werten. Einfach den Gravis mit einem Hochkomma ersetzen, und der Query sollte ausgeführt werden.

    @Douq Ich hab irgendwie keinen Plan :/ ich meinte doch das die Fahrzeuge gelöscht werden sollen wenn er Disconnectet aber ich versteh immer noch nicht wie ich das ausführe ?(

    Das Fahrzeug löschen kannst du per DestroyVehicle(). Als Parameter musst du dann die gewünschte vehicleid vom Fahrzeug angeben. Ich weiß jetzt nicht wie du derzeit die Fahrzeuge erstellst, aber wenn du sie beispielsweise so erstellst:


    cInfo[ i ][cvehicleid] = CreateVehicle()


    nutzt du einfach innerhalb der Schleife:
    DestroyVehicle(cInfo[ i ][cvehicleid]);

    SetTimerEx() kann global nicht verwendet werden, sondern nur innerhalb einer Funktion. textid existiert nirgends, sprich wurde nicht definiert. Das musst du eben mit dem Namen der Variable ändern, in welcher die textdrawID enthalten ist.

    Wie lasse ich die Fahrzeuge jetzt laden?


    public OnPlayerDisconnect(playerid, reason){ for(new i=0; i<sizeof(cInfo); i++) { if(cInfo[i][id_x]==0)continue; if(cInfo[i][besitzer]!=PlayerInfo[playerid][p_id])continue; new query[128]; format(query,sizeof(query),"UPDATE autos SET x='%f',y='%f',z='%f',r='%f' WHERE id='%i'",cInfo[i][c_x],cInfo[i][c_y],cInfo[i][c_z],cInfo[i][c_r],cInfo[i][db_id]); } if(IsPlayerNPC(playerid)) return 1; aduty[playerid]=false; KillTimer(Payday[playerid]); SaveUserStats(playerid); return 1;}


    Bin ziemlich neu im Gebiet MySQL und ich weiß nicht wie ich die Query ausführen soll :/

    Das Tutorial von Jeffry kann dir da sicherlich behilflich sein:
    [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-5

    Möchtest du es speichern oder in die Datenbank einpflegen? Weil durch den Query wird kein Datensatz aktualisiert, sondern ein neuer erstellt. Sonst nutze einfach mal den debug Modus und schau, welche Fehlermeldung dir zurückgegeben wird. Zusätzlich kannst du dir mal den Query per printf() ausgeben lassen und diesen manuell ausführen (bspw per phpMyAdmin).