[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hab mir ein dynamisches Autohaus System gescriptet, Problem ist wenn man ein Autohaus-Vehikel betritt returnt es die falsche Daten, zb anstatt die Modell ID vom Infernus die von den anderem Vehikel, auch 0 bei den Vehikeln.


    Hier paar Systeme, wo ich nicht weiß wo ein Fehler ist:

    new DealerShipCarInfo[MAX_VEHICLES][dccEnum];



    new vehicleid;
    for(new i = 0; i < rows; i ++)
    {
    DealerShipCarInfo[vehicleid][dcCarExists] = 1;
    cache_get_value_name_int(i, "id", DealerShipCarInfo[vehicleid][dcInsertID]);
    cache_get_value_name_int(i, "dealershipid", DealerShipCarInfo[vehicleid][dcCarOwner]);
    cache_get_value_name_int(i, "model", DealerShipCarInfo[vehicleid][dcModel]);
    cache_get_value_name_int(i, "price", DealerShipCarInfo[vehicleid][dcModelPrice]);
    cache_get_value_name_float(i, "pos_x", DealerShipCarInfo[vehicleid][dcModelPosX]);
    cache_get_value_name_float(i, "pos_y", DealerShipCarInfo[vehicleid][dcModelPosY]);
    cache_get_value_name_float(i, "pos_z", DealerShipCarInfo[vehicleid][dcModelPosZ]);
    cache_get_value_name_float(i, "pos_a", DealerShipCarInfo[vehicleid][dcModelPosA]);
    vehicleid = CreateVehicle(DealerShipCarInfo[vehicleid][dcModel], DealerShipCarInfo[vehicleid][dcModelPosX], DealerShipCarInfo[vehicleid][dcModelPosY], DealerShipCarInfo[vehicleid][dcModelPosZ], DealerShipCarInfo[vehicleid][dcModelPosA], 0, 0, -1);
    dcVehicle{vehicleid} = true;


    }



    forward OnDealerShipVehCreated(dealershipid, model, price, Float:x, Float:y, Float:z, Float:angle);
    public OnDealerShipVehCreated(dealershipid, model, price, Float:x, Float:y, Float:z, Float:angle)
    {
    new vehicleid;
    vehicleid = CreateVehicle(model, x, y, z, angle, 0, 0, -1);
    dcVehicle{vehicleid} = true;
    DealerShipCarInfo[vehicleid][dcInsertID] = cache_insert_id();
    DealerShipCarInfo[vehicleid][dcCarOwner] = dealershipid;
    DealerShipCarInfo[vehicleid][dcModel] = model;
    DealerShipCarInfo[vehicleid][dcModelPrice] = price;
    DealerShipCarInfo[vehicleid][dcModelPosX] = x;
    DealerShipCarInfo[vehicleid][dcModelPosY] = y;
    DealerShipCarInfo[vehicleid][dcModelPosZ] = z;
    DealerShipCarInfo[vehicleid][dcModelPosA] = angle;
    return 1;
    }

  • @FutureStunt


    Wenn ich das richtig interpretierte verwendest du "vehicleid" in deinem zweiten Quellcode-Ausschnitt, bevor das Fahrzeug mit "CreateVehicle" erstellt wurde. Damit werden die Daten aus der Datenbank immer in "DealerShipCarInfo[0][...]" geladen.

    Kann nicht sein, da das bei meinen anderem System mit Vehikeln funktioniert.

  • Beitrag von FutureStunt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: gelöst ().
  • ähhhh stehe gerade bissn aufm Schlauch
    Warum geht der Code nicht ? :D


    @Jeffry:
    @Kaliber:
    Geht sowas noch ?

  • @reaL.


    Weil du den Cache erst in einem Callback auswerten lassen kannst.
    Aber noch vorab, du brauchst bei einer zweiseitigen Abfrage, kein return verwenden.
    Weil er wird bei dieser Abfrage Methode nicht das andere von beiden auch noch ausführen.


    Daher schreibe es mal so:

    new query[128];
    mysql_format(handle, query, sizeof(query), "SELECT ID FROM Accounts WHERE Name = '%e'", Name),
    mysql_pquery(handle, query, "Callback", "d", playerid); //d oder i für einen runden Zahlenwert


    forward Callback(playerid); //Kann beliebig umbenannt werden
    public Callback(playerid)
    {
    new rows;
    cache_get_row_count(rows);
    if(rows == 0)
    {
    }
    else
    {
    }
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Nutze doch bitte die PAWN Box für solch Quellcodes, danke!
    Ja, also.. ich nehme an dass du die soweit die neuste Version von BlueG nutzt, so wie fast jeder heutzutage.
    Von daher, wird das so nicht funktionieren.
    Schicke anstatt deinem Funktionsaufruf, einen Query mit einer Aufforderung an die Datenbank, eine Spalte zu markieren unter wie folgtem Namen: "playername". In dem Callback, arbeitest du dann mit dem Cache der dir zur Verfügung steht.
    Früher ging das noch .. bei R5 habe ich das mal so angewendet mit mysql_num_rows(); unter der gleichen Funktion.
    Sprich, so wie ich es dir Oben geschickt habe.

  • Geht sowas noch ?

    Die Frage ist doch eher, sollte es so gemacht werden?


    Und die Antwort ist ganz klar nein.


    Das hat seine Gründe, wieso diese Asynchronität eingeführt wurde.


    Natürlich muss man jetzt etwas umdenken, weil man es davor gewohnt war synchron zu arbeiten.


    Du brauchst den Wert nicht, du kannst einfach den Code, der danach kommt in den Callback packen und ihn da weiter ausführen lassen.


    Und dort quasi den Wert verarbeiten lassen.


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Geht sowas noch ?

    Ja, es würde noch gehen, aber wie wie schon von den Vorrednern gesagt, ist es nicht zu empfehlen, außer man weiß zu 100% was man macht.
    Gehen würde es mit mysql_query.
    https://wiki.sa-mp.com/wiki/MySQL/R40#mysql_query


    Daher, wenn, dann nur mit Bedacht nutzen.
    Wenn in deinem Fall die Funktion nur aus einem (oder mehreren) Befehlen heraus, immer nur für einen Name verwendet wird, dann könnte man das durchgehen lassen, weil es den Aufbau vom Code natürlich deutlich einfacher und übersichtlicher macht, als wenn man bei 20 Befehlen 20 unterschiedliche Callbacks macht, oder alles in eins mit switch packt.
    Wichtig ist auf jeden Fall, cache_delete() danach zu nutzen.

  • Ist das Zurücksetzten von PVar's beim Ausloggen bzw. Connecten eigentlich nötig? Diese werden ja nicht gespeichert.. Habe jedoch schon in einigen Scripts gesehen, dass das so gemacht wurde.

  • Bekomme folgenden Error: script.pwn(34) : error 029: invalid expression, assumed zero


    Hier die Zeile im Script:


    mysql_log(LOG_ALL);else print(">> [MYSQL]: Die Verbindung zur Datenbank konnte NICHT erfolreich hergestellt werden. Der Server wird nun heruntergefahren."),
    SendRconCommand("exit");

    • Offizieller Beitrag

    Ein bisschen Mehr Code außenrum würde nicht schaden, du kannst zudem dem PWN Tag auch eine Startzeilennummer angeben, bspw


    [pwn=43]
    public OnPlayerDeath(playerid, killerid, reason)
    {
    return 1;
    }


    SetupPlayerForClassSelection(playerid)
    {
    SetPlayerInterior(playerid,14);
    SetPlayerPos(playerid,258.4893,-41.4008,1002.0234);
    SetPlayerFacingAngle(playerid, 270.0);
    SetPlayerCameraPos(playerid,256.0815,-43.0475,1004.0234);
    SetPlayerCameraLookAt(playerid,258.4893,-41.4008,1002.0234);
    }


    public OnPlayerRequestClass(playerid, classid)
    {
    SetupPlayerForClassSelection(playerid);
    return 1;
    }


    public OnGameModeInit()
    {
    SetGameModeText("Bare Script");
    ShowPlayerMarkers(1);
    ShowNameTags(1);
    AllowAdminTeleport(1);


    AddPlayerClass(265,1958.3783,1343.1572,15.3746,270.1425,0,0,0,0,-1,-1);


    return 1;
    }


    [/pwn]



    Einfach [pwn=43] schreiben

  • Oh sorry..


    [pwn=22]main()
    {


    }


    public OnGameModeInit()
    {
    SetGameModeText("The new Generation of Roleplay!");
    //MySQL Verbindung
    Handle=mysql_connect(mysql_host, mysql_user, mysql_data, mysql_pass);
    if(mysql_errno() < 1)print(">> [MYSQL]: Die Verbindung zur Datenbank wurde erfolgreich hergestellt.");
    mysql_log(LOG_ALL);else print(">> [MYSQL]: Die Verbindung zur Datenbank konnte NICHT erfolreich hergestellt werden. Der Server wird nun heruntergefahren."),
    SendRconCommand("exit");
    return 1;
    }


    public OnGameModeExit()
    {
    return 1;
    }


    public OnPlayerRequestClass(playerid, classid)
    {
    SetSpawnInfo(playerid,0,0,0,0,0,0,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    new nachricht[128];
    format(nachricht,sizeof(nachricht),"Du bist mit der ID %i verbunden.",playerid);
    SendClientMessage(playerid,COLOR_RED,nachricht);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    return 1;
    }[/pwn]