Beiträge von Jeffry

    COMMAND:lock(playerid,params[])
    {
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,GRAU,"Du kannst keine Befehle nutzen,da du im Tutorial bist.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,GRAU,"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,LEUCHTENDESROT,"Du bist abwesend gemeldet. /back - anwesend melden.");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,GRAU,"Du bist im Prison.");

    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,GRAU,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,GRAU,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,GRAU,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,GRAU,"Du bist gefesselt.");
    new Float:Pos[3],string[64];
    if(Spieler[playerid][pRentAVeh][1] != 0)
    {
    GetVehiclePos(RentVeh[playerid][1],Pos[0],Pos[1],Pos[2]);
    GetVehicleParamsEx(RentVeh[playerid][1],engine,lights,alarm,doors,bonnet,boot,objective);
    if(IsPlayerInRangeOfPoint(playerid,3.0,Pos[0],Pos[1],Pos[2]))
    {
    if(lockedveh[RentVeh[playerid][1]] == false)
    {
    SetVehicleParamsEx(RentVeh[playerid][1],engine,lights,alarm,VEHICLE_PARAMS_ON,bonnet,boot,objective);
    lockedveh[RentVeh[playerid][1]] = true;
    GameTextForPlayer(playerid,"~w~Mietfahrzeug ~r~abgeschlossen",2000,6);
    PlayerHearMusicInRange(Pos[0],Pos[1],Pos[2],1027,10,0,0);//x,y,z,soundid,radius,timer an = 1 wenn aus = 0,zeit wann timer music/sound beendet
    }
    else if(lockedveh[RentVeh[playerid][1]] == true)
    {
    SetVehicleParamsEx(RentVeh[playerid][1],engine,lights,alarm,VEHICLE_PARAMS_OFF,bonnet,boot,objective);
    lockedveh[RentVeh[playerid][1]] = false;
    GameTextForPlayer(playerid,"~w~Mietfahrzeug ~g~aufgeschlossen",2000,6);
    PlayerHearMusicInRange(Pos[0],Pos[1],Pos[2],1027,10,0,0);//x,y,z,soundid,radius,timer an = 1 wenn aus = 0,zeit wann timer music/sound beendet
    }
    return 1;
    }
    }
    if(!isPlayerInFrakt(playerid,0))
    {
    for(new fv;fv<MAX_FVEHS;fv++)
    {
    if(IsValidVehicle(Fahrzeug[fv][Vehicle]))
    {
    GetVehiclePos(Fahrzeug[fv][Vehicle],Pos[0],Pos[1],Pos[2]);
    GetVehicleParamsEx(Fahrzeug[fv][Vehicle],engine,lights,alarm,doors,bonnet,boot,objective);
    if(IsPlayerInRangeOfPoint(playerid,3.0,Pos[0],Pos[1],Pos[2]))
    {
    if(Fahrzeug[fv][Fraktion] == Spieler[playerid][pFraktion] && isPlayerAMember(playerid,Fahrzeug[fv][FraktionsRang]))
    {
    if(Fahrzeug[fv][Abgeschlossen] == 0)
    {
    SetVehicleParamsEx(Fahrzeug[fv][Vehicle],engine,lights,alarm,VEHICLE_PARAMS_ON,bonnet,boot,objective);
    Fahrzeug[fv][Abgeschlossen] = 1;
    format(string,sizeof(string),"~w~%s~n~~r~abgeschlossen",VehicleDefinations[Fahrzeug[fv][modelid]-400]);
    GameTextForPlayer(playerid,string,2000,6);
    PlayerHearMusicInRange(Pos[0],Pos[1],Pos[2],1027,10,0,0);//x,y,z,soundid,radius,timer an = 1 wenn aus = 0,zeit wann timer music/sound beendet
    return 1;
    }
    else if(Fahrzeug[fv][Abgeschlossen] == 1)
    {
    SetVehicleParamsEx(Fahrzeug[fv][Vehicle],engine,lights,alarm,VEHICLE_PARAMS_OFF,bonnet,boot,objective);
    Fahrzeug[fv][Abgeschlossen] = 0;
    format(string,sizeof(string),"~w~%s~n~~g~aufgeschlossen",VehicleDefinations[Fahrzeug[fv][modelid]-400]);
    GameTextForPlayer(playerid,string,2000,6);
    PlayerHearMusicInRange(Pos[0],Pos[1],Pos[2],1027,10,0,0);//x,y,z,soundid,radius,timer an = 1 wenn aus = 0,zeit wann timer music/sound beendet
    return 1;
    }
    }
    return SendClientMessage(playerid,GRAU,"Du besitzt nicht den jeweiligen Rang.");
    }
    }
    }
    }
    if(isPlayerAnAdmin(playerid,1))
    {
    for(new a=0;a<MAX_ADMINVEHS;a++)
    {
    GetVehiclePos(adminmobile[a],Pos[0],Pos[1],Pos[2]);
    GetVehicleParamsEx(adminmobile[a],engine,lights,alarm,doors,bonnet,boot,objective);
    if(IsPlayerInRangeOfPoint(playerid,3.0,Pos[0],Pos[1],Pos[2]))
    {
    if(lockedveh[adminmobile[a]] == false)
    {
    SetVehicleParamsEx(adminmobile[a],engine,lights,alarm,VEHICLE_PARAMS_ON,bonnet,boot,objective);
    lockedveh[adminmobile[a]] = true;
    GameTextForPlayer(playerid,"~w~Adminmobil~n~~r~abgeschlossen",2000,6);
    PlayerHearMusicInRange(Pos[0],Pos[1],Pos[2],1027,10,0,0);//x,y,z,soundid,radius,timer an = 1 wenn aus = 0,zeit wann timer music/sound beendet
    }
    else if(lockedveh[adminmobile[a]] == true)
    {
    SetVehicleParamsEx(adminmobile[a],engine,lights,alarm,VEHICLE_PARAMS_OFF,bonnet,boot,objective);
    lockedveh[adminmobile[a]] = false;
    GameTextForPlayer(playerid,"~w~Adminmobil~n~~g~aufgeschlossen",2000,6);
    PlayerHearMusicInRange(Pos[0],Pos[1],Pos[2],1027,10,0,0);//x,y,z,soundid,radius,timer an = 1 wenn aus = 0,zeit wann timer music/sound beendet
    }
    return 1;
    }
    }
    }
    return SendClientMessage(playerid,GRAU,"Du bist nicht in der Nähe eines Fahrzeugs, welches du schließen/öffnen darfst.");
    }

    stock Hardware(playerid, inputtext[])
    {
    new targetid = strval(inputtext), string[128], serial[45+4];
    gpci(targetid,serial,sizeof(serial));
    format(string, sizeof(string), "Die Spieler ID %d hat die HDD: %s.", targetid, serial);
    SendClientMessage(playerid,COLOR_YELLOW, string);
    return 1;
    }

    Würde es ein Problem darstellen, dass ich dieses LAdmin auf die 0.3.7 Version anpasse bzw erneuere?

    Ich denke das dürfte kein Problem sein. Es werden wahrscheinlich nur ein paar Anpassung notwendig, bezüglich Funktionen die mittlerweile nicht mehr existieren oder angepasst wurden.
    Ansonsten dürfte das noch relativ gut laufen, da es doch recht viel Basics ist.

    Prinzipiell ja, nur musst du bedenken, dass dies mittlerweile doch einige Jahre alt ist. LuxAdmin ist da etwas neuer. Eventuell gibt es mittlerweile auch noch neuere. Dafür ist LAdmin für heutige Verhältnisse recht einfach gehalten und nach wie vor zum Lernen recht gut geeignet.
    Es bietet sich auch an, dass Login und Register System auf MySQL anzupassen, falls gewünscht.

    Ich gebe dir ein paar gute Tipps wie du dir es selbst sehr gut beibringen kannst, so habe ich es zumindest vor ca. 8 Jahren gelernt (von null an, ohne Programmierkenntnisse aus anderen Sprachen).
    Du solltest auf jeden Fall, hinsichtlich der Lerneffizienz, vermeiden, einen vorhandenen Gamemode zu "vergewaltigen", dazu gehört zum einen ein größeres Grundwissen, welches man sich zuerst aufbauen muss, und zum anderen lernt man da nicht wirklich viel, wenn man nur in vorhandenen Codes herumspielt und nicht wirklich etwas selbst erstellt. Es ist zudem wesentlich einfacher Fehler an Dingen festzustellen, sofern vorhanden, die man selbst erstellt hat, als an Dingen, die man nicht gemacht hat und somit die Funktion nicht immer zu 100 Prozent nachvollziehen kann, bzw. auswendig kennt.


    Ich erkläre dir mal wie du am besten selbst lernen kannst, damit du in Zukunft auch verstehst, was dein Code macht, und wann du welchen Code benutzen bzw. ändern musst.
    Also ich habe PAWN gelernt, indem ich mir den LAdmin4v2 (damals sehr neu) genommen habe, und versucht habe, die einzelnen Teile zu verstehen. Dann habe ich einfach losgelegt, und überlegt, welcher Teil das macht, was ich will. Wollte ich zum Beispiel einen Befehl machen, der den Spieler an eine andere Position setzt, dann habe ich mir zum Beispiel den /slap Befehl angeschaut, da der Spieler dort entsprechend seiner Position woanders hingesetzt wird. Den Code hab ich mir dann angeschaut, und so für den neuen Code verändert, dass er seinen Zweck erfüllt hat. Damit also teilweise Copy & Paste, und teilweise eigenständige Arbeit. So kann man sich immer mehr zusammenbasteln.
    Das Gute an so einem Admin-Filterscript ist, dass man schon mal das ganze User-System (auf Dateien) hat, und eine Admin-Verwaltung. Das hilft enorm. Darauf lässt sich dann ein Gamemode wesentlich einfacher aufbauen.


    Wichtig:
    Fange klein an, jeder macht das, nimm nicht gleich einen Gamemode und verunstalte den, denn du wirst nichts kapieren. Ich arbeite nun knapp 8 Jahre mit PAWN und mein Wissen ist noch lange nicht komplett, im Gegenteil. Auch ich lerne an und an neue Dinge dazu.
    Falls dir jemand sagt, du sollst dir die PAWN Doc durchlesen, lass es, genauso rate ich dir davon ab das Wiki in allen Einzelteilen durchzulesen. Du wirst es nicht verstehen. Das kannst du in 3 Jahren machen, wenn du es verstehst, und selbst dann wirst du den Großteil in der PAWN Documentation nicht auf Anhieb verstehen, je nach dem natürlich auch wie gut dein Englisch ist.


    Noch was:
    Ausprobieren. Du kannst nichts kaputt machen. Das einzige was passieren kann, ist dass du Errors bekommst. Na und? Für was gibt es STRG+Z. Einfach probieren, wenn du nicht weiter kommst, frage nach Hilfe, über die Scritping Base findet sich sicher schnell jemand, der dir dann weiterhelfen kann.
    Learning By Doing nennt sich das, wie du es auch schon angesprochen hast. Nicht aufgeben, einfach machen machen machen. Das muss nicht immer perfekt sein, und muss auch nicht immer Sinn ergeben, Hauptsache du machst etwas. Zum Anfang kannst du dir zum Beispiel vornehmen, einen Filterscript der hier im Forum veröffentlicht wurde (einen einfachen) nachzubauen. Du musst ihn ja nicht auch veröffentlichen, aber nur zur Übung einfach nachmachen. Wenn du hängst, kannst du ja nachsehen, was falsch ist, bzw. wie es dort gemacht wurde.
    Das ist meiner Meinung nach besser als alles andere.


    Wie machst du das?
    Du suchst dir einen Filterscript der irgendwas macht, sei es ein Auto Spawn Menu.
    Schau dir zuerst mal an, was der Filterscript denn macht (z.B. ein Auto-Menu, um Auto's zu spawnen). Dann überlegst du, was du denn alles dafür brauchst, suchst dir die Funktionen zusammen (Google, SAMP Wiki) und legst los so ein Menu zu erstellen. Wenn du irgendwo hängst, kannst du einen Blick in den Code werfen, und ein paar Zeilen, die du denkst zu verstehen abschreiben, dann siehst du ja was passiert.
    Am besten ist es aber, wenn du es ganz ohne in den Code zu schauen hin bekommst, deshalb fange mit leichten Dingen an.


    Alternativ kannst du natürlich auch Tutorials durcharbeiten und dadurch lernen, sofern diese gut erklärt sind. Ich kann dich selbstverständlich an meine Tutorials (siehe Profilbeschreibung) verweisen, die habe ich versucht so ausführlich wie möglich zu erklären, damit man es leicht versteht und auch für andere Dinge nutzen kann, aber es gibt auch sonst noch viele andere Tutorials, mit denen man sehr viel lernt.


    Bis du erst mal richtig rein findest vergehen mit Sicherheit 1-3 Monate! Also nicht verzagen, du wirst am Anfang ziemlich oft stecken bleiben und auf die Nase fallen (ist wie laufen lernen). Ich weiß das von mir. Wenn du einmal drinnen bist, dann geht es jeden Tag besser.


    PS: Ich hab es ganz alleine gelernt. Die einzige Hilfestellung die ich damals hatte war ein /kill Command aus 6 Zeilen Code, den mir jemand gemacht hat.
    Das Wichtigste ist: Immer dranbleiben!


    Viel Erfolg! :good:

    Ich denke du sprengst das Array, durch das MAX_VEHICLES in der Schleife.
    Versuche es so:
    ocmd:motor(playerid)
    {
    print("0");
    if(!PlayerInfo[playerid][pEingeloggt])return SendClientMessage(playerid, COLOR_RED, "Du bist nicht eingeloggt.");
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)return SendClientMessage(playerid, COLOR_RED, "Du bist nicht Fahrer eines Fahrzeuges!");
    new string[128];
    print("1");
    switch(vState[myvID][vEngine])
    {
    case false:
    {
    for(new i;i<sizeof(policeCars);i++)
    {
    if(!i)print("2");
    if(myvID == policeCars[i][c_id])
    {
    print("3");
    if(policeCars[i][c_tank] < 0.1)
    {
    print("4");
    SendClientMessage(playerid, COLOR_RED, "Dein Tank ist leer!");
    return 1;
    }
    }
    }
    for(new i;i<sizeof(vState);i++)
    {
    if(myvID == vState[i][vCID] && vState[i][vACL] == false)
    {
    print("5");
    if(vState[i][vTank] < 0.1)
    {
    print("6");
    SendClientMessage(playerid, COLOR_RED, "Dein Tank ist leer!");
    return 1;
    }
    }
    }
    print("7");
    SetVehicleState(myvID, STATE_ENGINE, true), format(string, sizeof string, "** %s hat den Motor gestartet **", getPlayerName(playerid)),
    SendLocalChat(playerid, 20.0, COLOR_PURPLE, string), SetPlayerChatBubble(playerid, string, COLOR_PURPLE, 40.0, 2500);
    }
    case true:
    {
    SetVehicleState(myvID, STATE_ENGINE, false), format(string, sizeof string, "** %s hat den Motor gestoppt **", getPlayerName(playerid)),
    SendLocalChat(playerid, 20.0, COLOR_PURPLE, string), SetPlayerChatBubble(playerid, string, COLOR_PURPLE, 40.0, 2500);
    }
    }
    string[0] = '\0';
    return 1;
    }

    Alles was zu machen ist:
    SetSpawnInfo(playerid,0,SP[playerid][ZiviSkin],SP[playerid][posx],SP[playerid][posy],SP[playerid][posz],0,0,0,0,0,0);
    Bei OnPlayerRequestClass entfernen.


    Bei BenutzerEinloggen:
    SpielerEinloggen(playerid); // hier lasse ich ihn spawnen
    zu:
    SetSpawnInfo(playerid,0,SP[playerid][ZiviSkin],SP[playerid][posx],SP[playerid][posy],SP[playerid][posz],0,0,0,0,0,0);
    SpielerEinloggen(playerid); // hier lasse ich ihn spawnen


    Grund:
    Bei OnPlayerRequestClass ist der ZiviSkin noch nicht geladen.

    Ja.


    Unter den Includes:
    new playerDrivesTrain[MAX_PLAYERS];


    Beim Einsteigen in den Zug als Lockführer:
    playerDrivesTrain[playerid] = vehicleid;


    Beim Aussteigen aus dem Zug als Lockführer:
    if(playerDrivesTrain[playerid] != 0)
    {
    new Float:x, Float:y, Float:z;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerVehicleID(i) == playerDrivesTrain[playerid] + 1) //+1 = Wagon
    {
    GetPlayerPos(i,x,y,z);
    SetPlayerPos(i,x+2,y+2,z+2);
    Spieler[i][pTicket] = false;
    SCM(i,GELB, "Kein Lockführer mehr!");
    }
    }
    playerDrivesTrain[playerid] = 0;
    }

    new idx = GetVehicleSlot(playerid, GetPlayerVehicleID(playerid));

    Beim Speichern in die Garage ist das hier falsch. Du darfst nicht dem dem Slot des Fahrzeugs suchen, sondern musst einen leeren Slot suchen.
    Sprich:
    new idx = GetVehicleSlot(playerid, 0);



    Ich habe Zwei Autos in der Garage aber ich kann nur eins rausholen.

    Dein Code holt immer alle Autos raus.
    Schreibe es so:
    if(dialogid == DIALOG_GARAGE2)
    {
    if(response == 1)
    {
    new slot, count;
    for(new i=0;i<MAX_PLAYER_VEHS;i++)
    {
    if(PrivatCarInfo[i][playerid][pfStored] == 1)
    {
    if(count == listitem)
    {
    slot = i;
    break;
    }
    }
    }
    PrivatCarInfo[slot][playerid][pf_IDx] = CreateVehicle(PrivatCarInfo[slot][playerid][pfModel], HouseInfo[house][hgX], HouseInfo[house][hgY], HouseInfo[house][hgZ], PrivatCarInfo[slot][playerid][pfR], PrivatCarInfo[slot][playerid][pfCarColor1], PrivatCarInfo[slot][playerid][pfCarColor2], 0);
    Tankmenge[PrivatCarInfo[slot][playerid][pf_IDx]] = GasMax[GetVehicleModel(PrivatCarInfo[slot][playerid][pf_IDx])-400];
    format(string,sizeof(string),"%s", PrivatCarInfo[slot][playerid][pfKennzeichen]);
    SetVehicleNumberPlate(PrivatCarInfo[slot][playerid][pf_IDx], string);
    HouseInfo[house][hgInside] --;
    PrivatCarInfo[slot][playerid][pfStored] = 0;
    SendClientMessage(playerid, COLOR_GREEN, "[GARAGE] Fahrzeug wurde erfolgreich aus der Garage rausgeholt.");
    PutPlayerInVehicle(playerid, PrivatCarInfo[slot][playerid][pf_IDx], 0);
    mysql_format(handle, query, sizeof(query), "UPDATE privatcars SET pfStored='%i' WHERE ID='%i'", PrivatCarInfo[slot][playerid][pfStored], PrivatCarInfo[slot][playerid][pf_ID]);
    printf("query: %s", query);
    mysql_pquery(handle, query);
    UpdateHouse(house);
    SaveHouse(house);
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE, DIALOG_STYLE_TABLIST_HEADERS, "{FFFF00}Garagenmenü",
    "#\tOption\n\
    {FFFF00}1.\t{FFFFFF}Parken\n\
    {FFFF00}2.\t{FFFFFF}Rausnehmen", "Auswählen", "Abbrechen");
    }
    }

    Das ist mir klar.
    Laut deiner Aussage in Post #57 erstelltest du allerdings nur ein Fahrzeug, somit eine ID.


    Da es zwei Fahrzeuge sind, ändert das die Sache.


    Es ist wichtig, dass der Zug eine ID weniger als die Wagons haben, dann kannst du es wie in Post #68 beschrieben machen, mit -1 nur bei den Zügen.

    Der Fahrer sitzt in der vehicleid 146.
    Wenn das tatsächlich das gleiche Fahrzeug ist, dann kannst du es nur bei Zügen so prüfen:
    new driver = GetVehicleDriver(GetPlayerVehicleID(playerid)-1);

    Beim Kauf musst du entsprechend prüfen, bei welchem slot die vehicleid 0 ist, sprich welcher leer ist.

    Hierfür ja.



    Mit der GetVehicleIdx Funktion aus Post #8. Die kannst du ja auch zu GetVehicleSlot umbenennen.

    Hierfür nein. Hier musst du prüfen, ob die vehicleid mit der aus dem Array passt.
    Funktion siehe Post #8 (habe das gerade nochmal angepasst, da ich die playerid vergessen hatte).
    Vom Prinzip her ähnlich wie deine Funktion, nur dass du nicht gegen 0 prüfst, sondern gegen die vehicleid:
    getCarID(playerid, vehicleid)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    if(PrivatCarInfo[slot][playerid][pf_IDx]==vehicleid)return slot;
    }
    return -1;
    }



    Achte außerdem darauf, dass du in beiden Funktionen nicht 0 am Ende zurück gibst. 0 ist auch ein slot, nämlich der erste.

    [19:24:15] GetVehicleDriver: i: 0 / State: 2 / veh: 146 / vehicleid: 146


    Beim dritten Versuch hat es geklappt?
    Hier passen die Werte und es wird auch kein INVALID_PLAYER_ID zurück gegeben.


    Zuvor warst du im Fahrzeug mit der ID 147 und der Fahrer im Fahrzeug mit der ID 146 (schalte /dl ein, dann siehst du die IDs).

    Was wird dir im Server Log ausgegeben, wenn du in den Zug als Beifahrer mit Lockführer einsteigst, wenn du es so schreibst:
    stock GetVehicleDriver(vehicleid)
    {
    ForEachPlayer(i)
    {
    printf("GetVehicleDriver: i: %d / State: %d / veh: %d / vehicleid: %d", i, GetPlayerState(i), GetPlayerVehicleID(i), vehicleid);
    if(IsPlayerConnected(i) && GetPlayerState(i) == PLAYER_STATE_DRIVER && GetPlayerVehicleID(i) == vehicleid) return i;
    }
    printf("return INVALID_PLAYER_ID");
    return INVALID_PLAYER_ID;
    }