Beiträge von Hagi

    Table in der MYSQL:

    Code
    CREATE TABLE IF NOT EXISTS `fahrzeuge` (
      `id` int(4) NOT NULL AUTO_INCREMENT,
      `spieler` varchar(24) NOT NULL,
      `model` int(4) NOT NULL,
      `xPos` float NOT NULL,
      `yPos` float NOT NULL,
      `zPos` float NOT NULL,
      `angle` float NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


    Im Grunde heißt es fürs Script erstmal nur: "Nutze nicht deine stock Funktionen zum auslesen von Werten (zumindest nicht in dieser Situation)
    Ich würde das so machen (mit Strickenkid, ka ob du BlueG benutzt)



    stock LoadPlayerVehicle(playerid)
    {
    new query[128],playername[24];
    GetPlayerName(playerid,playername,sizeof(playername);
    format(query,sizeof(query),"SELECT * FROM `fahrzeuge` WHERE `besitzer` = 's'",playername);
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows() == 0) return 1; // keine Fahrzeuge da
    new data[64];
    while(mysql_fetch_row(data))
    {
    new field[12 /*erhöhen wenn mehr Attribute in der MYSQL Table stehen*/][32];
    spliter(data, field, '|');

    // in field[0] steht nun das erste Attribut aus der MYSQL, das brauchen wir nicht, da es die Identifikation des Tupels ist
    // in field[1] steht der Spielername. Den brauchen wir auch nicht, da wir ihn schon kennen
    // alle weiteren Fields sind Parameter des Autos und werden benötigt. Diese liegen hier erstmal als String vor, müssen also wenn sie als Integer benötigt werden gecastet werden (strval(field[]) oder wenn als Float( floatstr(field[])
    // nach obigem Tabellenansatz ergibt sich folgendes:
    new veh = CreateVehicle(strval(field[2]),floatstr(field[3]),floatstr(field[4]),floatstr(field[5]),floatstr(field[6]).....);
    // mit veh kannst du jetzt weiterarbeiten und z.B. auch das Nummernschild setzen, den besitzer setzen (mit nem Array fbesitzer[MAX_VEHICLES])
    }
    }
    edit: die spliter Funktion:
    stock spliter(const strsrc[], strdest[][], delimiter)
    {
    new i, li;
    new aNum;
    new len;
    while(i <= strlen(strsrc))
    {
    if(strsrc[i] == delimiter || i == strlen(strsrc))
    {
    len = strmid(strdest[aNum], strsrc, li, i, 128);
    strdest[aNum][len] = 0;
    li = i+1;
    aNum++;
    }
    i++;
    }
    return 1;
    }


    edit2: Du kannst natürlich auch erstmal alle Attribute in dein Array speichern:

    SpielerVehInfo[playerid][pvBesitzer] = playername
    SpielerVehInfo[playerid][pvModel] = floatstr(field[2]);
    SpielerVehInfo[playerid][pvPosX] = floatstr(field[3]);
    SpielerVehInfo[playerid][pvPosY] = floatstr(field[4]);
    SpielerVehInfo[playerid][pvPosZ] = floatstr(field[5]);
    SpielerVehInfo[playerid][pvPosA] = floatstr(field[6]);


    Wenn dich der Fehler noch interessiert:
    Die Sekunde ist kleiner gleich 9, eine Null wird vor die Sekunde gesetzt.
    Wenn jetzt die Minute (mini) aber auch kleiner gleich 9 ist wird der String überschrieben und nur vor die Minute eine Null geschrieben.

    Jaja immer die Sache mit dem Primärschlüssel :D


    Ich würde ein Relationenschema folgendermaßen aufbauen:


    Fahrzeuge = {Eintrag,Spieleridentifikation,Model,...}


    Das bietet die Möglichkeit, dass ein Spieler das exakt gleiche Auto besitzt, eventuell sogar das gleiche Kennzeichen. Sollte nämlich mal alles gleich sein und kein Attribut Eintrag o.Ä vorhanden sein, wird das Fahrzeug nicht erstellt.
    Die einzelnen Tupel unterscheiden sich nur durch den Primärschlüssel Eintrag, welcher durch Auto Increment hochgezählt werden kann.


    Aus deiner SpielerRelation kannst du z.B. den Namen oder auch eine ID (wenn du eine speicherst, aber Name dürfte einfacher sein) als Fremschlüssel für Fahrzeuge(Spieleridentifikation) nutzen.


    edit:
    Desweiteren würde ich keine Funktion wie
    mysql_GetFloat("privatfahrzeuge", "PosZ", "Besitzer", SpielerVehInfo[playerid][pvBesitzer]);
    nutzen, da diese meiner Meinung nach einfach zu steif sind. Man kann damit eigentlich nur bei Querys mit LIMIT 1 arbeiten.
    Anstattdessen mach den Query einfach in deine stock Funktion und lies alle Tupel via while oder for schleife aus.

    Gibt ne MYSQL Log?
    Vllt wird ja ein Query nicht korrekt ausgeführt.


    Ich gehe jetzt nicht von einem Scriptfehler aus, da es ja auf dem HomeServer läuft und demnach ja eigentlich alles richtig sein sollte.

    hm joa habs net davor gemacht, da man ja auch ohne start starten kann.


    So habs jetzt wieder davor gemacht, aber jetzt erkennt er /minimized natürlich nicht mehr


    Zitat

    TASKKILL /F /IM LCore.exe
    REM start /D "C:\Program Files\Logitech Gaming Software\" /MIN LCore.exe
    start "C:\Program Files\Logitech Gaming Software\LCore.exe" /minimized
    pause

    Ja für Fahrzeuge ist meiner Meinung nach die Lösung über SQL die eleganteste.
    Du speicherst die Autos in der Datenbank und ließt sie beim Laden des GM aus. Zwischendurch kannst du dann alle mal Update, damit dir durch nen Crash keine Daten verloren gehen.
    Wenn du ein Auto im Script hinzufügst, schreibst du das in die Datenbank.

    Bei Text funktioniert die mittlere Maustate natürlich nicht.
    Naja kann man jetzt einfügen oder auch lassen.
    Mir macht das nichts aus den Link über die entsprechende Funktion einzufügen.

    Function Dreckweg()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    new carid = GetPlayerVehicleID(i);
    if(!IsASweeper(carid)) continue;
    if(checkpointee[i] == 3)
    {
    SendClientMessage(i, COLOR_WHITE, "Limit Erreicht");
    continue;
    }
    for(int o = 0;o<sizeof(Muell);o++)
    {
    if(IsPlayerInRangeOfPoint(i,5.0,Muell[o][XPos],Muell[o][YPos],Muell[o][ZPos])
    {
    DestroyObject(muellobject[o]);
    checkpointee[i]++;
    new string[64];
    format(string,sizeof(string),"%d Dreck weggeräumt",checkpointee[i]);
    SendClientMessage(i,color,string);
    }
    }
    }
    return 1;
    }


    Ich habs mal Sinngemäß angepasst. Hoffe ich zumindest.

    Wir hatten die Funktion doch umbenannt?


    public PremiumFahrzeuge(vehicleid)


    -->


    if(PremiumFahrzeuge(GetPlayerVehicleID(playerid)))