Beiträge von [COE]CodeX

    if(!strcmp("/admins",cmdtext,true))
    {
    new buffer[30],string[64];
    SendClientMessage(playerid,weis,"Administartoren und Supporter");
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    switch(GetPVarInt(i,"Adminrang"))
    {
    case 0:{continue;}
    case 1:{buffer="Probe-Supporter";}
    case 2:{buffer="Supporter";}
    case 3:{buffer="Moderator";}
    case 4:{buffer="Super-Moderator";}
    case 5:{buffer="Administartor";}
    case 6:{buffer="Projektleiter";}
    }
    format(string,sizeof(string),"%s : %s",buffer,SpielerName(i));
    SendClientMessage(playerid,BLAU,string);
    }
    }
    return 1;
    }


    Probier das mal so
    /edit: ehm ...sorry fail eingerückt :S

    Also es hört sich gut an und ich hab mal 2 Fragen dazu


    1. Man könnte ja dann zu 2. an einem Script scripten oder? Es ist ja ne OnlineEntwicklungsumgebung....
    2. Wie sieht das aus die Scripts werden doch auf nem Server gespeicher oder?
    Eventuell wegen der Gefahr das jeder der Server Zugriff hat Scripte abzieht

    Probier es mal so ;)
    Ich bin mir nur gerade nicht sicher ob das mit dem Variablen "mitgeben" beim Timer so stimmt^^
    ocmd:kick(playerid,params[])
    {
    if(!isPlayerAnAdmin(playerid,2))return SendClientMessage(playerid,ROT,"[ERROR] Du bist kein Admin Rang 2!");
    new pID, reason[128], string[128];
    if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,BLAU,"[ERROR] Eingeben: /kick [ID] [Grund]");
    format(string,sizeof(string),"AdmCmd: %s wurde von %s gekickt. Grund: %s",pSpielerName(pID),pSpielerName(playerid),reason);
    SendClientMessageToAll(ROT,string);
    SetTimerEx("KickTimer",500,false,"i",pID);
    return 1;
    }
    forward KickTimer(playerid);
    public KickTimer(playerid)
    {
    Kick(playerid);
    }

    mach das mal so :thumbup:

    //Irgendwo oben im Script
    new supcar[MAX_PLAYERS];



    if(dialogid==DIALOG_SUPCAR)
    {
    if(response==0)
    {
    }
    if(response==1)
    {
    new Float:Pos[4];
    if(listitem==0)
    {
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    GetPlayerfacinAngle(playerid,Pos[4]);
    supcar[playerid] = CreateVehicle(560,Pos[0],Pos[1],Pos[2],Pos[4],1,1,-1);
    PutPlayerinVehicle(playerid,supcar[playerid],0);
    }
    }
    return 1;
    }
    Wir deklarieren supcar[playerid] als das erstelltze Fahrzeug


    Die Funktion heißt PutPlayerInVehicle(playerid,vehicleid,seatid)
    playerid = der ausführende
    vehicleid ist NICHT die ModelID sondern supcar was du nun oben deklariert hast
    seatid ist der Sitzplatz( 0 = Fahrer)


    /edit: Verbessert
    @Mydayyy<3
    Wozu ermittelst du den namen des Spielers? :huh: Du benutzt ihn ja nicht einmal
    Und Wozu der rießige unnötige string den du auch nicht benutzt?

    kannst höchstens mit SetMaterialText auf 3 seiten ein unsichtbares objekt erstellen. anders wüsste ich nicht wie das gehen soll.

    Wie?
    Ich bin nicht so bewandert mit den Objekt Funktionen aber ist SetObjectMaterialtext nicht dazu da Text auf ein Objekt zu "schreiben" oder kann man das auch anders verwenden?


    /edit: @Chillikekse naja aber wenn ich das für alle Autos mache komm ich glaube gleich besser sie sowieso jede Minute zu respawnen

    Ja die Idee hatte ich auch
    Aber ich bin mir unsicher ob das zu Laggs führt, weil ich hab zum Beispiel die Autohäuser so aufgebaut, dass man in die Wagen einsteigen kann muss und da könnte man sie eben auch verschieben aber wenn ich die aller einer Minuten respawne hab ich keine Vorstellung ob das Ressourcenfressen ist oder nicht

    Hey ich wollte fragen ob es möglich ist zu unterbinden, dass ein Spieler ein Auto ohne Probleme wegschieben kann wenn niemadn im Auto sitzt.
    Ich denke, dass man das nicht ändern kann, weil es ja im SinglePlayer auch geht aber ich wollte mal nachfragen um sicher zu gehen^^


    MfG
    [COE]CodeX

    Ja schon denn das ersetzt die Platzhalter %s mit den verschiedenen Namen und dem Grund
    (Ich hab das nur aus nem GM von mir kopiert und da war es noch drin^^)
    Schau nochmal in meinen Befehl ich habs geändert mit der Funktion Spielername die hast du ja wie ich weiß auch schon ;)

    CMD:kick(playerid,params[])
    {
    if(!IstSpielerAdmin(playerid,2))return SCM(playerid,rot,"Du hast nicht den nötigen Adminrang");
    new pID, reason[64],string[128];
    if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,rot,"Benutze /kick [ID] [Grund]");
    format(string,sizeof(string),"%s wurde von %s gekickt. Grund: %s",Spielername(pID),Spielername(playerid),reason);
    SCMTA(rot,string);
    Kick(pID);
    return 1;
    }


    Erklärung kommt gleich :whistling:
    Oben kommt eben die Adminabfrage ich kenne sie ja aus deinem Script^^
    1. Wenn der der den Command ausführt nicht das Adminlevel 2 oder höher hat wird der Command abgebrochen und ihm wird ne Nachricht ausgegeben, dass er nicht den benötigten Adminrang hat
    2. Wir deklarieren 3 Variablen
    pID reflektiert den Spieler den wir kicken möchten
    reason(deutsch = Grund) steht für den Grund warum wie den Spieler kicken
    und string ist eben die allgemeine Nachricht die dann an alle geschickt wird
    3. Die sscanf Abfrage
    "us" stehen für die Parameter der Abfrage
    u = User heißt man muss eine UserID oder den Namen eines Users angeben und die
    s = ist ein string in unserem Fall der string "reason" also der grund warum wie den Spieler kicken
    und u und s wird durch die Variablen pID und reason angegeben
    Wenn man die Parameter eben nicht ordentlich "ausfüllt" wird der command unterbrochen und man bekommt die nachricht wie man den Command benutzt
    4. Wir formatieren den string mit 3 platzhaltern (3mal %s) diese stehen für den Namen vom Benutzer des Commands, der Name vom gekickten und der grund weßhalb er gekickt wird
    5. Diese Nachricht schicken wir an alle
    6. der Spieler wird gekickt


    Ich hoffe ich habs halbwegs verständlich und richtig erklärt^^
    Und ich weiß selbst nicht warum ich immer "wir" geschrieben hab :P
    Die sscanf Abfrage ist bestimmt etwas falsch erklärt damit kenn ich mich nicht ganz so aus
    Wenn ich etwas falsch/ungenau erklärt hab(und das hab ich sicherlich) dann berichtigt mich da lern ich auch noch etwas ;)


    Die stock Funktion Spielername hast du ja bereits im Script

    Also ich kann dir aufjedenfall sagen warum der Turismo überschrieben wird aber eine nunja effektive Lösung fällt mir nicht ein^^


    schau dir mal den Code an
    new vehicle=GetPlayerVehicleID(playerid);
    new vehicleid=GetVehicleModel(vehicle);
    GetPlayerPos(playerid,x,y,z);
    GetVehicleZAngle(vehicle,rotation);
    format(Autodatei,sizeof(Autodatei),"/Autos/%d.dat",vehicleid);
    if(dini_Exists(Autodatei))
    {
    dini_IntSet(Autodatei,"Modelid",vehicleid);
    dini_FloatSet(Autodatei,"x_pos",x);
    dini_FloatSet(Autodatei,"y_pos",y);
    dini_FloatSet(Autodatei,"z_pos",z);
    dini_FloatSet(Autodatei,"Rotation",rotation);
    }
    Du bekommst damit die die ModelID des Autos das du speicherst heraus und ein Turismo hat immer die gleiche ModelID
    nämlich die 451.
    Diese ID speicherst du in den formatierten Pfad und da ist das Problem es besteht ja schon ein Turismo
    Und mit der Abfrage danach(if(dini_Exists(...))) also wenn die Datei existiert wird sie überschrieben


    Ich hoffe ich habs nicht zu umständlich erklärt :D


    Asl Lösung würde mir höchstens einfallen, dass in den Ordner nicht die ModelID speichern lässt sondern z.B den Namen
    des Spielers der diesen Command ausführt aber dann könnte auch jeder nur ein Auto haben^^

    na in dem anderen Thread hast du doch geschrieben du hast die .pwn wieder gefunden
    Dann kannst du doch ganz einfach bei Google nach den Includes suchen und im Script siehst du ja was du für Scriptfiles Ordner benötigst
    Diese legst du eben per Hand an

    Ich habs oben mal geändert deine Abfrage der "art" war komisch


    mal in Worten
    Wenn "art" größer als 0 und kleiner als 4 ist gib zurück "Bitte nur 1 bis 3";
    und jetzt
    Wenn "art" größer gleich 4 oder kleiner als 1 gibt zurück "Bitte nur 1 bis 3"


    /edit:
    Also nochmal 2 Varianten die gehen sollten
    ocmd:gwd(playerid,params[])
    {
    new art,pid,note;
    if(sscanf(params,"iui",art,pid,note)) return SendClientMessage(playerid,111111,"/gwd [art][id][note]");
    if(art >= 4 || art < 1) return SendClientMessage(playerid,1111,"Bitte nur 1 bis 3");
    if(art == 1)
    oder
    ocmd:gwd(playerid,params[])
    {
    new art,pid,note;
    if(sscanf(params,"iui",art,pid,note)) return SendClientMessage(playerid,111111,"/gwd [art][id][note]");
    if(art > 0 && art < 4)
    {
    if(art == 1)

    Probier es mal so


    ocmd:gwd(playerid,params[])
    {
    new art,pid,note;
    if(sscanf(params,"iui",art,pid,note)) return SendClientMessage(playerid,111111,"/gwd [art][id][note]");
    if(art >= 4 || art < 1) return SendClientMessage(playerid,1111,"Bitte nur 1 bis 3");
    {
    if(art == 1)
    Denn soe wie ich es verstanden habe ist art ja z.B Normaler GWD oder Luftwaffen GWD
    pid ist der Spieler
    und note halt wie er abschließt
    art und note sind nur ganze Zahlen also integer = i
    pid ist ein User und damit u


    /edit habs verändert

    Du hättest wenigstens noch ein Befehl machen können mit dem man alle Spieler sieht die AFK sind und am besten noch ne Abfrage das man nur /back machen kann wenn man afk ist also mit ner Variable(bevorzugt bool)


    5/10 nichts großes aber immerhin kein grober Fehler wie Ban(playerid) oder so :sleeping:


    /edit: Das mit dem Ban war ein Witz und nur darau bezogen dass kein grober fehler im Script ist wie bei manch anderen Sachen die hier veröffentlicht werden

    naja dazu könnte man ja sowas machen wie


    switch(pInfo[playerid][Fraktion])
    {
    case 1:{SetSpawnInfo();SpawnPlayer(playerid);}
    case 2:{SetSpawnInfo();SpawnPlayer(playerid);}
    ....
    }


    Der Code ist jetzt natürlich nicht an dein Script angepasst