Beiträge von Alex_Steward

    Du erstellst eine Variable:


    new MotorOn[MAX_VEHICLES];
    new IsInCar[MAX_PLAYERS];


    Erstellst unter OnGameModeInit Fahrzeuge und fügst das hinzu:


    for(new c = 0; c<MAX_VEHICLES; c++)
    {
    MotorOn[code=c] = 0;
    }


    Unter OnPlayerConnect:


    IsInCar[playerid] = 0;


    Unter PLAYER_STATE_DRIVER:


    if(MotorOn[code=c] == 0)
    {
    SendClientMessage(playerid, COLOR_RED, "Der Motor ist aus, starte ihn mit /start!");
    TogglePlayerControllable(playerid, 0);
    IsInCar[playerid] = 1;
    }


    Unter OnPlayerCommand:


    if(strcmp(cmd, "/start", true) == 0)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    if(MotorOn[GetPlayerVehicleID(playerid)] == 0)
    {
    SendClientMessage(playerid, COLOR_GREEN, "Du hast den Motor gestartet!");
    MotorOn[GetPlayerVehicleID(playerid)] = 1;
    TogglePlayerControllable(playerid, 1);
    }
    else if(MotorOn[GetPlayerVehicleID(playerid)] == 1)
    {
    SendClientMessage(playerid, COLOR_RED, "Du hast den Motor ausgeschaltet!");
    MotorOn[GetPlayerVehicleID(playerid)] = 0;
    TogglePlayerControllable(playerid, 0);
    }
    }
    }


    Unter OnPlayerKeyStateChange:


    if(IsKeyJustDown(16, newkeys, oldkeys))
    {
    if(IsInCar[playerid] == 1)
    {
    TogglePlayerControllable(playerid, 1);
    RemovePlayerFromVehicle(playerid);
    IsInCar[playerid] = 0;
    }
    }


    Und das irgendwo unten im Script:


    IsKeyJustDown(key, newkeys, oldkeys)
    {
    if((newkeys & key) && !(oldkeys & key)) return 1;
    return 0;
    }

    Kein wunder


    format(string3, sizeof(string3), "/haeuser/%d.haus", i);


    Das darf so nicht sein, der erstellt dann für jede ID eine neue Datei.


    So würde er es nur in 1 Datei schreiben.


    format(string3, sizeof(string3), "haeuser.haus");

    Sehr oft treten mit ID 0 Fehler auf, bei mir ging das Tacho nicht, Leben war unverwundbar, laggen etc.


    Lad dir echt nen Bot drauf, ist wirklich besser. Hab ich auch gemacht, und hab es so gemacht, dass der unkickbar ist und sollte er die Verbindung verlieren, connectet er sich automatisch wieder drauf, wenn jemand die ID 0 bekommt, wird er gekickt und die Daten nicht abgespeichert. Hat mir wirklich viel gebracht.

    1. Erstell doch einfach vorher schon ein paar Strecken, indem du mit einem Fahrzeug durch die Stadt fährst und /save Strecke 1 Checkpoint 1 usw. machst.


    2. Bau dann ein Befehl, mit dem ein Spieler, einen anderen zum Rennen "einlädt".


    z.B. :


    new RaceStarted[MAX_PLAYERS];
    new RaceOffer[MAX_PLAYERS];
    new RaceReady[MAX_PLAYERS];


    //onplayerconnect


    RaceReady[playerid] = 0;
    RaceStarted[playerid] = 0;
    RaceOffer[playerid] = 999;



    //onplayercommandtext


    if(strcmp(cmd, "/invitetorace", true) == 0)
    {
    if(RaceStarted[playerid] == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GREY, "Befehl: /invitetorace [playerID/playerName]");
    return 1;
    }
    new gegner = ReturnUser(tmp);
    if(IsPlayerConnected(gegner))
    {
    if(gegner!= playerid)
    {
    new racestring[128];
    new gegnername[MAX_PLAYER_NAME];
    new meinname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, meinname, sizeof(meinname));
    GetPlayerName(gegner, gegnername, sizeof(gegnername));
    format(racestring, sizeof(racestring), "** %s lädt dich zu einem Rennen ein, bestätige mit ( /accept race ).", meinname);
    SendClientMessage(gegner, COLOR_LIGHTBLUE, racestring);
    format(racestring, sizeof(racestring), "** Du hast %s zu einem Rennen eingeladen, warte auf seine Antwort.", gegnername);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, racestring);
    RaceOffer[gegner] = playerid;
    RaceOffer[playerid] = playerid;
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Der Spieler ist Offline!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du machst bereits bei einem Rennen mit!");
    }
    }



    if(strcmp(cmd, "/accept", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GREY, "Befehl: /accept [Name]");
    SendClientMessage(playerid, COLOR_GREY, "Namen: Race");
    return 1;
    }
    if(strcmp(tmp, "race", true) == 0)
    {
    if(RaceOffer[playerid] < 999)
    {
    if(IsPlayerConnected(RaceOffer[playerid]))
    {
    new racestring[128];
    new gegnername[MAX_PLAYER_NAME];
    new meinname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, meinname, sizeof(meinname));
    GetPlayerName(RaceOffer[playerid], gegnername, sizeof(gegnername));
    format(racestring, sizeof(racestring), "** %s hat deine Einladung angenommen, starte das Rennen mit ( /startrace ).", meinname);
    SendClientMessage(RaceOffer[playerid], COLOR_LIGHTBLUE, racestring);
    format(racestring, sizeof(racestring), "** Du hast die Einladung von %s angenommen, warte, bis er das Rennen startet.", gegnername);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, racestring);
    RaceReady[RaceOffer[playerid]] = 1;
    return 1;
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Dein Renneinlader ist Offline!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Es hat dich niemand zu einem Rennen eingeladen!");
    }
    }
    }



    if(strcmp(cmd, "/startrace", true) == 0)
    {
    if(RaceReady[playerid] == 1)
    {
    for(new r = 0; r<MAX_PLAYERS; r++)
    {
    if(RaceOffer[r] == playerid)
    {
    SetPlayerPos(r, X, Y, Z);
    SendClientMessage(r, COLOR_GREEN, "** Das Rennen startet in 10 Sekunden!");
    ...
    }
    }
    }
    }


    Da kannst du halt machen was du willst, jeweils die Fahrer in ein Fahrzeug stecken oder was anderes, ist dir überlassen. Ist nur ein kleiner Gedankenanstoß ;)

    Ja ^^


    public SaveHouse()
    {
    for(new i = 0; i < MAX_HOUSE; i++)
    {
    new string3[32];
    format(string3, sizeof(string3), "/haeuser/%d.haus", i);
    new File: hFile = fopen(string3, io_write);
    if (hFile)
    {
    new var[32];
    format(var, 32, "Float:x=%f\n",house[i][Float:housex]);fwrite(hFile, var);
    format(var, 32, "Float:y=%f\n",house[i][Float:housey]);fwrite(hFile, var);
    format(var, 32, "Float:z=%f\n",house[i][Float:housez]);fwrite(hFile, var);
    format(var, 32, "Preis=%d\n",house[i][Preis]);fwrite(hFile, var);
    format(var, 32, "Interior=%d\n",house[i][Interior]);fwrite(hFile, var);
    format(var, 32, "Besitzer=%s\n",house[i][Besitzer]);fwrite(hFile, var);
    fclose(hFile);
    }
    }
    return 1;
    }

    Änder einfach das:


    new File: hFile = fopen("haeuser/%s.haus", i); // <--- Den Namen der Datei in " " eintragen


    In das:


    new File: hFile = fopen("haeuser.cfg", io_read); // <--- Den Namen der Datei in " " eintragen


    Und übernimm das:


    #define MAX_HOUSES XX //Bei XX die Zahl deiner Häuser insgesamt


    enum houseinfo
    {
    Float:hX,
    Float:hY,
    Float:hZ,
    Preis,
    Interior,
    Besitzer[MAX_PLAYER_NAME],
    };
    new house[MAX_HOUSES][houseinfo];


    Und passe deine SaveHouse Funktion an diese LoadHouse an:


    public LoadHouse()
    {
    for(new i = 0; i < MAX_HOUSES; i++)
    {
    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    new File: hFile = fopen("haeuser.cfg", io_read); // <--- Den Namen der Datei in " " eintragen
    if ( hFile )
    {
    while ( fread( hFile , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "x" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hX] = floatstr( val ); } //Um koordinaten, also Floats, auszulesen, muss man floatstr(val) verwenden
    if( strcmp( key , "y" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hY] = floatstr( val ); }
    if( strcmp( key , "z" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hZ] = floatstr( val ); }
    if( strcmp( key , "Preis" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Preis] = strval( val ); }
    if( strcmp( key , "Interior", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Interior] = strval ( val ); }
    if( strcmp( key , "Besitzer", true ) == 0 ) { val = ini_GetValue( Data ); strmid(house[i][Besitzer], val, 0, strlen(val)-1, 255); } //Arrays mit z.b Buchstabenwerten werden so ausgelesen
    CreatePickup(1242,23,house[i][hX],house[i][hY],house[i][hZ]);
    }
    fclose(hFile);
    }
    }


    Passe deine Daten an meine Funktion oben an -> hX, hY, hZ, anstatt x, y, z

    :D Du hast doch auch die definierten Variablen "key", "val" und "Data" auskommentiert, sprich " /* " bis " */ " verwendet. Das kommentiert einen Teil im Script aus, sodass dieser nicht berücksichtigt bzw. ausgeführt wird, als ob er gelöscht wäre. Entferne " /* " und " */ ".


    Also so, und string2 brauchst du nicht, kannst nämlich sofort den Dateinamen angeben. Dazu müssen die Koordinaten als floatstr entnommen werden und nicht als strval.


    Machs einfach so:



    #define MAX_HOUSES XX //Bei XX die Zahl deiner Häuser insgesamt


    enum houseinfo
    {
    Float:hX,
    Float:hY,
    Float:hZ,
    Preis,
    Interior,
    Besitzer[MAX_PLAYER_NAME], //Für einen Namen benötigst du eine Array mit vorher bestimmenen Größe, hier MAX_PLAYER_NAME
    };
    new house[MAX_HOUSES][houseinfo];


    public LoadHouse()
    {
    for(new i = 0; i < MAX_HOUSES; i++)
    {
    new key[ 256 ] , val[ 256 ];
    new Data[ 256 ];
    new File: hFile = fopen("DATEINAME", io_read); // <--- Den Namen der Datei in " " eintragen
    if ( hFile )
    {
    while ( fread( hFile , Data , sizeof( Data ) ) )
    {
    key = ini_GetKey( Data );
    if( strcmp( key , "x" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hX] = floatstr( val ); } //Um koordinaten, also Floats, auszulesen, muss man floatstr(val) verwenden
    if( strcmp( key , "y" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hY] = floatstr( val ); }
    if( strcmp( key , "z" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][hZ] = floatstr( val ); }
    if( strcmp( key , "Preis" , true ) == 0 ) { val = ini_GetValue( Data ); house[i][Preis] = strval( val ); }
    if( strcmp( key , "Interior", true ) == 0 ) { val = ini_GetValue( Data ); house[i][Interior] = strval ( val ); }
    if( strcmp( key , "Besitzer", true ) == 0 ) { val = ini_GetValue( Data ); strmid(house[i][Besitzer], val, 0, strlen(val)-1, 255); } //Arrays mit z.b Buchstabenwerten werden so ausgelesen
    CreatePickup(1242,23,house[i][hX],house[i][hY],house[i][hZ]);
    }
    fclose(hFile);
    }
    }

    Ist doch ganz leicht, warum probierst du es nicht selbst ?


    Dein 1. Wunsch kriegst du 100 % selbst hin.


    Zu deinem 2. Wunsch:



    //oben im FS


    new points1 = 0;
    new points2 = 0;
    new points3 = 0;
    new points4 = 0;
    new points5 = 0;
    new pointsall = 0;
    new Voted[MAX_PLAYERS];


    //onplayerconnect


    Voted[playerid] = 0;



    //onplayercommand

    if(strcmp(cmd, "/vote", true) == 0)
    {
    if(Voted[playerid] == 1)
    {
    SendClientMessage(playerid, COLOR_GREY, "Du hast bereits deine Stimme abgegeben!");
    return 1;
    }
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GREY, "Befehl: /vote [Nummer des Gamemodes]");
    SendClientMessage(playerid, COLOR_GRAD1, "Nr. 1 = GAMEMODENAME");
    SendClientMessage(playerid, COLOR_GRAD2, "Nr. 2 = GAMEMODENAME");
    SendClientMessage(playerid, COLOR_GRAD2, "Nr. 3 = GAMEMODENAME");
    SendClientMessage(playerid, COLOR_GRAD2, "Nr. 4 = GAMEMODENAME");
    SendClientMessage(playerid, COLOR_GRAD2, "Nr. 5 = GAMEMODENAME");
    return 1;
    }
    new number = strval(tmp);
    if(number < 1 || number > 5)
    {
    SendClientMessage(playerid, COLOR_GREY, "Wähle die Nummer nicht unter 1 oder über 5 !");
    return 1;
    }
    new string[256];
    new plname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, plname, sizeof(plname));
    if(number == 1)
    {
    points1 ++;
    pointsall ++;
    format(string, sizeof(string), "* %s hat für das GAMEMODENAME GM gevotet, Stimmen: [ %d Prozent ]",plname, (points1/pointsall*100));
    SendClientMessageToAll(COLOR_YELLOW, string);
    Voted[playerid] = 1;
    }
    else if(number == 2)
    {
    points2 ++;
    pointsall ++;
    format(string, sizeof(string), "* %s hat für das GAMEMODENAME GM gevotet, Stimmen: [ %d Prozent ]",plname, (points2/pointsall*100));
    SendClientMessageToAll(COLOR_YELLOW, string);
    Voted[playerid] = 1;
    }
    else if(number == 3)
    {
    points3 ++;
    pointsall ++;
    format(string, sizeof(string), "* %s hat für das GAMEMODENAME GM gevotet, Stimmen: [ %d Prozent ]",plname, (points3/pointsall*100));
    SendClientMessageToAll(COLOR_YELLOW, string);
    Voted[playerid] = 1;
    }
    else if(number == 4)
    {
    points4 ++;
    pointsall ++;
    format(string, sizeof(string), "* %s hat für das GAMEMODENAME GM gevotet, Stimmen: [ %d Prozent ]",plname, (points4/pointsall*100));
    SendClientMessageToAll(COLOR_YELLOW, string);
    Voted[playerid] = 1;
    }
    else if(number == 5)
    {
    points5 ++;
    pointsall ++;
    format(string, sizeof(string), "* %s hat für das GAMEMODENAME GM gevotet, Stimmen: [ %d Prozent ]",plname, (points5/pointsall*100));
    SendClientMessageToAll(COLOR_YELLOW, string);
    Voted[playerid] = 1;
    }
    }


    Das soll nur ein Gedankenanstoß sein, du kannst hier noch timer einfügen oder halt das, was du brauchst.

    public OnPlayerText(playerid, text[])
    {
    if(pInfo[playerid][Mute]== 1)
    {
    SendClientMessage(playerid,acmd,"Du bist gemuted bitte melde dich bei einem Admin(/admins).");
    return 1;
    }
    if(pInfo[playerid][Admin]> 0)
    {
    new admin[MAX_PLAYER_NAME], string[128];
    GetPlayerName(playerid,admin,sizeof(admin));
    format(string, sizeof(string), "Admin %s(ID:%d) sagt:%s",admin,playerid,text);
    SendClientMessageToAll(0xE30000FF, string);
    return 1;
    }
    else if(pInfo[playerid][premium]> 0)
    {
    new admin[MAX_PLAYER_NAME], string[128];
    GetPlayerName(playerid,admin,sizeof(admin));
    format(string, sizeof(string), "Premium Member %s(ID:%d) sagt:%s",admin,playerid,text);
    SendClientMessageToAll(0xFF9933FF, string);
    return 1;
    }
    else
    {
    new admin[MAX_PLAYER_NAME], string[128];
    GetPlayerName(playerid,admin,sizeof(admin));
    format(string, sizeof(string), "%s(ID:%d) sagt:%s",admin,playerid,text);
    SendClientMessageToAll(0x00FF99FF, string);
    return 1;
    }
    return 0;
    }

    1. Korrigier ich mich mal... die Spawnzeit wird in Sekunden angegeben, NICHT in Milisekunden :D


    Hmm kenn ich bei so vielen Fahrzeugen^^


    Wenn du zum Beispiel bei allen Fahrzeugen die selbe Spawnzeit benutzt hast, geht es leicht.


    Also, sagen wir du hast das hier:


    CreateVehicle(560, 1111.000, 2222.000, 3333.0000, 4444.0000, 1, 1, 600); // 600 ist ja hier die Spawnzeit


    Dann tippst du "Strg+H". Jetzt erscheint Fenster, dort gibst du oben einfach " 600); " ein und ins untere Feld " 5); ". Dann auf Ok. Wenn du jetzt auf "Yes to all" klickst, werden alle "600);" Einträge im Script gegen "5);" getauscht.

    Hey,


    also zu deiner 1. Frage:


    Unter OnGameModeInit:


    CreatePickup(Pickupid, Pickuptyp, X, Y, Z);


    http://wiki.sa-mp.de/Pickups <--- Dort findest du die Pickup-IDs und ganz unten die Pickuptypen für deine Pickups.


    Für eine Deserteagle, die sich dreht und aufnehmbar ist, müsstest du das Pickup so erstellen:


    CreatePickup(348, 2, X, Y, Z);





    Zu deiner 2. Frage:


    Irgendwo wird dir nicht viel bringen, du brauchst schon genaue Koordinaten, denn sonst kommen dir Motorräder und andere Fahrzeuge aufgrund eines Zufallsprinzips aus der Luft oder spawnen im Meer^^


    Aber wenn du bestimmte Koordinaten hast, kannst du das so definieren:


    new CarSpawnPoints[2][3] = {
    {1_X_Koordinate, 1_Y_Koordinate, 1_Z_Koordinate},
    {2_X_Koordinate, 2_Y_Koordinate, 2_Z_Koordinate}
    };


    new CarIDs[2][1] = {
    {560}, // <--- Sultan
    {522} // <---- NRG
    };


    // unter OnGameModeInit


    new rand = random(sizeof(CarSpawnPoints));
    new rand2 = random(sizeof(CarIDs));
    CreateVehicle(CarIDs[rand2][0], CarSpawnPoints[rand][0], CarSpawnPoints[rand][1], CarSpawnPoints[rand][2], FARBE1, FARBE2, SPAWNZEIT);


    Somit beim starten des Servers, kommt je nach Zufallsprinzip eine erstellte NRG oder ein erstellter Sultan, mit den 1. Koordinaten oder den 2. ;)



    Zu deiner 3. Frage kann ich dir leider nichts vorlegen.



    Ich hoffe ich konnte helfen.

    Also so wie ich dich verstanden habe, willst du einen Teleportbefehl, wobei du /warp army tippst und zu schon vorher im Script festgelegten Koordinaten geportet wirst ?


    Dann wäre es so unter "OnPlayerCommandText":


    if(strcmp(cmd, "/warp", true ) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GREY, "Befehl: /warp [Ortsname]");
    SendClientMessage(playerid, COLOR_GREY, "Ortsnamen: Army, LSPD");
    return 1;
    }
    if(strcmp(tmp, "army", true) == 0)
    {
    SetPlayerPos(playerid, X-KOORDINATE, Y-KOORDINATE, Z-KOORDINATE);
    SetPlayerInterior(playerid, INTERIOR-ID); // Wenn im freien, dann ID --> 0
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "* Du hast dich zur Army geportet.");
    return 1;
    }
    else if(strcmp(tmp, "lspd", true) == 0)
    {
    SetPlayerPos(playerid, X-KOORDINATE, Y-KOORDINATE, Z-KOORDINATE);
    SetPlayerInterior(playerid, INTERIOR-ID); // Wenn im freien, dann ID --> 0
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "* Du hast dich zur LSPD geportet.");
    return 1;
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Dieser Ortsname steht nicht zur Auswahl!");
    }
    }
    }



    Und wenn du "/warp army" eingeben willst und an Zufallskoordinaten geportet werden möchtest, die du im Script schon auch vorher festgelegt hast, dann kannst du das so machen:


    new ArmyPorts[2][4] = {
    {1_X_KOORDINATE, 1_Y_KOORDINATE, 1_Z_KOORDINATE, 1_INTERIOR_ID},
    {2_X_KOORDINATE, 2_Y_KOORDINATE, 2_Z_KOORDINATE, 2_INTERIOR_ID}
    };


    if(strcmp(cmd, "/warp", true ) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GREY, "Befehl: /warp [Ortsname]");
    SendClientMessage(playerid, COLOR_GREY, "Ortsnamen: Army");
    return 1;
    }
    if(strcmp(tmp, "army", true) == 0)
    {
    new rand = random(sizeof(ArmyPorts));
    SetPlayerPos(playerid, ArmyPorts[rand][0], ArmyPorts[rand][1], ArmyPorts[rand][2]);
    SetPlayerInterior(playerid, ArmyPorts[rand][4]);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "* Du hast dich zur Army geportet.");
    return 1;
    }
    }
    }