Beiträge von Alex_Steward

    Hey Leute,


    ich wollte ein System machen, dass jeden Login eines Members einer Fraktion abspeichert. Darunter werden Datum und Uhrzeit des Logins abgespeichert. Mit einem Befehl kriegt der Leader alle Member und ihre Daten zu sehen.


    Da jeder Member bei jedem neuen Login neue Daten bekommt, muss ich in der Datei die vorher abgespeicherte Zeile mit der neuen dann ersetzen.


    Soweit ich weiß, kann man eine Zeile mit "fdeleteline(Filename, Line)" (Dazu hab ich hier aus dem Forum eine Funktion entnommen) entfernen. Ich würde, falls das möglich ist, gerne anstatt die Zeile zu entfernen, sie mit einer neuen zu ersetzen. Die Funktion "fdeleteline" ist für mich etwas zu proffessionell erstellt, daher kann ich die nicht so umstellen, dass sie eine Zeile nicht löscht, sondern ersetzt.


    Falls das jemand kann, hier die Funktion:


    public fdeleteline(filename[], line[])
    {
    if(fexist(filename))
    {
    new temp[256];
    new File:fhandle = fopen(filename,io_read);
    fread(fhandle,temp,sizeof(temp),false);
    if(strfind(temp,line,true)==-1)
    {
    return 0;
    }
    else
    {
    fclose(fhandle);
    fremove(filename);
    for(new i=0;i<strlen(temp);i++)
    {
    new templine[256];
    strmid(templine,temp,i,i+strlen(line));
    if(equal(templine,line,true))
    {
    strdel(temp,i,i+strlen(line));
    fcreate(filename);
    fhandle = fopen(filename,io_write);
    fwrite(fhandle,temp);
    fclose(fhandle);
    return 1;
    }
    }
    }
    }
    return 0;
    }


    Ich hoffe jemand hat eine Lösung für mich, stehe nämlich zur Zeit mit diesem Problem da und habe mein System zu 99 % fertig. ^^

    Ganz unten im Script:


    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }


    Hier der Befehl:


    if(!strcmp(strget(cmdtext, 0), "/n", true))
    {
    if(gTeam[playerid] == Team_News && gRang[playerid] >= 92)
    {
    new idx;
    new tmp[128] = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid,WEIS,"Benutzung: /n(ews) [TEXT]");
    return 1;
    }
    new string[256];
    new player[MAX_PLAYER_NAME];
    GetPlayerName(playerid,player, sizeof player);
    format(string,sizeof string,"Newsreporter %s: %s",player,tmp);
    SendClientMessageToAll(NEWS,string);
    return 1;
    }
    else if(gTeam[playerid] != Team_News)
    {
    SendClientMessage(playerid,KERFOLG,"Du bist kein Newsreporter oder hast nicht Rang 2 erreicht");
    return 1;
    }
    }

    Vielen Dank Goldkiller,


    ich werds testen, sobald ich Zeit habe :)


    //Edit: Funktioniert perfekt, habe wie du es gesagt hast, daraus eine Funktion gemacht. Für die, die es vielleicht brauchen werden:



    new LineThere[MAX_PLAYERS];


    //onplayerconnect
    LineThere[playerid] = -1;


    forward CheckLine(playerid, filename[], inputtext[], number);


    public CheckLine(playerid, filename[], inputtext[], number) // number 0: inputtext = zahl .... number 1: inputtext = text
    {
    if(IsPlayerConnected(playerid))
    {
    new Data[256];
    new File: hFile = fopen(filename, io_read);
    if( hFile )
    {
    while( fread( hFile, Data, sizeof( Data ) ) )
    {
    StripNewLine( Data );
    if(!Data[0])
    {
    continue;
    }
    if(number == 0)
    {
    if(strval(inputtext) == strval(Data))
    {
    LineThere[playerid] = 1;
    fclose( hFile );
    }
    else
    {
    LineThere[playerid] = 0;
    }
    }
    else if(number == 1)
    {
    if(strcmp(Data, inputtext, true) == 0)
    {
    LineThere[playerid] = 1;
    fclose( hFile );
    }
    else
    {
    LineThere[playerid] = 0;
    }
    }
    }
    fclose( hFile );
    }
    }
    return 1;
    }

    Hey Leute,


    ich habe ein eigenes Versicherungs- + Nummernschildsystem gescriptet, doch leider hab ich nur noch ein Problem, was mich daran hindert komplett fertig zu sein.


    Ein Spieler wird gefragt, welche Zahl er aufs Nummernschild haben möchte. Bei Eingabe seiner Wunschzahl wird die Datei "Kennzeichen.cfg" geöffnet. In der Datei befindet sich kein Eintrag, daher wird dann abgefragt, ob die Wunschzahl in der Datei steht. Wenn die Wunschzahl in der Datei steht, wird dem Spieler gesagt, dass diese Zahl schon vergeben ist. Wenn nicht, wird seine Wunschzahl in der Datei (mithilfe von io_append) zusätzlich eingetragen. Das wars auch schon.


    Mein Problem liegt darin, dass ich nicht weiß, wie ich diese Zahl reinschreiben muss, sodass ich dann diese aus der Datei ablesen kann, um zu prüfen ob sie vergeben ist.


    Wäre echt klasse, wenn sich jemand, der sich damit auskennt, mir helfen könnte. Ich saß da jetzt ein paar Tage und Nächte drann, hab mir echt Mühe gegeben und dann ist es schon blöd und ärgerlich, wenn es wegen sowas nicht weitergeht. :thumbdown:


    Danke schon mal im Vorraus :)


    Mfg Alex

    Hier, mach das:


    //oben im Script
    new RoadBlock[MAX_PLAYERS];
    new RB[MAX_PLAYERS];


    //onplayerconnect


    RoadBlock[playerid] = 0;


    //onplayercommand


    if(strcmp(cmdtext, "/medicrb", true)==0)
    {
    if(RoadBlock[playerid] == 0)
    {
    new Float:X, Float:Y, Float:Z, Float:A;
    GetPlayerPos(playerid, X, Y, Z);
    GetPlayerFacingAngle(playerid, A);
    RB[playerid] = CreateObject(981, X, Y, Z, 0.0, 0.0, A+180);
    SetPlayerPos(playerid, X, Y, Z+4);
    RoadBlock[playerid] = 1;
    return 1;
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du hast bereits eine Sperre verbaut!");
    }
    }


    if(strcmp(cmdtext, "/wiederwegmachen", true)==0)
    {
    if(RoadBlock[playerid] == 1)
    {
    DestroyObject(RB[playerid]);
    RoadBlock[playerid] = 0;
    return 1;
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du hast keine Sperre verbaut!");
    }
    }
    return 1;
    }


    Also normalerweise muss es so gehen, wie ihr es oben gepostet habt:


    for(new i = 0; i<sizeof(HouseInfo); i++)
    {
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    if(strcmp(pname, HouseInfo[i][hNameVonAnderem], true) == 0)
    {
    SendClientMessage(playerid, COLOR_GREY, "Dein Name stimmt überein!");
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Dein Name stimmt NICHT überein!");
    }
    }


    Wenn es so halt nicht geht, prüf dann ob du beim Definieren von "hNameVonAnderem" auch eine Array gesetzt hast, also " ...hNameVonAnderem[MAX_PLAYER_NAME],". Es kann ja sein, dass du den Namen falsch reinschreibst, um ihn richtig erstmal reinzuschreiben, um den später zu prüfen geht es so:



    ...
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    strmid(HouseInfo[i][hNameVonAnderem], pname, 0, strlen(pname), 255);
    ...


    Einfach nur als Info, falls du es vielleicht nicht wusstest^^

    if(dialogid == 12)
    {
    new name[MAX_PLAYER_NAME];
    if(response)
    {
    if(listitem == 0)
    {
    new string2[50];
    GetPlayerName(playerid,name,sizeof(name));
    format(string2,sizeof(string2),">> %s ist in die Deagle-Arena gegangen!",name);
    SendClientMessageToAll(GREEN,string2);
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid,24,500);
    SetPlayerInterior(playerid,1);
    SetPlayerPos(playerid,963.418762,2108.292480,1011.030273);
    return 1;
    }
    else if(listitem == 1)
    {
    new string2[50];
    GetPlayerName(playerid,name,sizeof(name));
    format(string2,sizeof(string2),">> %s ist in die Mp5-Arena gegangen!",name);
    SendClientMessageToAll(GREEN,string2);
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid,29,1000);
    SendClientMessage(playerid,GREEN,"in arbeit");
    return 1;
    }
    }
    else
    {
    ShowPlayerDialog(playerid,DIALOG_ARENA1,DIALOG_STYLE_LIST,"Los Santos Arena","Deathmatch","Weiter","Abbrechen");
    return 1;
    }
    }

    Das klappt nicht, weil "farbe" als kein Float benutzt werden kann (z.B. 0x00AAAFFF ). Farben sind ja ein Zahlen- und Buchstabenwert, ein Float hingegen NUR ein Zahlenwert.


    Du kannst es so machen, indem du vorher schon die Farben definierst, also so:


    #define COLOR_YELLOW 0xFFFF00AA
    #define COLOR_BLUE 0x0000F6AA
    #define COLOR_GREY 0xAFAFAFAA


    oben im script:


    new PreviousColor[MAX_PLAYERS];


    onplayerconnect:


    PreviousColor[playerid] = 0;


    Dann unter OnPlayercommand:


    //deine Befehlsform und da rein dann das einfügen:
    ...
    if(strcmp(GetPlayerColor(playerid), "0xFFFF00AA", true) == 0)
    {
    PreviousColor[playerid] = 1;
    }
    else if(strcmp(GetPlayerColor(playerid), "0x0000F6AA", true) == 0)
    {
    PreviousColor[playerid] = 2;
    }
    else if(strcmp(GetPlayerColor(playerid), "0xAFAFAFAA", true) == 0)
    {
    PreviousColor[playerid] = 3;
    }
    ...


    onplayerdisconnect:


    if(PreviousColor[playerid] == 1)
    {
    SetPlayerColor(playerid, COLOR_YELLOW);
    }
    else if(PreviousColor[playerid] == 2)
    {
    SetPlayerColor(playerid, COLOR_BLUE);
    }
    else if(PreviousColor[playerid] == 3)
    {
    SetPlayerColor(playerid, COLOR_GREY);
    }



    So nach dem Prinzip, könnte man es auch machen.

    Hey,


    ich hatte auch mal diesen Fehler, nur kann ich mich leider nicht erinnern, wie ich ihn behoben hab.


    Versuch mal folgende Sachen:


    - auf http://www.sa-mp.com neue Serverdateien zu downloaden und da deine Dateien noch mal einfügen, um es dann zu probieren


    - pawno.exe im pawno ordner öffnen, dann auf new, danach auf open und dann das Script öffnen und dann compilen. dann den Server versuchen zu starten


    - Scriptinhalt kopieren, in eine neue pwn datei einfügen und dann compilen. Dann server starten

    Hä wieso sollte der Pawno bei meiner Art des Scripts crashen ? Da ist kein Fehler drinne... Hmm... Egal...


    Erklär mir genau und ausführlich dein Problem, denn irgendwie kapier ich nicht ganz, was da nicht stimmt und kann somit nicht effektiv nach dem Auslöser suchen. ;)

    //Oben im Script


    new CopCar1;
    new CopCar2;
    ...


    forward IsACopCar(carid);


    //Ongamemodeinit


    CopCar1 = CreateVehicle( ... ); //die nötigen Daten eingeben (X, Y, Z, Koordinate etc.)
    CopCar2 = CreateVehicle( ... ); // hier auch die nötigen Daten


    //unten im script


    public IsACopCar(carid)
    {
    if(carid == CopCar1 || carid == CopCar2)
    {
    return 1;
    }
    return 0;
    }


    if(strcmp(cmd, "/carduty", true) == 0)
    {
    if( ... ) // Abfrage, ob er ein Polizist ist
    {
    if(IsPlayerInVehicle(playerid, IsACopCar(GetPlayerVehicleID(playerid))) // Abfrage, ob er in einem Copauto sitzt
    {
    if(OnDuty[playerid] == 0)
    {
    ....
    }
    else if(OnDuty[playerid] == 1)
    {
    ...
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du befindest dich in keinem Copauto!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du bist kein Cop!");
    }
    }