Beiträge von Haxler

    Der Fehler tritt immer auf, wenn du eine native-Funktion verwendest, die nicht vorhanden ist. Das könnte daran liegen, dass du eine veraltete Plugin-Version hast, die diese Funktion noch nicht unterstützt.

    Du erstellst dein Fahrrad (CreateVehicle) und fragst bei deinem Befehl ab, ob der Spieler in diesem Fahrzeug ist (GetPlayerVehicleID). Falls ja, ziehst du Geld ab und startest einen Timer (SetTimerEx), der nach 30 Minuten das Fahrrad respawnt(SetVehicleToRespawn).


    @Music4You: Inwiefern soll ein 3DTextLabel dabei hilfreich sein? Für das Grundsystem wird dies nicht benötigt.

    Das könntest du auch mit einem Array lösen (new pObject[MAX_PLAYERS] = {INVALID_OBJECT_ID ,...};) Dann ist das ganze zwar nicht vom Spielernamen abhängig, jedoch von der Spieler-ID, welche ja auch individuell ist.

    for(new p;p<MAX_PLAYERS;p++)Kick(p)
    Du könntest auch noch abfragen ob der Spieler online ist (IsPlayerConnected).

    So müsste es eigentlich gehen:


    new str[24], temp;
    for(new i;i<13;i++)
    {
    format(str,24,"Waffe%d",i+1);
    temp = dini_Int(Spielerdatei, str);
    format(str,24,"Waffe%dMunition",i+1);
    GivePlayerWeapon(playerid, temp, dini_Int(Spielerdatei, str));
    }


    edit: Du könntest auch statt format(str,24,"Waffe%dMunition",i+1); strcat(str,"Munition"); verwenden.


    new Float:pos[][3] =
    {
    {1.0, 1.0, 1.0}, //Position 1
    {5.0,5.0,5.0}, //2
    {3.0,3.0,3.0} //3
    //...
    };


    new next, Float:dist = Float:0x7F800000, Float:temp;
    for(new i;i<sizeof(pos);i++)
    {
    if( (temp = GetPlayerDistanceFromPoint(playerid, pos[i][0], pos[i][1], pos[i][2])) < dist)
    {
    dist = temp;
    next = i;
    }
    }

    Damit könntest du beliebig viele Punkte verwenden, und den nächsten herrausfinden. Next ist in diesem Fall der Index der nächsten Koordinaten.
    printf("%f - %f - %f",pos[next][0], pos[next][1], pos[next][2]);
    Das ganze ist ungetestet, aber vom Prinzip her kannst du das so machen.

    Wie schon von Mysteriöser Unbekannter erwähnt, speicherst du in der Schleife alle Einträge mehrmals. (13 durchläufe, 26 Dateizugriffe -> 338 Dateizugriffe).
    So sollte es funktionieren:

    new weapon[2], //Ein größerer Array wird nicht benötigt, da du die Werte direkt abspeicherst und danach nicht mehr benötigst
    str[24];
    for (new i = 0; i < 13; i++)
    {
    GetPlayerWeaponData(playerid, i, weapon[0], weapon[1]);
    format(str,24,"Waffe%d",i+1);
    dini_IntSet(Spielerdatei, str, weapon[0]);
    format(str,24,"Waffe%dMunition",i+1);
    dini_IntSet(Spielerdatei, str, weapon[1]);
    }

    Verwende am Besten eine Variable (pID) um die ID "zwischenzuspeichern". Dann musst du sie nur ein mal mit GetPVarInt laden.

    SendClientMessage(playerid,WEIß,"Der Spieler hat die Anfrage abgelehnt!");
    SendClientMessage(playerid,WEIß,"Du hast die Anfrage abgelehnt!");
    die Nachrichten werden beide an playerid geschickt, verwende die oben erwähnte Variable für die Nachricht, die an den anderen Spieler gehen soll.



    new name[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME];
    GetPlayerName(GetPVarInt(playerid,"pID"),name,sizeof(name));
    GetPlayerName(playerid,name2,sizeof(name2));
    format(Spielerdatei,sizeof(Spielerdatei),"/Accounts/%s.txt",name);


    Kleine Anmerkung: Es reicht, wenn du nur einen String zum auslesen der Namen verwendest.
    Außerdem benötigst du diesen Teil garnicht, da du nie auf die Datei zugreifst.

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

    Zitat

    Returns The number of characters before the sub string (the sub string's start position) or -1 if it's not found.


    Damit könntest du auch herrausfinden, wieviele Zeichen vor dem Punkt sind. Mit strlen kannst du die Länge des Namens herrausfinden, wenn du davon die Zeichen vor dem Punkt + den Punkt abziehst, hast du die Anzahl der Zeichen nach dem Punkt.

    Das Problem an GetPlayerMoney ist, dass es den Wert zurück gibt, der beim Spieler angezeigt wird. Das von dir genannte Programm verändert lediglich diesen Wert. Als Resultat gibt GetPlayerMoney dir den falschen Betrag wieder. Um das ganze zu verhindern musst du das Geld, wie schon mehrmals erwähnt, über den Server laufen lassen und GivePlayerMoney nur zum Anzeigen verwenden. Das heißt: Du schreibst dir eigene Funktionen zum setzen/returnen des Betrages und updatest die Anzeige per GivePlayerMoney:



    new pMoney[MAX_PLAYERS];


    GiveMoney(playerid, money)
    {
    pMoney[playerid] += money;
    GivePlayerMoney(playerid, money);
    }


    GetMoney(playerid)
    {
    return pMoney[playerid];
    }

    Nun wird pMoney zum speichern des Geldes verwendet und GivePlayerMoney nur zum Anzeigen.
    Wenn ein Spieler also die Anzeige per Programm verändert, liefert dir GetPlayerMoney einen anderen Wert als GetMoney. Damit kannst du herausfinden ob und wieviel Geld sich ein Spieler gecheatet hat.
    Dann kannst du mit GivePlayerMoney(playerid, -betrag) das Geld wieder abziehen, sodass die Anzeige mit deiner Variable übereinstimmt.

    Das * wird einfach nur zufällig eingesetzt. Wenn du die Zeichen ersetzt haben möchtest, könntest du das z.B. so lösen:



    new str[] = "Das tor ist offen";
    print(str);
    for(new c = 1, l = strlen(str);c<l-1;c++) //Erstes und letztes Zeichen wird nicht ersetzt
    {
    if(random(3) == 1) //Wahrscheinlichkeit: 1/3
    {
    if(str[c-1] == '*' || str[code=c] == ' ')continue; //Keine aufeinander folgenden Sternchen; Leerzeichen überspringen
    str[code=c] = '*';
    }
    }
    print(str);
    wobei hier die Möglichkeit besteht, dass kein Zeichen ersetzt wird.

    Hast du verschiedene pawno-Ordner auf deinem Computer? Falls ja kann es sein, dass du das Script mit dem 'falschen' Pawno öffnen willst, in dem die dini.inc nicht vorhanden ist. Einfach mal die richtige pawno.exe starten und das Script öffnen.