Beiträge von Goldkiller

    Zitat

    Ehm sry hab nicht ganz verstanden, bin halt kein richtiger Deutscher sondern Franzose ^^


    Na wer hätte das gedacht :thumbup:
    Zu deiner neuen Frage.
    Ich bin mir nich sicher,es könnte allerdings funktionieren indem du das hier nutzt:
    if (!sscanf(params, "dz", id, x_drink)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Usage: /auschenken [ID] [Getränk]");

    Anstatt "ds" müsstest du "dz" nehmen.'z' bedeutet in dem Fall es muss kein String als 2 Parameter angegeben werden,sondern kann.
    Noch genauer erklären möcht ich das nicht,das würde sonst zu lang werden,sscanf ist nämlich ein riesen Funktion.
    Dann könntest du es so nutzten:
    dcmd_ausschenken(playerid, params[])
    {
    new
    id,
    x_drink[128];
    if (!sscanf(params, "dz", id, x_drink)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Usage: /auschenken [ID] [Getränk]");
    else if (!strlen(x_drink)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Tippe /drinkliste um die Getränke aufzulisten.");
    else if (!IsPlayerConnected(id)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Invalid ID");
    else if (PInfo[playerid][Job] != 8) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Du bist kein Angestellter");
    else if (IsPlayerConnected(id))
    {
    //[...]
    Es gibt aber einen Nachteil,den wirst beim testen relativ schnell finden.


    //Edit:

    Zitat

    EDIT : Wie kann ich machen das wenn der Typ /ausschenken ID [falsches Getränk] eingibt er ne fehler meldung bekommt halt :


    //[...]
    else if(strcmp(x_drink,"Wein",true) == 0)
    {
    new tmp[256], tmp2[256];
    format(tmp,256,"[Pinky's Bar] %s gibt %s eine Flasche %s!",PlayerName(playerid),PlayerName(id), drink);
    SendClientMessageForTeam(3,COLOR_BLUE,tmp); //TO CORRECT TEAM :)
    format(tmp2,256,"[Pinky's Bar] Hier ist euere Flasche %s Sir",PlayerName(playerid),PlayerName(id), drink);
    SendClientMessage(id,0x00FF00FF,tmp2);
    }
    else if(strcmp(x_drink,"Champagne",true) == 0)
    {
    new tmp[256], tmp2[256];
    format(tmp,256,"[Pinky's Bar] %s gibt %s eine Flasche %s!",PlayerName(playerid),PlayerName(id), drink);
    SendClientMessageForTeam(3,COLOR_BLUE,tmp); //TO CORRECT TEAM :)
    format(tmp2,256,"[Pinky's Bar] Hier ist euere Flasche %s Sir",PlayerName(playerid),PlayerName(id), drink);
    SendClientMessage(id,0x00FF00FF,tmp2);
    }
    else {
    SendClientMessage(playerid, 0xFF0000FF, "[INFO] Tippe /drinkliste um die Getränke aufzulisten.");
    }
    }
    return 1;
    }

    Würde sagen der Fehler liegt an einer etwas anderen Stelle.
    dcmd_ausschenken(playerid, params[])
    {
    new
    id,
    x_drink[128];
    if (!sscanf(params, "ds", id, x_drink)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Usage: /auschenken [ID] [Getränk]");
    //else if (!strlen(x_drink)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Tippe /drinkliste um die Getränke aufzulisten.");
    else if (!IsPlayerConnected(id)) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Invalid ID");
    else if (PInfo[playerid][Job] != 8) SendClientMessage(playerid, 0xFF0000FF, "[INFO] Du bist kein Angestellter");
    else if (IsPlayerConnected(id))
    {
    //[...]

    Überall wo jetzt noch im format(...) "drink" steht muss "x_drink" her.Du hast "drink" nämlich als Integer deklariert,soll aber in sscanf schon ein String sein (Crash müsste hier liegen).So auch im format(...).Wir wissen ja das '%s' ein String ist,also musst du auch ein String "übergeben".

    Wenn du die Registrierung schon hast sollte Login doch nicht so schwer sein.
    new
    query[128],
    pw[32];
    //Ich denke mal das Passwort ist in der DB unter Passwort gespeichert
    format(query, sizeof(query), "SELECT Passwort FROM benutzer WHERE Name='%s' LIMIT 1", PlayerName(playerid));
    samp_mysql_query(query);
    samp_mysql_store_result();
    samp_mysql_fetch_row(pw);
    // Jetzt müsste das passwort des spielers in PW gespeichert sein.
    if(!strcmp(query,/* zB. params wenn du dcmd benutzt */)) {
    //Passwort müsste übereinstimmen
    }
    else {
    //Passwörter stimmen nicht überein
    }
    Ich kann dir nicht versichen ob es funktioniert,müsste dazu eventuell mal den Registrierungsteil aus deinem Script sehen.
    Kann ja sein dass du das Passwort verschlüsselst,unter einem anderen Eintrag speicherst oder ähnliches.
    Das Beispiel könnte dir helfen:
    PAWN/PHP example script
    Es ist zwar für das andere MySQL Plugin,sollte dir aber trotzdem weiter helfen.

    Es funktioniert nicht weil du zu einen von vielen tausenden gehörst die zu faul sind sich mal das Wikipedia zu SA:MP anzugucken.
    AppyAnimation(playerid, animlib[], animname[], Float:fS, opt1, opt2, opt3, opt4, opt5)

    Zitat

    animlib[] The library name of the animation.
    animname[] The name of the animation.


    Die Animationslibrary(animlib) ist nicht der Animationsname (animname).
    ApplyAnimation(...)
    Da wir die Liste aller möglichen Animation in SA:MP hier haben ergibt sich folgendes:
    public OnPlayerRequestClass(playerid, classid)
    {
    ApplyAnimation(playerid,"BD_FIRE","BD_GF_Wave",4.1,1,1,1,1,1);
    }
    Danach
    public OnPlayerSpawn(playerid)
    {
    ClearAnimations(playerid);
    }

    @Dodofriend,
    Der Geldbetrag ist kein String,sondern ein Integer/Zahl.

    new
    query[256],
    result[256],
    endmoney;
    format(query, 256, "SELECT Money FROM benutzer WHERE Name='%s' LIMIT 1", PlayerName(playerid));
    samp_mysql_query(query);
    samp_mysql_store_result();
    samp_mysql_fetch_row(result);
    endmoney=strval(result);
    format(result, 256, "Du erhältst %d$",endmoney);
    SendClientMessage(playerid, COLOR_YELLOW,result);
    GivePlayerMoney(playerid,endmoney);

    Was hat das damit zu tun?
    Loose Indentation kommt wenn man nicht richtig den Code einrückt.
    #pragma tabsize 0

    Füg das oben in dein Script ein,das verhindert die Warnung.Ist allerdings besser du lernst richtig.
    Richtig:
    SetPlayerToTeamColor(playerid)
    {
    if (gTeam[playerid] == TEAM_GROVE)
    {
    SetPlayerColor(playerid, TEAM_GROVE_COLOR);
    }
    else if (gTeam[playerid] == TEAM_BALLA)
    {
    SetPlayerColor(playerid, TEAM_BALLA_COLOR);
    }
    }
    Falsch:
    SetPlayerToTeamColor(playerid)
    {
    if (gTeam[playerid] == TEAM_GROVE)
    {
    SetPlayerColor(playerid, TEAM_GROVE_COLOR);
    }
    else if (gTeam[playerid] == TEAM_BALLA)
    {
    SetPlayerColor(playerid, TEAM_BALLA_COLOR);
    }
    }


    Wieso GetMaxPlayers();?
    Wenn du schon nicht weisst wie genau diese Funktion in diesem Loop alles nur noch langsamer macht, lass es lieber sein und nutzt MAX_PLAYERS.
    forward MoneyTimer();
    public OnGameModeInit() {
    SetTimer("MoneyTimer",5*1000,1); // Alles 5 Sek. reichen wohl
    }
    public MoneyTimer() {
    for(new i;i<MAX_PLAYERS;i++) {
    /*
    SetPlayerScore(i,GetPlayerMoney(i));
    oder */
    /*
    new
    money=GetPlayerMoney(i);
    if(money) {
    SetPlayerScore(i,money);
    }
    */
    if(IsPlayerConnected(i)) {
    SetPlayerScore(i,GetPlayerMoney(i));
    }
    }
    }


    //Edit:coz of phali

    Hab das erste Problem wohl überlesen.
    new SkinObdachloser[7]= {
    134,
    137,
    181,
    212,
    239,
    230,
    213
    };

    Die Zuweisung müsstest du zB. in OnGameModeInit() machen falls du es bei deiner Methode belassen möchtest.
    public OnGameModeInit(){
    SkinObdachloser[0] = 134;
    SkinObdachloser[1] = 137;
    SkinObdachloser[2] = 181;
    SkinObdachloser[3] = 212;
    SkinObdachloser[4] = 239;
    SkinObdachloser[5] = 230;
    SkinObdachloser[6] = 213;
    //
    return 1;
    }

    if(SkinObdachloser[0] == pSkin) {
    GivePlayerWeapon(playerid,341,1);
    }
    else if(SkinObdachloser[1] == pSkin) {
    GivePlayerWeapon(playerid,341,1);
    }
    // etc


    Oder du machst es so
    for(new i;i<sizeof(SkinObdachloser);i++) {
    if(SkinObdachloser[i]==pSkin) {
    GivePlayerweapon(playerid,341,1);
    break;
    }
    }

    Das Script ist als Vorlage relativ OK,jedoch gibt es einige Fehler.


    Die public Funktion missionfailed enthält den playerid Paramter in deinem Script,der
    parameter wird allerdings nicht übergeben (SetTimerEx anstatt SetTimer).
    Das bedeutet,egal wer gerade in der Müllmann-Mission ist und aus seinem Fahrzeug steigt,wird die Funktion missionfailed für den Spieler mit der playerid 0 aufrufen,egal welche ID er selber hat.
    Die Commands sind auch nicht ganz Fehlerfrei.Ich könnte den /starten
    Command auch ausführen wenn ich nur /star eingebe ;).
    Der Ablauf der Strecke und der Setzung der Checkpoints ist mehr als Benutzerunfreundlich.
    Mit einem Array lässt sich das viel viel einfacher lösen.


    Ich hab dein Script mal bearbeitet und verbessert,Fehler behoben etc.Bleibt eine gute Vorlage,dennoch kann man es wie gesagt besser machen.
    Wer die verbesserte Version haben möchte: Download - Muellabfuhr


    //Edit: Mach das :P

    Sieht ja schon ganz nett aus.Immerhin scheinst du auch etwas gelernt zu haben im Gegensatz zu 90% im Forum die nur Code wollen,ihn aber scheiß egal ist wie der eigentlich funktioniert.


    Ein Paar Kommentare von mir:
    Ich empfehle dir dringend den ganzen Code bei OnPlayerUpdate zu entfernen.

    Zitat

    - Added OnPlayerUpdate, a callback fired for every player network update. This will help with server-side anti-cheat and detecting alt-tabbed/idle players.
    Important note: Remember! This callback is called VERY frequently! Avoid having a lot of chunk in it!


    Du hast da eindeutig zu viel Code.
    Nehm lieber einen Timer der alle 30 (Wieviel auch immer) Sekunden die Stats speichert.
    Ich würde mal tippen OnPlayerUpdate wird locker 10x pro Sekunde pro Spieler aufgerufen wenn er nicht
    gerade AFK/auf dem Desktop ist.


    for(new i=0 ; i <GetMaxPlayers() ; i++)
    Das ist gar nicht gut.Du solltest keine Funktionen in Abfrage für die Schleife aufrufen.
    Schau dir deshalb das hier an. >> Link <<


    Noch etwas zu deinem AdminChat Command "/a"(Ich nehme mal an du hast einfach g_Max_Players eingeführt)
    //Deins
    for(new i=0 ; i <GetMaxPlayers() ; i++) //GetMaxPlayers ist wie gesagt hier schlecht
    {
    if(PlayerInfo[playerid][pAdmin] >= 1 && PlayerInfo[i][pAdmin] >= 1) //Die erste Abfrage sollte vor der Schleife sein,ist logischer
    {
    SendClientMessage(playerid,ACHAT,string); //Falsche ID,du müsstest doch 'i' angeben
    }
    }
    //Meins
    if(PlayerInfo[playerid][pAdmin]>=1) {
    for(new i;i<g_Max_Players;i++) {
    if(PlayerInfo[i][pAdmin]>=1) {
    SendClientMessage(i,ACHAT,string);
    }
    }
    }
    Die Schleife sollte doch eigentlich nur aufgerufen werden sofern der Spieler auch Admin ist,oder nicht?Deswegen ist es am besten diese Abfrage als erstes zu haben.Danach sollte der Rest klar sein.
    Von IsPlayerConnected hab ich jetzt mal abgesehen.


    Mir sind noch weitere Sachen aufgefallen.Aber das sollte erst mal reichen.Wenn dich die anderen Sachen noch interessieren die man verbessern könnte sag bescheid ;).

    konnte ich mir nicht wirklich viel daraus nehmen, sorry. Könntest du mir das noch einmal ein bisschen genauer erklären :P


    Das ist ein Define,mehr lohnt sich glaub ich nicht zu erklären außer du beherrscht Englisch ganz gut.
    Define - PAWN keywords

    Zitat

    Und ein Error kommt bei mir beim komplitieren auch: C:\Program Files\GTA San Andreas\Server\filterscripts\gAdmin.pwn(121) : fatal error 100: cannot read from file: "gAdmin\language\german" da vermute ich einmal, dass der Speicherort nicht richtig ist, obwohl ich es genau nach deiner Readme-Anleitung gemacht habe. Wo müsste der Ordner denn sein ?? ?(


    Schau dir mal dieses Bild an.
    > Drück mich <
    Du hast die Includes nicht richtig installiert.

    Zitat

    install.txt
    3.Copy the 'gAdmin' folder from here : full_gAdmin.rar\gAdmin\pawno\include ( ONLY NEEDED IF YOU HAVE THE FULL VERSION WITH SOURCE )
    and paste it there : \pawno\include
    Now you should have a possible path like that : \pawno\include\gAdmin\language


    If you didn't get it right,just look at the screenshot gAdmin_Folder_Pic.png

    Hab vor einigen Tagen gAdmin 0.9a releast.Hab den Thread deshalb mal umbenannt und den ersten Post bearbeitet.



    Aber eine Frage hätte ich auch, und zwar sind da manche Cmds mit einem " g " davor, wie z.B. /glogin oder /gregister, aber ich würde gerne nur /login oder /register wollen, falls das möglich ist, was müsste ich denn da umschreiben


    Ist möglich.
    In Zeile 107 in gAdmin.pwn machst du vor dem '#define GREGISTER' //,also
    //#define GREGISTER
    Dann kompilierst du neu.


    Hab dir das trotzdem hier mal fertig gemacht.
    Klick Mich


    Wie kann ich mehr Adminlevel einrichten, also bei dir geht es ja nur bis Level 5, aber ich hätte es gerne bis Level 8 oder 9


    Das ist so leicht leider nicht möglich.Da müsste man so einiges ändern,sorry :huh: .


    Danke für deine lobenden Worte :thumbup: .


    @P.S,so hat es bei mir auch angefangen ;).

    new
    conIP[16],
    pIP[16],
    info[128];
    GetPlayerIp(playerid,conIP,sizeof(conIP));
    for(new i,j=GetMaxPlayers();i<j;i++) {
    if(IsPlayerConnected(i)) {
    if(i!=playerid) {
    GetPlayerIp(playerid,pIP,sizeof(pIP));
    if(!strcmp(conIP,pIP,true,16)) {
    format(info,sizeof(info),"Spieler mit gleicher IP gefunden,ID %d und ID %d",playerid,i);
    SendClientMessageToAll(COLOR_RED,info);
    }
    }
    }
    }