VehicleID setzen - Möglich?

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
  • Hallihallo meine lieben Brotfische :)


    Ich sitze gerade an meinem Car system da mein Tutorial system ja fast fertig ist bis auf einen kleinen fehler.. den ich aber noch beheben werde.. wenn ich die lösung finde.. :P
    ..


    Jetzt gerade habe ich es geschafft.. alle Cars die in einer mysql datenbank stehen auszulesen und zu spawnen beim serverstart.. ebenso kann ich auch cars in der db ingame abspeichern.. doch nun will ich mcih ans löschen machen..


    da ich, wenn ich ein Car lösche, will das auch in der mysql tabelle das car gelöscht wird muss ich ja beim lesen der fahrzeuge jedem fahrzeug eine feste ID zuweisen.. dies wird gemacht.. (VehicleID aus der Tabelle = spcar[Haltidecarid] = AddStaticVehicle [...] )
    jetzt will ich wissen.. wie ich diese ausgelesene Carid Auch fest auf dem server setzen kan.. sodass, wenn ich


    GetPlayerVehicleID(playerid)


    mache.. auch die VehicleID ausgelesen wird, wie sie auch in der Datenbank steht... hoffe ihr wisst wie ich das meine.. :/..


    Könnte mir da evtl. einer einen kleinen Tipp geben ?

  • Du könntest in der Datenbank jedem Auto eine feste ID zuweisen (auto_increment).
    Diese könntest du in eine Art von Streamer einbauen, denn dann kannst du ganz einfach die feste ID von der Datenbank nehmen.

  • Genau das hatte ich auch.. jedoch scheiterte es dann bei mir wieder beim löschen....


    Hier das CMD:


    dcmd_delcar(playerid,params[])
    {
    new Query[1024], cID, cVehi, cVehiMax;
    if(IsPlayerInAnyVehicle(playerid) == 1){
    if (sscanf(params, "")){
    return SendClientMessage(playerid, COLOR_GREY,"[SYSTEM] /delcar");
    }
    cVehi = GetPlayerVehicleID(playerid);
    format(Query, sizeof(Query),"SELECT * FROM `vehicles` WHERE VehicleID=%d", cVehi);
    mysql_query(Query);
    mysql_store_result();
    cVehiMax = mysql_num_rows();
    if(cVehiMax == 1){
    format(Query, sizeof(Query),"DELETE FROM `vehicles` WHERE VehicleID=%d", cVehi);
    mysql_query(Query);
    DestroyVehicle(spcar[cVehi]);
    printf("Del with Mysql");
    } else {
    DestroyVehicle(spcar[cVehi]);
    printf("Del ohne Mysql");
    }
    } else {
    if (sscanf(params, "i", cID)){
    return SendClientMessage(playerid, COLOR_GREY,"[SYSTEM] /delcar [CarID]");
    }
    format(Query, sizeof(Query),"SELECT * FROM `vehicles` WHERE VehicleID=%d", cID);
    mysql_query(Query);
    mysql_store_result();
    cVehiMax = mysql_num_rows();
    if(cVehiMax == 1){
    format(Query, sizeof(Query),"DELETE FROM `vehicles` WHERE VehicleID=%d", cID);
    mysql_query(Query);
    DestroyVehicle(spcar[cID]);
    } else {
    DestroyVehicle(spcar[cID]);
    }
    }
    DestroyVehicle(spcar[cID]);
    return 1;
    }




    // EDIT


    Habe jetzt erst Steam'S vorschlag verstanden.. und sofort durchgeführt.. :)
    Hat auf dem ersten Versuch funktioniert.. doch wenn ich nun ingame mit dem befehl /delcar z.B: VehicleID 3 lösche, dann verschieben sich wieder alle ID's und
    z.B. VehicleID 4 in DB ist dann ID 3 auf dem server.. hat jemand dafür eine lösung parat?


    Wäre sehr dankbar..


    Lg
    Radanua

    Einmal editiert, zuletzt von Radanua ()

  • Naja der Typ da oben meint Anfangs das Richtige, jedoch am Ende kam nur ein Döner heraus. Was du machen kannst ist eine eigene VehicleID Strukturierung zu bauen, welche aber nichts mit GetPlayerVehicleID zu tun hat, bedeutet man kann die Samp erzeugten Variablen "derzeit" noch nicht intern verändern. Es fehlen uns einfach die Funktionen bzw. die enum Strukturierung dazu (sofern ein enum überhaupt benützt wird in SAMP ^^).


    Also ein Beispiel wäre wie erfolgt im Anhang... Have Fun

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • Du kannst das Fahrzeug auch einfach in eine andere Virtualworld setzen und in der Datei abspeichern, dass das Fahrzeug "gelöscht" ist. Das Fahrzeug spawnt zwar immernoch, aber man sieht es nicht und es gibt keine ID-Verschiebung :)

  • Äh Haxler, wieso willst du unnötig die SAMP-Limits ausnutzen? ^^ Wenns ned notwendig ist, muss man es auch ned erstellen lassen.

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • In diese richtung wollte ich auch erst gehen.. doch dann habe ich in der wiki von denlimitierungen gelesen.. wie Templer schon gesagt hat..
    wenn der server, der in meiner wunschvorstellung schwebt online ist.. und gut besucht ist.. (evtl. 50 spieler mit jeder â 2 cars = 100 Cars +- 300 Fraktion/gang Cars) dann wird das limit schnell erschöpft sein bzw. der server an sich langsam.. und ressourcenfressend..
    für weitere vorschläge bin ich gerne offen.. denn das system vom templer ist noch nicht an mein niveou angelangt... dafür kann ich einfach noch zu wenig.. gibt immernoch einiges wo ich in der wiki am nachschlagen bin um das system zu verstehen.. aber das schaff ich schon.. :P


    lg
    radanua

  • Verwarnung finde ich sinnlos.. ich muss i-wie darauf aufmerksam machen das die von mir anscheinend angegebene lösung doch nicht so gut ist wie ich dachte.. nunja.. so ist das Schicksal..


    Back to Topic.. :!:


    Kannst du mir mal so im entferntesten sagen wie das System arbeiten soll? Ich kann mir das kaum vorstellen und verstehe nicht wirklich wie das gemeint ist..


    Code
    UpdateMysqlVehicleIDs System


    Soll das permanent die MySQL Car ID's Updaten ? Sodass CarID in DB = Server Car ID entspricht?
    Wenn ja, wie mache ich das bzw. kannst du mir einen Arbeitsverlauf der Funktion geben ?


    (Sprich kurz schriftlich niederlegen, wie das ganze abläft | bsp. 1. Server starten - 2. Vehicle Spawnen - 3. Db Car id mit Server car Id vergleichen etc.)



    Lg
    Radanua

  • Hi


    Ich hatte dieses Problem mit den ID´s bei meinem System auch (arbeite ebenfalls mit MySQL). Ich habe wirklich seeeehr lange versucht das Problem elegant zu lösen (damals hatte ich noch nicht so viele Kenntnisse wie heute :D). Ich habs aber geschafft. Habs in etwa so gemacht wie Haxler es gesagt hat. Wenn ich ein Car lösche kommt es in eine Virtuelle welt und ein parameter wird auf 1 gesetzt. Dort bleibt es aber nicht ewig. Beim erstellen wird abgerufen, welches car "gelöscht" ist. Dieses Fahrzeug wird dann gelöscht und mit den neuen daten wieder erstellt. So kam es bei mir bis jetzt noch nie zu einem Problem und ich hatte auch schon bestimmt 300 - 500 Fahrzeuge laggfrei aufm server. Also so viele rescourcen braucht das nit.


    MFG, Robdeflop®

  • kurz zusammengefasst...

    Car hinzufügen (Wenn ganz neue VehicleID)

    • SELECT * FROM Cars
    • mysql num rows = 0
    • GetPlayerVehicleID
    • Insert into car (vehicleid) values (getplayervehicleid)


    Car hinzufügen (Wenn VehicleID in DB steht)

    • select * from cars
    • mysql num rows = 1
    • Destroycar in interior
    • Select * from car where vehicleid = getplayervehicleid
    • mysql_num_rows != 0update car set koordinaten, modelid


    Car löschen

    • GetplayerVehicleID
    • Upate Car Set del=1
    • LinkVehicleToInterior


    So alles nach der Theroie richtig?


    // EDIT
    Stelle gerade fest.. das diese methode bei mir auch nichts bringt.. :/
    Denn ich Spawne meine Cars nach folgendem Prinzip..
    - /car [CarID]
    - /savecarspawn (IsPlayerInVehicle == 1)
    (- /delcar (Isplayerinvehicle or CarID))

    Einmal editiert, zuletzt von Radanua ()

  • stock CreateServerVehicle(id,model,Float:x,Float:y,Float:z,Float:R,c1,c2)


    Das ist eine Methode aus meinem Script, welche ich für dieses Problem benutzt habe.
    Ich hab mir Templers Lösung nicht angeschaut, aber ich denke mal, dass er durch die enum Struktur ebenfalls für jedes Auto, unabhängig von der "normalen" Carid, eine feste Carid zuweist, welche sich nicht ändert, egal welche normale carid das Fahrzeug hat.
    Das mache ich zumindest so und es funktioniert, dafür ist der Übergabeparameter "id".


    machste zB so.


    enum e_Cars{
    Car_ID
    }
    new Cars[MAX_VEHICLES][e_Cars];


    und bei der Erstellung setze halt Car_ID immer auf nen anderen Wert für jedes Fahrzeug, damit du immer nur eine zusätzliche feste carid hast.
    Diese speicherst du ebenfalls in der Datenbank (nicht als auto increment, sondern zusätzlich als neue Spalte) und fragst anhand dieser id die fahrzeuge ab :)

  • super lösung!
    wirklich einfach .. kommt mir zumindest jetzt gerade noch so vor..


    stock VehicleSpawn(vehicleid)
    {
    new Str[67], vID, dModel, Float:VX, Float:VY, Float:VZ, Float:VA, vTotal;
    mysql_query("SELECT VehicleID,VehicleModel,VehicleX,VehicleY,VehicleZ,VehicleAngle FROM `cars` ORDER BY VehicleID ASC");
    mysql_store_result();
    vTotal = mysql_num_rows();
    if(vTotal > 0)
    {
    while(mysql_fetch_row(Str))
    {
    sscanf(Str, "p<|>iiffff", vID, dModel, VX, VY, VZ, VA);
    Cars[vehicleid][vID] = AddStaticVehicle(dModel, VX, VY, VZ, VA, -1, -1);
    }
    }
    printf("** %i\t<=>\tFahrzeuge geladen von\t<=>\tMySQL DB\t\t **", vTotal);
    return 1;
    }


    Dann müsste das Laden der Fahrzeuge im Printip so aussehen?

  • Ne. nicht ganz..


    [vID] soll von dir festgelegt werden, und nicht durch das Script.


    Also so wie du es machst, könnte sich vID beim ändern der Reihenfolge, z.B durch delete, verändern.


    Du solslt daher ne eigene CreateVehicle Funktion schreiben, wo du dann eine "FESTE" ID übergibst.

  • die vid wird auch nicht vom script festgelegt.. sie wird aus der datenbank ausgelesen .. ;)
    die ViD die in der DB steht, die wird manuell ingame festgelegt..


    Soweit verstanden und alles korrekt?

  • Ahh.. okay.. nein war mir nicht klar..
    ich dachte das heißt.. das in vehicleid die vehicleid gespeichert wird und in vID die id aus der Datenbank...
    und das man die beiden variablen dann i-wie voneinander teilen kann.. sodas man dann.. ganz simpel sagen das vehicleID zu vID gehört.. hmm.. dann ist mir die anwendung dieses nicht klar..
    könnte mir das einer erklären ? :wacko:



    // EDIT:
    Ich schaffe das einfach nicht.. und habe bisher auch noch kein richtiges tutorial gesehen.. in dem mir erklärt wird, wie ich die ID verschiebung wirklich gezielt verhindern kann.. ich bastel da jetzt schon so lange dran und kam immer noch nicht zu einer lösung... bitte um hilfe.. wie ich ein car in der datenbdank speichern kann und dann wieder auslesen kann bzw. auch löschen kann ohne das eine ID verschiebung statt findet...


    lg
    radanua

    Einmal editiert, zuletzt von Radanua ()

  • Nein 8D ^^ Nicht vID bekommt die ID von CreateVehicle zugewiesen, sondern die Variable Cars ^^

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • Ne der Speicherplatz vID @ Templer :)
    Halt ein bestimmter Platz des 2D Arrays Cars, sagen wir es so ;)


    Zitat

    CreateVehicle zugewiesen


    AddStaticVehicle ;)


    Radanua, wo besteht denn das Problem? Du brauchst nur ne eigene Funktion, egal ob die jetzt das Auto erstellt, oder nur für das letzterstellte Auto ne eindeutige ID zuweist.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen