Beiträge von Mann im Mond

    stock VehicleToPoint(Float:radi, vehicleid, Float:x, Float:y, Float:z)
    {
    new Float:oldposx, Float:oldposy, Float:oldposz;
    new Float:tempposx, Float:tempposy, Float:tempposz;
    GetVehiclePos(vehicleid, oldposx, oldposy, oldposz);
    tempposx = (oldposx -x);
    tempposy = (oldposy -y);
    tempposz = (oldposz -z);
    if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi))) return true;
    return false
    }


    Zitat

    der auch anders gesagt das if(Anhänger ist am zugfahrzeug){ dann tu etwas }


    IsTrailerAttachedToVehicle

    Es kommt auch drauf an, wenn du die Daten in die Datein schreibst... Brights Methode setzt nur die variable innerhalb des Scripts, schreibt aber nichts in die Datei um. Allerdings musst du nicht bei jedem aussteigen etwas in ne Datei schreiben, da würde viel zu oft etwas in ne Datei geschreiben

    Wie schon gesagt das ist sicherlich ansichtssache und es gibt genug Varianten den Besitzer zu überprüfen, ob jetzt über die CarID, den Namen oder nach deiner Variante...


    Zitat

    mit dem richtigen system brauch meine keine einzige id raus zu suchen xD ich hab noch nie ein befehl wie "oldcar" benutzt und in meinem script hat jeder spieler mehrere eigene autos die spawnen wenn er aufn server kommt und zerstört werden wenn er runter geht.


    Den alten Car des Spielers rauszufinden ist auch bei der ID Methode nicht notwendig. Nach deiner Methode, dass Autos erst bei Connect spawnwn und bei Disconnect verschwinden, ist natürlich die ID Möglichkeit nicht möglich, wenn die Autos allerdings die gleiche Zeit stehen bleiben sollen (ich denke für Roleplay Server am angesprachtesten, dann so auch wieder mehr Möglichkeiten entstehen (Klauen usw.)) dann brqaucht man keine Angst vor der ID Verschiebug haben und wie oben schon gesagt ist das mit DestoryVehicle und Nachdenken auch kein Problem. Mir ist es persönlich egal, was wer benutzt, ich wollte nur noch ne Möglichkeit aufzählen mit der man die Ids genauso rausfinden kann - wie ICH finde eine einfache und zeitsparende Möglichkeit. Aber jeder soll es so machen, wie er am besten denkt, dass es für sein System am Besten ist

    Zitat

    ausserdem hab ich firmenautos in die auch nur angestellte kommen und ich hab nie eine id raus gesucht und keine angst vor id verschiebung.


    Das ist mit der ID Methode auch rein gar kein Problem, einfach eine Variable setzen, die das team speichert und dann beim Einsteigen diese Überprüfen lassen...
    Angst vor ID Verschiebung braucht man da auch nciht haben, wenn man das System entsprechend schreibt...
    Jede Methode hat seine Vor- und Nachteile, die Diskussion ist daher irgendwie sinnlos

    Zitat

    edit: es ist ziemlich blöd sich darauf zu verlassen dass die ids sich nicht ändern, wenn sie es dann doch mal tun hast du viiiiiiiiieeeeeeeeeel arbeit :D


    Es ist nicht selbstverständlich, dass sie nicht verrutschen, aber wenn mans richtig anstellt verrutschen sie nicht und alles hat seinen Platz. Na ja wie sollen Autops auch groß verrutschen, wenn du sie in der Datenbank hast und per Schleife am Anfang lädst. Wenn du natürlich DestroyVehicle anwenden willst, wird es ein wenig mehr Aufwand, aber auch machbar, aber wer braucht bei einem Autosystem schon ein Destroyvehicle. Einfach wieder zum verkaufen stellen reicht. Und nach dieser Methode sparst du
    1.) Zeit
    2.) ist es übersichtlicher, wenn die MySQL ID = carid ist
    3.) einfacher alles zu überprüfen und es zu pflegen
    4.) man spart sich die nervige Zuweisung
    Aber wie du schon sagtest ist sicherlich gewöhnungssache und beides hat seine Vorteile, aber es geht hier um was anderes


    Naja aber wie mache ich das, dass die ID´s nicht verrutschen? Und eigentlich würde ich eher nach dem Owner abfragen, nicht nach der ID. Nur man soll nach der ID suchen(notfalls nach dem owner) und der dini name soll die ID sein. Achso und noch was: wie frage ich ab welches bzw ob ein auto vor einem steht??????
    Nach dem Owner kannst du auch gehen, das wäre natürlich auch ein Weg, strcmp ist da dein Stichwort dann. Wenn du es per Owner machen willst trägst du den Owner in die Datei ein des bfahrzeugs und lädst den Namen in eine variable beim laden des Fahrzeugs. Diese kannst dann mit dem Namen des Spielers vergleichen (strcmp) und du weisst, dass er der Besitzer ist. Wies mit IDs geht hab ich oder Nacho schon oben gezeigt.
    Ein Fahrzeug in der Nähe kriegst du raus, indem du durch alle fahrzeuge schleifst und den Abstand jeweils miteinander vergleichst...

    Vielleicht meinst du das


    //--
    SetTimerEx("Funktion", 1000, 0, "i", playerid); // Funktion, Zeit, Repeating, Parameter


    // --
    public Funktion(playerid)
    {
    // Callback wird aufgerufen und Text an Spieler gesendet
    GameTextForPlayer(playerid,"Erfolg", 1500, 1);
    // Weitere Sachen, für alle musst du dann eine Schleife machen, z.B. wenn du allen Geld geben willst oder so
    }

    Das erleichert zwar einige Dinge, in diesem Fall braucht man aber nur die jeweilige Autoid, die normalerweise immer gleich bleibt, besonders wenn man einfach eine neue Tabelle erstellt in der Datenbank (MySqlID = Carid)...
    In deine "cars" Tabelle trägst du deine Autodaten ein (id, x, y, z, farbe1, farbe2, locked usw.) mit natürlich MySqlID = carid und in der "users" tabelle einfach einen Eintrag mit car, wobei car = Carid (= MysqlID des Autos in der Datenbank) ist... wie oben schon gemacht.
    Das Ganze natürlich ungefähr so ähnlich wie oben...

    Immer das Selbe, warum macht man sich die Mühe etwas zu beschreiben, wenn danach dann so eine Frage kommt, wenn du meien Post gelesen hättest, könntest du es problemlos auf dein "Problem" übertragen

    Das spielt doch keine Rolle. Wenn du die Autos einfach alle normal einfügst und deren Struktur nicht irgendwie veränderst, kannst du die CarID immer mit GetPlayerVehicleID bestimmen
    Beispiel
    // Oben, kannst auch in ein enum machen
    new
    pCarID[MAX_PLAYERS],
    bool:vOwned[MAX_VEHICLES];


    // OnPlayerConnect
    pCarID[playerid] = 0; // = kein Fahrzeug, da 0 keine gültige ID ist


    // Fahrzeugkauf
    if(GetPlayerState[playerid] != PLAYER_STATE_DRIVER) return 1;
    new
    carid = GetPlayerVehicleID(playerid);
    if(vOwned[carid]) return SendClientMessage(playerid, FARBE, "Fahrzeug ist besetzt");
    pCarID[playerid] = carid;
    vOwned[carid] = true;


    // Fahrzeugverkauf


    if(GetPlayerState[playerid] != PLAYER_STATE_DRIVER) return 1;
    new
    carid = GetPlayerVehicleID(playerid);
    if(pCarID[playerid] != carid) return SendClientMessage(playerid, FARBE, "Dieses Fahrzeug gehört nicht dir");
    pCarID[playerid] = 0;
    vOwned[carid] = false;


    // Überprüfen ob Spieler das Fahreug besitzt ( für alle Möglichen Autobefehle )


    if(GetPlayerState[playerid] != PLAYER_STATE_DRIVER) return 1;
    if(pCarID[playerid] != GetPlayervehicleID(playerid)) return SendClientMessage(playerid, FARBE, "Dieses Fahrzeug gehört nicht dir");

    Na ja Matze hatte schon auf eine gewisse Art Recht, dein eigentlicher Befehl lautet /officer und an den hängst du Parameter an, wie in deinem Beispiel einen string. Hier mal ein kleines Beispiel
    // OnPlayerCommandText
    new
    string[128];
    string = strtok(cmdtext, idx);
    if(strcmp(string, "/officer", true) == 0)
    {
    // Spieler hat /officer eingeben
    string = strtok(cmdtext, idx);
    if(strcmp(string, "strafe", true) == 0)
    {
    // Spieler hat "/officer strafe" eingeben
    string = strtok(cmdtext, idx);
    if(string[0] == 0) return 1; // Falsche Eingabe
    new
    value = strval(string);
    format(string, sizeof(string), "Du hast /officer strafe %d eingeben", value);
    SendClientMessage(playerid, FARBE, string);
    // usw.
    }
    else if(strcmp(string, "Papiere", true) == 0)
    {
    // Spieler hat "/officer papiere" eingeben
    string = strtok(cmdtext, idx);
    if(strcmp(string, "führerschein", true) == 0)
    {
    // Spieler hat /officer papiere führerschein eingeben
    // usw.
    }
    // usw.
    }
    // usw.
    }
    return 1;

    Super Einstellung Zonk, so bringst dus anderen gleich "richtig" bei. Achtung, kluge Köpfe merken die Ironie.
    1.) Für was zur Hölle braucht man 3 (!) strings mit der Größe 256 ?!
    2.) Dieses #pragma tabsize 0 macht deinen Code unleserlich und sollte NICHT verwenden werden. Richtiges Einrücken ist nicht schwer, gibt genug Tutorials darüber


    Um einen Command zu erstellen, kannst du 2 Möglichkeiten nutzen


    1.) dcmd & sscanf:
    Es gibt schon genug darüber zu lesen, wenn man nach dcmd sucht. Auch in der Wiki ist ein entsprechender Eintrag, in dem sogar beide Methoden kurz dargestellt werden.
    http://wiki.sa-mp.com/wiki/Fast_Commands
    Grunsärtlich erstellst du deine Befehle in OnPlayerCommandText. Die Befehle stehen aber außerhalb dieses Callbacks, innerhalb von OnPlayerCommandText ist also nur eine Art "Weiterleitung". Mit sscanf kannst du dann die Paramter auslesen, die an einen Befehl rangehängt wurden:


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(Befehl1 /* Befehlsname, in diesem Fall /Befehl1 */, 7 /* Befehl1 hat 7 Zeichen */, cmdtext);
    dcmd(ZweiterBefehl, 13, cmdtext);
    dcmd(Drei, 4, cmdtext);
    return 1;
    }


    dcmd_Befehl1(playerid, params[]) // Dein eigentlicher Befehl von "Befehl1"
    {
    // SPieler hat /Befehl1 eingeben
    // Parameter auslesen mit sscanf oder strtok
    // Rest vom Code
    }


    dcmd_Drei(playerid, params[]) // Dein eigentlicher Befehl von "Befehl1"
    {
    // SPieler hat /Drei eingeben
    // Parameter auslesen mit sscanf oder strtok
    // Rest vom Code
    }


    [...]


    2. Methode ohne dcmd
    Dabei wird der ganze Code direkt in OnPlayerCommandText geschrieben und mit strtok die Eingaben und Paramter überprüft. Ein Tutorial gibts auch hier irgendwo wahrscheinlich
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new
    string[128], // 1 String mit der Größe 128 reicht ! Man kann diesen string auch für die Paramter oder NAchricht ausgeben formatieren immer wieder verwenden
    idx;
    string = strtok(cmdtext, idx); // Die EIngabe des Spielers bis zum ersten Leerzeichen (kurz: den Befehl) in string speichern
    if(strcmp(cmd,"/Befehl1",true)==0)
    {
    // Spieler hat /Befehl1 eingegben
    // Parameter auslesen usw.
    string = strtok(cmdtext, idx); // Die Eingabe des Spielers ab dem 1. Leerzeichen bis zum 2. (kurz: weitere Parameter) in string speichern
    if(string[0] == 0) return SendClientMessage(playerid, FARBE, "Falsche Eingabe");
    /*
    Weiterführender Code, z.B. mit strval(string); den Inhalt des strings in einen Zahlenwert umwandeln oder den string weiter vergleichen oder den
    String ausgeben, oder einfach keine weiteren Paramter überprüfen, dann kannst du dir das ab dem 2. strtok sparan
    */
    }
    else if(strcmp(cmd,"/Zwei",true)==0)
    {
    // Spieler hat /Zwei eingegben
    // Parameter auslesen usw.
    }
    return 1;
    }

    1.) Solltest du auf deine Stringgrößen achten, 256 ist für normale strings viel zu hoch, für Namen erst recht (normale strings zum Nachricht senden max. 128, bei Namen gibts extra MAX_PLAYER_NAME)
    2.) Kann du nicht einfach "gravity tmp" als rcon senden. Du musst deinen string (in deinem Fall tmp) erst in eine Zahl umwandeln und diese dann per Rcon senden. Als Besipiel:
    // string erstellen (auf Stringgröße achten) -> in meinem Beispiel string
    string = strtok(cmdtext, idx);
    if(string[0] == 0) return SendClientMessage(playerid, FARBE, "Falsche Eingabe"); // ist der string leer?
    new
    Float:value = floatstr(string);; // string zu Float -> Float in neu erstelltem "value" speichern
    /*
    für Integer:
    new
    value = strval(string); // String in normale Zahl -> Zahl in "value" speichern


    */


    // Da es ein Float sein muss (z.B. 0,008) musst du hier zum Formatieren %f anstatt %d (Integer) oder %s (Strings) benutzen
    format(string, sizeof(string), "gravity %f", value); // String formatieren, du kannst den gleichen string hierfür nehmen, den anderen brauchts nimmer !
    SendRconCommand(string); // Rcon Command absenden mit formatiertem string
    3.) /me ist 3 Zeichen lang
    Der "/" hat den Index 0, "m" die 1 und "e" die 2.
    Ein funktionierender /me Befehl findest du hier, vergleich mal mit deinem und du weisst, was ich damit meine. Die EIngabe des Spielers solltest du auch Überprüfen..
    http://wiki.sa-mp.com/wiki/Using_strcmp%28%29

    if(strcmp(string, "/destroy", true) == 0)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return 1;
    DestroyVehicle(GetPlayerVehicleID(playerid));
    // Nachricht senden? SendClientMessage(playerid, FARBE, "Auto zerstört");
    return 1;
    }


    // oder in dcmd

    dcmd_destroy(playerid, params[])
    {
    #pragma unused params
    if(!IsPlayerInAnyVehicle(playerid)) return 1;
    DestroyVehicle(GetPlayerVehicleID(playerid));
    // Nachricht senden? SendClientMessage(playerid, FARBE, "Auto zerstört");
    return 1;
    }

    Samp Bug bei SetVehiclePos

    Zitat

    Important note: This function ONLY works if someone has been in the vehicle since it spawn.
    Important note: A vacated vehicle will not fall after being teleported into the air


    http://wiki.sa-mp.com/wiki/SetVehiclePos


    Wenn du einen Spieler ins Auto sitzt lässt nach dem Respawn und benutzt dann SetVehiclePos, sollte es gehen

    Damit das Tutorial startet, muss die Variable "TutTime" an der entsprechende Stelle auf den Wert 1 gesetzt werden. Dann sollte diese Variable beim jedem Durchlauf hochzählen mit TutTime[i]++; Dieses Hochzählen fehlt bei dir, d.h. deine Variable wird auf 1 gesetzt (irgendwo woes starten soll), aber diese bleibt auf 1 und erreicht nicht den notwendigen Wert von 5, damit die Nachricht angezeigt wird. Um das Problem zu beheben musst du also
    TutTime[i]++;
    nach der "}" von "switch" einfügen...