Beiträge von Goldkiller

    Sicherlich ist das möglich.Ich lasse fast immer Koordinaten aus Datein lesen.
    Am besten du nimmst noch gleich sscanf() dazu,ein Tutorial zur Anwendung findest du in meiner Signatur.
    ReadData("spawnkoordinaten.txt");


    stock ReadData(const file[]) {
    new
    Float:X,
    Float:Y,
    Float:Z,
    c,
    File:fFile,
    tmp[128];
    fFile = fopen(file,io_read);
    if(fFile) {
    while(fread(fFile,tmp,sizeof(tmp))) {
    StripNewLine(tmp);
    if(!tmp[0]) {
    continue;
    }
    if(tmp[0] == ';') { // Für Kommentare bzw Zeilen die nicht gelesen werden sollen
    continue;
    }
    if(sscanf(tmp,"p<,>fff",X,Y,Z)) {
    printf("Fehler beim laden von Eintrag%d",c);
    }
    // AddCheckpoint(X,Y,Z);
    c++;
    }
    }
    else {
    printf("Fehler beim Laden ReadData ( %s )",file);
    return 0;
    }
    fclose(fFile);
    return c;
    }
    stock StripNewLine(str[]) //ysi_misc.own
    {
    new
    l = strlen(str);
    while (l-- && str[l] <= ' ') str[l] = '\0';
    }

    Zitat

    RAY: Das ganze ist aber ein Fail und wenn man es nicht richtig weiß dann sollte man es einfach mal sein lassen statt auf "Absenden" zu klicken. Das verwirrt Leute, die wirklich PAWN lernen wollen und regt mich wieder tierisch auf - außerdem sind solche Posts der beste Beweis, dass nicht alle mit hohem Postcount auch einen hohen IQ haben...


    Was hat dass denn mit IQ zu tun ? 8|
    Dann würde Ich aber nochmal dass hier überdenken:

    Zitat

    Außer dem ist das
    =
    nur in Zuweisungen zu benutzen und hat in if-Abfragen nichts zu suchen.


    Das kann man schon in Abfragen benutzen,denn
    new
    xval = 5;
    if( (xval = 4) ) {
    printf("xval = 4 ( %d )",xval);
    }

    ist völlig Okay.Man benutzt dann aber dopplete Klammern,sonst bekommt man eine Warnung.
    Erklärung dazu gibt es hier

    Geht auch einfacher.
    new
    query[256],
    //
    Carid,
    Carmodel,
    Carfraktion,
    Carjob,
    Carnoob,
    CarX,
    CarY,
    CarZ,
    CarA,
    AdacX,
    AdacY,
    AdacZ,
    AdacA,
    Carcolor1,
    Carcolor2,
    CarCost,CarSell;
    format(query, sizeof(query),
    "INSERT INTO `Vehicles` (`CarID` ,`Model` ,`Locked` ,`CarFraktion` ,`CarJob` ,`CarNoob`,`CarVerwahrt` ,`CarX` ,`CarY` ,`CarZ` ,`CarA`,`AdacX` ,`AdacY` ,`AdacZ` ,`AdacA` ,`Color1` ,`Color2` ,`Price` ,`Sell` ,`Owner`)\
    VALUES ('%d', '%d', '0','%d','%d','%d','%d', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%d', '%d', '%d', '%d', 'Unbought');",
    Carid, Carmodel,Carfraktion,Carjob,Carnoob, CarX, CarY, CarZ, CarA,AdacX,AdacY,AdacZ,AdacA, Carcolor1, Carcolor2, CarCost, CarSell);

    Du kannst es auch direkt in mehrere Zeilen aufteilen.Wie du siehst ist am Ende der ersten Format Zeile ein Backslash \.Damit lässt du den String in der nächsten Zeile fortführen.Ach kannst du nach irgendeinem extra Parameter eine neue Zeile anfangen ( Dort ohne Backslash \ ).

    Das solltest du doch schon alleine schaffen.
    Überleg doch mal,was Ich geschrieben haben.
    Killerid ist also 65535
    if(gTeam[65535] != gTeam[einnahmeleiter] && 65535 != 65535)
    Es wird doch der Code schon crashen bei der Abfrage mit gTeam,da es außerhalb der Array Grenzen ist.


    Es muss also vorher geprüft werden,ob die killerid INVALID_PLAYER_ID ist.

    if(killerid != INVALID_PLAYER_ID) {
    // Killer ist ein richtiger Spieler!
    // Hier ist also schon sicher,dass der Code wegen der killerid nicht crashen wird
    // da die killerid nicht größer als MAX_PLAYERS sein wird oder kleiner als 0.
    // Damit wird schon mal nicht irgendwo auf's Array zugegriffen,wo es nicht möglich ist
    if( gTeam[killerid] != gTeam[einnahmeleiter] ) {

    }
    }

    Anhand der Debug Infos bin ich mir jetzt nicht ganz sicher bis wo der Code läuft,aber ein Problem müsste killerid sein.


    Angenommen man hat Selbstmord begangenist die killerid 0xFFFF oder 65335.


    if(gTeam[killerid] != gTeam[einnahmeleiter]) Spätestens dort hättest du das Limit des Arrays deutlich überschritten und der Code stoppt.
    Überprüf mal via Debug Notes was der wert hinter killerid ist,bevor der Check gemacht wird.


    Muss ja zugeben,teilweise hab ich selber dass Problem.Kommt schon mal vor,dass man vergisst abzufragen ob "killerid == INVALID_PLAYER_ID" ist ;).

    und füg mal oben gleich mal
    #pragma tabsize 0
    ins script^^


    Das hat aber mit dem eigentlichem Problem von tag mismatch nichts zu tun.


    CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ)


    An den markierten Stellen hast du oben im Code Beispiel Integers,keine Floats.


    [GRS]Systemfehler hat aber ebenfalls rechts,lad dir das 0.3b Server Paket herrunter.

    Ganz ehrlich,Ich versteh den Zusammenhang nicht zwischen OnPlayerKeyStateChange und OnPlayerStateChange in deinem Code.
    Was passiert denn bei OnPlayerKeyStateChange aus der Abfrage mit den KEYS ? Hast du Debug-Notes eingefügt um zu schauen ob die KEY Abfrage wirklich fehl schlägt ?


    if(vhp<= 300) Da brennt das Fahrzeug schon längst.Glaube bei 400 fängt das Fahrzeug an zu brennen,also nimm mal lieber 450.
    new Float:vx, Float:vy, Float:vz;
    SetVehicleVelocity(vehicleid, vx*0, vy*0, vz*0);

    Geil.Wie wäre es so

    SetVehicleVelocity(vehicleid, 0.0,0.0, 0.0);

    Nope.
    Denn, der ASCII Wert von der Zahl 7 ist nicht 7.Auch weiss Ich nicht wieso du auf 2 kommst.


    if(text[0] == '7') {
    text[0] = '/';
    CallLocalFunction("OnPlayerCommandText","is",playerid,text);
    }
    Ich würde es mit CallLocal / Remote Funktion machen.Glaube nämlich,es funktioniert nicht wenn man direkt OnPlayerCommandText aufruft.


    //Edit: Hast wohl schon selber oben verbessert :p

    Zitat

    Es gibt nicht viel dabei zu erklären, es ist ein einfaches Makro das viel viel kürzer ist wie zb. dcmd und ihr müsst nicht kein extra dcmd_ thread hinzufügen, ihr könnt alles in dem Callback erledigen.
    Das ganze ist Resourcen sparender als strtok, strrest, dcmd_..


    Das hätte Ich mal gerne bewiesen.Jeder kann mit Wörtern um sich werfen ... . Kannst gerne mal dein Testscript zeigen,womit du dass herrausgefunden hast.
    Denn so wie Ich dass sehe,ist das Makro von dir definitiv langsamer als dcmd. strtok & strrest kann Ich jetzt nichts zu sagen.

    Man sollte sich richtig informieren bevor man Tutorials schreibst ;).

    Zitat

    Chat: 256 128
    Textdraws: 1024
    Namen: 24


    Kannst es ja gerne nachlesen und dich selber überzeugen: Limits - SA-MP Wiki


    Zitat

    %x - Eine Zahl in hexadezimaler Schreibweise, Beispiel: "1101"


    Ich glaube du hast da eindeutig etwas misverstanden. 1101 wäre Dualsystem ,bzw Binäir. Dafür nutzt man aber den Platzhalter %b
    Hexadeizimal kannst du ja gerne dort nachlesen.

    Die Textdraws sehen wirklich nett aus ( Auf den Bildern jedenfalls ).Du gehst aber sehr verschwenderisch mit den Textdraws um,wenn Ich ehrlich bin.
    Mal am Beispiel vom Navigations-Script:


    Es gibt nur einen Textdraw,der wirklich spezifisch für den Spieler ist,und das ist der mit der Distanz.
    Die Anderen Textdraws sind für jeden Spieler gleich,seien es die Pfeile ( <- ^ -> v ) oder der Textdraw mit der Schrift "GPS System".
    Momentan erstellst du 10 Textdraw pro Spieler alleine für das Navigationssystem! Das ist viel!
    Mal einen kleine Rechnung ( Angenommen mit 20 Spielern ).
    # Methode 1, von dir.
    0 + ( 10 * 20 ) = 200 Textdraws
    ; 0 - Globale Textdraws
    ; 10 - Private Spieler Textdraws
    ; 20 - Spieler


    # Methode 2, von mir.
    Ich würde dir empfehlen,bis auf den Textdraw,der die Distanz anzeigt,die Anderen jeweils nur 1x zu erstellen! Daraus ergibt sich nämlich die Rechnung:
    9 + (1 * 20 ) = 29 Textdraws
    ; 9 - Globale Textdraws
    ; 1 - Private Spieler Textdraws
    ; 20 - Spieler


    Das macht 200 Textdraws aktuell,gegen 29 Textdraws.Das ist ein riesen Unterschied!Abgesehen davon,dass du den Speicher des Spielers
    mit diesen 171 Textdraws mehr aufstockst, sollte man noch das Limit der Textdraws beachten.


    Lediglich wenn 0 Spieler Online sind,verbraucht deine Methode weniger Resourcen als die Zweite.


    Vielleicht verbesserst du das ja mal bei gelegenheit ;)