Beiträge von Goldkiller

    if(!IsPlayerInVehicle(playerid, NRCar[6])){
    Das bringt nichts. Wird doch nur abgefragt,ob er im 7. Fahrzeug der NewsReporter sitzt.
    Du müsstest also eine Schleife benutzen ( Geht auch ohne,aber ist umständlich ) und auf alle Fahrzeuge im NRCar-Array überprüfen.


    ocmd:news(playerid, params[])
    {
    if(SpielerInfo[playerid][pFrak] !=1) {
    return SendClientMessage(playerid, COLOR_RED,"Du bist kein NewsReporter!")
    }
    new
    vehicleid,
    bool:bValid = false;
    vehicleid = GetPlayerVehicleID(playerid);
    if(!vehicleid) { // Sitzt in keinem Fahrzeug
    return SendClientMessage(playerid, COLOR_RED,"Du musst in einem NR Fahrzeug sein um senden zu können!");
    }
    for(new i = 0 ; i < sizeof(NRCar) ; i++) {
    if( vehicleid == NRCar[i] ) { // Sitzt in einem NR Fahrzeug
    bValid = true;
    break; // Wir springen raus aus der Schleife. Denn wir haben bereits wonach wir gesucht haben
    }
    }
    /*
    if(!IsPlayerInVehicle(playerid, NRCar[6])) {
    return SendClientMessage(playerid, COLOR_RED,"Du musst in einem NR Fahrzeug sein um senden zu können!");
    }
    */
    if(!bValid) { // Sitzt in keinem NR Fahrzeug
    return SendClientMessage(playerid, COLOR_RED,"Du musst in einem NR Fahrzeug sein um senden zu können!");
    }
    new
    string[128], // Man brauch dazu eigentlich keinen Extra String, denn der Text steht doch eh in 'params'
    text[128],
    name[MAX_PLAYER_NAME];
    if(sscanf(params,"s",string)){
    return SendClientMessage(playerid, COLOR_GREY,"[Benutzung]: /news [Text]");
    }
    GetPlayerName(playerid, name, sizeof(name));
    format(text, sizeof(text),"[SAM-AG Reporter %s]: %s", name, string);
    SendClientMessageToAll(COLOR_ORANGE, text);
    return 1;
    }


    Solltest den Code auch mal richtig einrücken.So blickt doch keiner durch :-0

    Könnte es sein,dass du dini einfügst vor a_samp ?


    Es muss nämlich erst a_samp kommen ( denn dort werden dann weitere Includes eingefügt wie z.B. die, für fexists ), danach dini.
    #include <a_samp>
    #include <dini>


    Sollte es nicht so sein,kannst ja mal deinen Code zeigen. Jedenfalls den Teil, wo du alle Includes lädst.

    Das könntest du auf 2 Varianten machen ( Fallen mir spontan nur ein ).


    1. Variante.
    Du zählst beim vergeben der Telefonnummer immer +1. Du musst aber einen globalen Wert haben, der die nächste freie Telefonnummer bestimmt.

    Zitat

    //telefonnummer.cfg
    Telefonnummer.Free=1201


    Immer wenn eine neue Nummer vergeben wird,wird Telefonnummer.Free + 1 gerechnet. Du musst aber sicher stellen,dass Telefonnummer.Free immer gespeichert wird wenn es geändert wurde ( Reicht eigentlich beim beenden des Gamemodes / Filterscriptes ) , damit eine Nummer nicht doppelt vergeben wird.
    Du könntest natürlich auch bei Nummern von 150000 Anfangen und immer + 18 rechnen oder auch + random(500) . Die Sache dabei ist nur, dass die Nummer chronologisch der Größe nach verteilt werden. Ist aber leichter zum umsetzen.
    Nimmst du allerdings nicht immer Telefonnummer.Free+1 , so brauchst du trotzdem eine Liste wie in Variante 2. , denn nur bei +1 kannst du sicher gehen, dass alle Nummern ab einem bestimmten Startwert ( zB. 1000 ) bis Telefonnummer.Free ( 1201 im Beispiel ) in gebrauch sind.


    2. Variante.
    Du generierst wirklich immer eine zufällige Zahl. Ist die Nummer nicht vergeben, wird sie in eine Liste eingetragen.

    Zitat

    //telefonnummer.cfg
    1534
    54323
    64300


    Um zu prüfen ob die Nummer nicht vergeben ist, musst du alle Einträge in der Datei / Liste durchgehen und prüfen ob sie deiner aktuell generierten Nummer entspricht.

    Das wird so einfach nicht gehen. Hier mal,wie es funktionieren sollte.
    stock CheckPhonenumber( number ) {
    for(new i = 0 ; i < MAX_PLAYERS ; i++) {
    if( number == GetPVarInt(i,"HandyNummer") ) {
    return i; // Wir geben die Spieler-ID zurück
    }
    }
    return INVALID_PLAYER_ID; // kein Spieler besitzt die ID.Also noch frei
    }



    // Beim vergeben der Nummer.Nehme an Befehl
    new
    phonenumber;
    do {
    phonenumber = 1000 + random(999) + 3 + playerid + random(99); // Ist auch nicht viel zufälliger als zuvor.Aber mir egal.
    }
    while( CheckPhonenumber(phonenumber) != INVALID_PLAYER_ID );


    // Beim überprüfen ob Nummer vorhanden.Nehme an Befehl
    new
    phone_playerid;
    phone_playerid = CheckPhonenumber( <Variable_der_Nummer> );
    if( phone_playerid != INVALID_PLAYER_ID ) {
    // der Spieler hinter phone_playerid hat die genannte Nummer
    }
    else {
    // Nummer nicht vergeben
    }


    Zitat

    kann man es auch machen das jeder spieler dann +19 bekommt also immer 19 addiert wird: 1. spieler 19, 2. spieler 38 usw?
    ich hab das jetzt so gemacht:


    Mathe ?
    ( playerid + 1 ) * 19.


    Die Nummern zu speichern bringt aber nichts. Du müsste "Globale" Nummern festlegen. Damit es keine überschneidungen gibt,müsstest du die Nummern in eine Liste eintragen und beim generieren einer neuen Nummer überprüfen,ob die noch nicht belegt ist.Wer sie in diesem Moment besitzt,ist eigentlich egal. Wichtig ist vorerst ja nur,ob sie noch frei ist oder nicht.

    Du solltest mal die Klammern richtig setzen.
    SetPVarInt(playerid,"HandyNummer", ( 1000+ random(999)+random (999) );
    // Was macht es eigentlich für einen Sinn,2x + random(999) zu machen ? Wenn die Zahl zwischen 1000 und 2000 liegen soll, müsstest eh random(1000) nehmen ( da random(1000) = 0 .. 999 ).
    Das gewährleistet aber nicht,dass zufällig mehrere Spieler die gleiche Zufallszahl bekommen.

    Zitat

    als pvar in einer .ini zu speichern?


    Welche Include benutzt du dafür denn? DINI ? SINI ?


    Es heisst übrigens "seit 3 Tagen".

    Was ist denn daran so schwer?
    Du kannst es auch ohne Array machen,ist nur ohne unglaublich umständlich.
    Daher empfehle ich ein Array + enum, damit du die Namen direkt benutzen kannst.


    Alle Einträge im Array durchgehen, checken ob der größer ist als der zuletzt größte Eintrag und gegebenfalls dann höchsten Eintrag neu festlegen.


    enum e_Modes {
    Mode_TeamDeathmatch = 0,
    Mode_BattleRoyal,
    Mode_TouchDown,
    Mode_1vsMio,
    Mode_Freemode,
    }
    new
    Mode_Votes[ e_Modes ];


    public OnFilterScriptInit()
    {
    // Hier ein Beispiel !
    Mode_Votes[Mode_TeamDeathmatch] = 2;
    Mode_Votes[Mode_BattleRoyal] = 1;
    Mode_Votes[Mode_TouchDown] = 5;
    Mode_Votes[Mode_1vsMio] = 0;
    Mode_Votes[Mode_Freemode] = 3;
    // Beispiel Ende
    new
    iModeIndex = -1,
    iValue = 0;
    for(new i ; i < sizeof(Mode_Votes) ; i++) {
    if( iValue < Mode_Votes[ e_Modes:i ] ) {
    iValue = Mode_Votes[ e_Modes:i ];
    iModeIndex = i;
    }
    }
    if( iModeIndex != -1) {
    printf("Höchster Eintrag bei Index %d mit Wert %d",iModeIndex, iValue);
    }
    else {
    printf("Das wahr wohl nichts! Kein Eintrag wurde als größer identifiziert");
    }
    return 1;
    }


    //Edit: Ist sogar noch besser mit GetHeighest. Da muss er wenigstens nicht die Variablen umbenennen und kann es direkt nutzen :).

    format(pfad,sizeof pfad,"/Spieler/%s.txt",pName);
    if(dini_Exists(pfad))

    Probier das mal aus mit einem Usernamen wie:
    [GER]Honig


    Wird nicht klappen.
    Dafür wurde mal die Funktionen udb_encode und udb_decode erstellt. Findest die glaub ich in d_utiles oder dudb.


    public OnPlayerDeath(playerid, killerid, reason)
    {
    SendDeathMessage(killerid,playerid,reason);
    if(gTeam[playerid] != gTeam[killerid])

    Vorher solltest du überprüfen ob killerid nicht INVALID_PLAYER_ID ist,sonst haste bei der Abfrage nämlich immer ein "index out of bounce" bei gTeam[killerid] . Denn bei Selbstmord ist killerid nämlich INVALID_PLAYER_ID und das ist 65535 ;).


    if(sscanf(params,"s[32]",pw)) return SendClientMessage(playerid,hellblau,"Benutze /log (Passwort)");
    Du kannst es auch einfacher machen. Wenn du nur einen String checken möchtest,brauchst du nicht unbedingt sscanf.


    if(isnull(params) ) return SendClientMessage(playerid,hellblau,"Benutze /log (Passwort)")
    // Der text steht weiterhin in 'params'
    // 'isnull' ist bei ZCMD enthalten.



    Hab den Code nur überflogen :-0

    Tatsächlich, hab die format-Zeile einfach von ReVide übernommen gehabt :S . Hab angenommen,die hätte er ebenfalls geändert.
    Schau dir am besten die formatFunktion an.


    format(string,sizeof(string),"Überprüfung | Spielername: %s \n Ping: %d \n IP: %s \n HP: %.1f \n Level: %d \n Geld: %d",SpielerName(pID),GetPlayerPing(pID),sIP,health,GetPlayerScore(pID),GetPlayerMoney(pID));

    Schau doch im SA:MP Wiki nach.


    GetPlayerIp
    Returns 1 on success and 0 on failure.


    GetPlayerHealth
    Returns The function itself doesn't return a specific value. The player's health is stored in the specified variable.


    Heisst also,du kannst den return-Wert ( von GetPlayerIp und GetPlayerHealth ) für deine Formatierung nicht wirklich gebrauchen.


    ocmd:check(playerid,params[])
    {
    if(isPlayerAnAdmin(playerid,1))
    {
    new pID,string[128];
    new Float:health;
    new sIP[64];
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,COLOR_RED,"Benutze: /check [ID]");
    if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,COLOR_RED,"Der gewünschte Spieler ist nicht online!");
    GetPlayerIp(pID,sIP,sizeof(sIP)); // IP steht nun in 'sIP'
    GetPlayerHealth(pID,health); // Energie steht nun in 'health'
    format(string,sizeof(string),"Überprüfung | Spielername: %s \n Ping: %d \n IP: %d \n HP: %d \n Level: %d \n Geld: %d",SpielerName(pID),GetPlayerPing(pID),sIP,health,GetPlayerScore(pID),GetPlayerMoney(pID));
    SendClientMessage(playerid,BLAU,string);
    }
    else SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin!");
    return 1;
    }

    Achso, hab ich etwas falsche verstanden.
    Wie auch immer, dann ist es nicht möglich. Liegt daran, dass der Abstand den du einstellst von Nah noch relativ gut dem entspricht, was du möchtest. Desto weiter du aber weg stehst, desto kleiner wird alles. Ist ja im realen nicht Anders. Ein Haus vor dem du direkt stehst wirkt größer, als das Gleiche Haus aus 100m Entfernung.


    Man könnte es scripten, relativ umständlich ist es aber trotzdem.


    Woran ich das erkennen kann? Weil er als Picture den Ausschnitt für Cops genommen hat.


    Ahja ... :-0

    Ihr müsste auch die Fahrzeuge erst respawnen lassen, damit die bei OnPlayerSpawn einen neuen Health-Wert bekommen können.
    new
    aiVehicles[5];
    public OnGameModeInit()
    {
    AddPlayerClass(265,1958.3783,1343.1572,15.3746,270.1425,0,0,0,0,-1,-1);


    aiVehicles[0] = AddStaticVehicleEx(560,1526.5880,-1643.9530,5.5861,179.6602,0,0,-1); // schwarze sultan
    aiVehicles[1] = AddStaticVehicleEx(560,1530.5490,-1644.0897,5.5879,180.1831,1,1,-1); // weiße sultan
    aiVehicles[2] = AddStaticVehicleEx(560,1534.8234,-1644.2198,5.5993,180.7832,0,0,-1); // schwarze sultan
    aiVehicles[3] = AddStaticVehicleEx(560,1538.7959,-1644.4210,5.5973,179.9981,1,1,-1); // weiße sultan
    aiVehicles[4] = AddStaticVehicleEx(523,1544.7985,-1650.9420,5.4494,88.3750,79,1,-1); // cop bike
    for(new i = 0 ; i < sizeof(aiVehicles) ; i++) {
    SetVehicleToRespawn( aiVehicles[i] );
    }
    return 1;
    }
    public OnVehicleSpawn( vehicleid ) {
    for(new i = 0 ; i < sizeof(aiVehicles) ; i++) {
    if( vehicleid == aiVehicles[i] ) {
    SetVehicleHealth( vehicleid, 2000.0 );
    }
    }
    return 1;
    }

    Das geht definitiv. Man könnte es aber auch direkt mit einer Schleife nach dem erstellen lösen.Dann brauch man aber trotzdem noch den Code unter OnVehicleSpawn.


    Nighthawk,wie soll deins überhaupt klappen.
    SetVehicleHealth(PolizeiVehs[ccar], 2000.0);
    Da wird immer von vehicleid 0 der Health-Wert auf 2000.0 gesetzt. Außerdem gibt es kein Fahrzeug mit der vehicleid 0. Dir fehlt zu dem Zeitpunkt noch die vehicleid des Fahrzeuges.