Beiträge von Jeffry

    Ich bin davon ausgegangen, dass du da noch mehr machst/hast, vor allem deswegen, weil du das Textdraw dort auch noch nicht entfernst. Egal.
    An sich fehlt da nur das return in der if-Ebene:
    forward CountDownObjekte(playerid, count);
    public CountDownObjekte(playerid, count)
    {
    count--;
    if(count <= 0)
    {
    KillTimer(countTimer);
    countTimer = -1;
    //Hier die Objekte erstellen
    gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
    SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000);
    SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    TextDrawHideForPlayer(playerid, Textdraw0);
    return 1;
    }
    new str[16];
    format(str, sizeof(str), "Countdown: %d", count);
    TextDrawSetString(Textdraw0, str);
    TextDrawShowForPlayer(playerid, Textdraw0);
    countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, count);
    return 1;
    }


    Zwecks den Markierungen:
    Darfst du gerne machen. Falls ich es mal übersehe, einfach eine PN mit dem Link schicken. ;)

    Wahrscheinlich ist das ein Mod, der das Zeichen so anzeigt, weil auf dem Screenshot findet sich ja fast nichts was nicht gemoddet ist.
    An sich wäre sowas in der Art zwar möglich, aber ob man es so gut hinbekommt bezweifle ich. Du könntest es mit den Preview Models von TextDraws versuchen, das wäre die einzige Möglichkeit vielleicht etwas ähnliches hinzubekommen.

    Ne Ahnung warum meins nicht funktioniert? 1 älterer Post über uns von mir.


    Hab ich übersehen, sorry. Danke für die Nachfrage.
    Hatte in dem Code vergessen, dass der Timer ja neu gestartet werden muss.


    Schreibe es so:
    forward CountDownObjekte(playerid, count);
    public CountDownObjekte(playerid, count)
    {
    count--;
    if(count <= 0)
    {
    KillTimer(countTimer);
    countTimer = -1;
    //Hier die Objekte erstellen
    gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000);
    SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000);
    SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0);
    SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1);
    }
    new str[16];
    format(str, sizeof(str), "Countdown: %d", count);
    TextDrawSetString(Textdraw0, str);
    TextDrawShowForPlayer(playerid, Textdraw0);
    countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, count);
    return 1;
    }


    CMD:ecountdown(playerid,params[])
    {
    if(countTimer != -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Countdown ist bereits an.");
    if(!params[0]) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit ein.");
    new time = strval(params);
    if(time < 1 || time > 60) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit zwischen 1 und 60 ein.");
    countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, time);
    return 1;
    }

    Ändere die for-Schleifen jeweils zu:
    for(new i = 0; i < MAX_VEHICLES; i++)


    Das hier zu:
    public LadeFahrzeug(idx)
    {
    new str[25];
    format(str, sizeof(str), "/Vehicles/%d.car", idx);


    if(idx < 0)
    {
    return 1;
    }
    if(fexist(str))
    {
    CarInfo[idx][cX] = dini_Float(str, "cX");
    CarInfo[idx][cY] = dini_Float(str, "cY");
    CarInfo[idx][cZ] = dini_Float(str, "cZ");
    CarInfo[idx][cR] = dini_Float(str, "cR");
    CarInfo[idx][cModel] = dini_Int(str, "cModel");
    //tuning
    CarInfo[idx][tuning_0] = dini_Int(str, "tuning_0");
    CarInfo[idx][tuning_1] = dini_Int(str, "tuning_1");
    CarInfo[idx][tuning_2] = dini_Int(str, "tuning_2");
    CarInfo[idx][tuning_3] = dini_Int(str, "tuning_3");
    CarInfo[idx][tuning_4] = dini_Int(str, "tuning_4");
    CarInfo[idx][tuning_5] = dini_Int(str, "tuning_5");
    CarInfo[idx][tuning_6] = dini_Int(str, "tuning_6");
    CarInfo[idx][tuning_7] = dini_Int(str, "tuning_7");
    CarInfo[idx][tuning_8] = dini_Int(str, "tuning_8");
    CarInfo[idx][tuning_9] = dini_Int(str, "tuning_9");
    CarInfo[idx][tuning_10] = dini_Int(str, "tuning_10");
    CarInfo[idx][tuning_11] = dini_Int(str, "tuning_11");
    CarInfo[idx][tuning_12] = dini_Int(str, "tuning_12");
    CarInfo[idx][tuning_13] = dini_Int(str, "tuning_13");
    CarInfo[idx][color_1] = dini_Int(str, "color_1");
    CarInfo[idx][color_2] = dini_Int(str, "color_2");
    CarInfo[idx][paintjob] = dini_Int(str, "paintjob");
    }
    return 1;
    }


    Hier müssen wir einen freien Slot (Index) finden, daher die Funktion GetFreeVehSlot:
    public sellCarInShop(playerid, carPrice, carName[], model)
    {
    //Hier wird ein Fahrzeug erstellt und eingetragen wenn es im Shop gekauft wird (also wenn der Shop ein Auto an den Spieler verkauft)


    if(GetPlayerMoney(playerid) >= carPrice)
    {
    if(PlayerInfo[playerid][pCar1] == 0 || PlayerInfo[playerid][pCar2] == 0 || PlayerInfo[playerid][pCar3] == 0 || PlayerInfo[playerid][pCar4] == 0)
    {


    new vehID = CreateVehicle(model, -1917.0745, 296.8005, 41.0469, 178.7229, 0, 0, 0);
    PutPlayerInVehicle(playerid, vehID, 0);
    new idx = GetFreeVehSlot();
    if(idx == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit erreicht.");


    CarInfo[idx][cID] = vehID;
    CarInfo[idx][cModel] = 411;
    CarInfo[idx][cX] = 0;
    CarInfo[idx][cY] = 0;
    CarInfo[idx][cZ] = 10;
    CarInfo[idx][cR] = 0;


    if(PlayerInfo[playerid][pCar1] == 0){
    PlayerInfo[playerid][pCar1] = CarInfo[idx][cID];

    } else if(PlayerInfo[playerid][pCar2] == 0){
    PlayerInfo[playerid][pCar2] = CarInfo[idx][cID];


    } else if(PlayerInfo[playerid][pCar3] == 0){
    PlayerInfo[playerid][pCar3] = CarInfo[idx][cID];


    } else if(PlayerInfo[playerid][pCar4] == 0){
    PlayerInfo[playerid][pCar4] = CarInfo[idx][cID];
    }


    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid, PlayerInfo[playerid][pGeld] - carPrice);


    PlayerInfo[playerid][pGeld] = GetPlayerMoney(playerid);


    new string[128];
    format(string, sizeof(string), "Du hast dir erfolgreich einen %s gekauft.", carName);
    SendClientMessage(playerid, COLOR_GREEN, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "[SHOP] Du hast keinen Fahrzeug Slot mehr frei!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "[SHOP] Du hast nicht genug Geld dabei!");
    }
    return 1;
    }


    Das hier so:
    public SpeicherFahrzeug(idx)
    {
    if(idx < 0)
    {
    return 1;
    }
    CarInfo[idx][cModel] = GetVehicleModel(CarInfo[idx][cID]);
    if(CarInfo[idx][cModel] == 0) return 1;
    new str[25];
    format(str, sizeof(str), "/Vehicles/%d.car", idx);
    dini_Create(str);


    dini_FloatSet(str,"cX", CarInfo[idx][cX]);
    dini_FloatSet(str,"cY", CarInfo[idx][cY]);
    dini_FloatSet(str,"cZ", CarInfo[idx][cZ]);
    dini_FloatSet(str,"cR", CarInfo[idx][cR]);
    dini_IntSet(str,"cModel",CarInfo[idx][cModel]);
    //tuning
    dini_IntSet(str, "tuning_0", CarInfo[idx][tuning_0]);
    dini_IntSet(str, "tuning_1", CarInfo[idx][tuning_1]);
    dini_IntSet(str, "tuning_2", CarInfo[idx][tuning_2]);
    dini_IntSet(str, "tuning_3", CarInfo[idx][tuning_3]);
    dini_IntSet(str, "tuning_4", CarInfo[idx][tuning_4]);
    dini_IntSet(str, "tuning_5", CarInfo[idx][tuning_5]);
    dini_IntSet(str, "tuning_6", CarInfo[idx][tuning_6]);
    dini_IntSet(str, "tuning_7", CarInfo[idx][tuning_7]);
    dini_IntSet(str, "tuning_8", CarInfo[idx][tuning_8]);
    dini_IntSet(str, "tuning_9", CarInfo[idx][tuning_9]);
    dini_IntSet(str, "tuning_10", CarInfo[idx][tuning_10]);
    dini_IntSet(str, "tuning_11", CarInfo[idx][tuning_11]);
    dini_IntSet(str, "tuning_12", CarInfo[idx][tuning_12]);
    dini_IntSet(str, "tuning_13", CarInfo[idx][tuning_13]);
    dini_IntSet(str, "color_1", CarInfo[idx][color_1]);
    dini_IntSet(str, "color_2", CarInfo[idx][color_2]);
    dini_IntSet(str, "paintjob", CarInfo[idx][paintjob]);


    return 1;
    }


    Und den Motor Befehl so, wobei ich davon ausgehe, dass du Motor und Tank nicht speicherst:
    dcmd_motor(playerid, params[])
    {
    //motor befehl
    #pragma unused params


    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new vehID = GetPlayerVehicleID(playerid);
    if(PlayerInfo[playerid][pCar1] == vehID || PlayerInfo[playerid][pCar2] == vehID || PlayerInfo[playerid][pCar3] == vehID || PlayerInfo[playerid][pCar4] == vehID)
    {
    if(GetVehicleModel(vehID) == 509 || GetVehicleModel(vehID) == 481 || GetVehicleModel(vehID) == 510)
    {
    SendClientMessage(playerid, COLOR_RED, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
    }


    else if (Tank[vehID] < 1)
    {
    SendClientMessage(playerid, COLOR_RED, "Der Tank ist leer. Du musst erst /tanken.");
    }


    else if (Motor[vehID] == false )
    {
    GetVehicleParamsEx(vehID,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vehID,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[vehID] = true; // Setzt den Bool Motor auf true
    }


    else
    {
    GetVehicleParamsEx(vehID,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vehID,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[vehID] = false; // Setzt den Bool wieder auf falsch zurück.
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Dein Schlüssel passt hier nicht!");
    }
    }
    return 1;
    }


    Diese beiden Funktionen brauchst du noch. Letztere haben wir bis hier hin zwar noch nicht verwendet, aber die wirst du sicher mal brauchen, wenn du von der vehicleid (das was GetPlayerVehicleID zurück gibt) auf den Index (Slot) zugreifen willst.
    stock GetFreeVehSlot()
    {
    for(new i=0; i<sizeof(CarInfo); i++)
    {
    if(CarInfo[i][cID] == 0) return i;
    }
    return -1;
    }


    stock GetVehSlot(vehID)
    {
    for(new i=0; i<sizeof(CarInfo); i++)
    {
    if(CarInfo[i][cID] == vehID) return i;
    }
    return -1;
    }


    Das Prinzip dahinter ist eben, dass du es über den Slot (Index) speicherst und nicht den Index gleich der Vehicle ID setzt.

    Das wird ja automatisch übersprungen, wenn dein Loop so aussieht:
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(damageMade[playerA][i] > 0)
    {
    //i hat playerA einen Damage gegeben
    }
    }
    Denn wenn playerA == i wäre UND der Damage > 0, dann würde etwas nicht stimmen, der Spieler hätte sich dann selbst einen Schaden zuegfügt, was ja nicht geht.


    Beachte, dass du beim geben des Damages natürlich aufpassen musst, wenn der Schaden-Gebende-Spieler INVALID_PLAYER_ID ist.
    if(playerX != INVALID_PLAYER_ID) damageMade[playerA][playerX] += damage;


    Und beim Respawn musst du natürlich alle damageMade's des Spielers wieder auf 0 setzen, sollte klar sein. ;)

    Nein, denn angenommen dein MAX_PLAYERS ist 50, und playerA ist ID 1 und playerX ist ID 49. Selbes Beispiel, playerX fügt playerA Schaden zu:
    Das sähe dann so aus:
    damageMade[1][49] += damage;
    Da du aber MAX_PLAYERS-1 machst, ist der höchste zweite Index dann nicht mehr 49 (da 0bis49 = 50), sondern 48 (da 0bis48 = 50-1=49).


    Daher darf das -1 da nicht sein.

    Das kannst du einfach mit einem zweidimensionalen Array machen:
    new Float:damageMade[MAX_PLAYERS][MAX_PLAYERS];


    Angenommen "playerX" gibt "playerA" einen Damage, dann siehst das so aus:
    damageMade[playerA][playerX] += 10.0;


    Stirbt nun playerA, dann kannst du einfach durch den zweiten Index loopen und so alle Spieler herausfinden, die mehr als 0 Damage gegeben haben.
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(damageMade[playerA][i] > 0)
    {
    //i hat playerA einen Damage gegeben
    }
    }

    Der Fehler kann mehrere Gründe haben angefangen dort, dass der User in der Datenbank nicht existiert und aufgehört dort, dass du die Daten nur falsch eingetippt hast.


    Prüfe mal Folgendes:
    1.) Ändere localhost zu 127.0.0.1 bzw. andersherum. Geht es dann?
    2.) Falls nicht, prüfe ob du manuell auf die Datenbank kommst (NaviCat / phpMyAdmin / ...), falls ja, stimmen diese Logindaten mit denen im Code überein?
    3.) Ist das Passwort leer? Wenn ja, ändere über NaviCat/phpMyAdmin das root-Passwort zu etwas nicht-leerem und gebe das Passwort dann in deinem Code ein.
    4.) Hast du möglicherweise keine Berechtigungen vergeben, dass man auf die Datenbank zugreifen kann?


    Falls nichts davon hilft, schaue im Log nach was dort als Fehler kommt, wenn du die Verbindung zur Datenbank aufbauen willst.

    Uhh, Klartext ohne ihn zu escapen ist ganz böse, das kann einen ziemlichen SQL Inject verursachen.
    forward ITDB(playerid);
    public ITDB(playerid)
    {
    new query[256],password[32],ipadress[16];
    GetPVarString(playerid,"password",password,32);
    GetPVarString(playerid,"ip",ipadress,16);
    mysql_format(dbhandle, query,sizeof(query),"INSERT INTO `users` (`username`, `passwort`, `IP`) VALUES ('%e', '%e', '%e')",Spielername(playerid),password,ipadress);
    mysql_function_query(dbhandle,query,false,"","");
    SendClientMessage(playerid,-1,"Du wurdest erfolgreich eingeloggt.");
    return 1;
    }


    mysql_format anstatt format verwenden, und %e anstatt %s.

    Ok, dann mache folgendes.
    Nimm das
    #include <ForAllPlayers>
    aus deinem Code raus.


    Dann füge unter den Includes das ein:
    #define ForAllPlayers(%0) for(new index_%0=0,%0=ConnectedPlayerList[0]; index_%0<ConnectedPlayers; index_%0++,%0=ConnectedPlayerList[index_%0])


    new ConnectedPlayers;
    new ConnectedPlayerList[MAX_PLAYERS+1];


    Das hier fügst du bei OnPlayerConnect ein:
    if(!IsPlayerNPC(playerid)) AddPlayer(playerid);


    Das bei OnPlayerDisconnect:
    if(!IsPlayerNPC(playerid)) RemovePlayer(playerid);


    Und das hier ganz unten im Gamemode:
    stock AddPlayer(playerid){
    if(ConnectedPlayers>=MAX_PLAYERS || playerid<0 || playerid>=MAX_PLAYERS) return 0;
    ConnectedPlayerList[ConnectedPlayers++]=playerid;
    return 1;
    }


    stock RemovePlayer(playerid){
    for(new i;i<ConnectedPlayers;i++){
    if(ConnectedPlayerList[i]==playerid){
    ConnectedPlayers--;
    ConnectedPlayerList[i]=ConnectedPlayerList[ConnectedPlayers];
    return 1;
    }
    }return 0;
    }



    und wie kann man server slots im script einstellen


    Die Slots des Servers ändern, das was im SA-MP Client angezeigt wird? Das geht nicht, das musst du in der server.cfg machen.