Beiträge von Kaliber

    FindCarByPlate

    Nur mal aus Spaß, dass kann zu einer gefährlichen Funktion werden ^^


    Im worst worst case, sind 500 Spieler online und alle 9999 Autos vergeben.


    Und wir wollen blöderweise eins der letzten Autos checken.


    Das macht 500*9999 String Abfragen, das sind 4.999.500 :D



    Das bedeutet, dein Server würde für ne Sekunde hängen, spammt man den Befehl, wäre er quasi unspielbar und down xD
    Wenn, dann solltest du direkt mit Zahlen arbeiten :D (mit Zahlen sind es immer noch ~200ms)


    Der Witz aber ist, dass der Code nicht einmal funktioniert. Denn wenn der Spieler, dem das Kennzeichen gehört nicht online ist, kann das Auto nicht zugeordnet werden.
    Es wäre hier viel effizienter einen einfachen MySQL Query zu nutzen, mit dem du prüfst, zu wem das eindeutige Kennzeichen gehört :)





    10.000 eindeutig zufällige Zahlen effizient zu generieren, die sich nicht wiederholen, ist gar nicht mal so trivial in Pawn.
    Mir fällt mir ein, entweder y_iterate zu nutzen, oder besser ein eigenes System zu entwickeln.
    Sprich du hast eine Datenbank mit 10.000 Einträgen. Dann wählst du random(n) (wo n die Anzahl der Einträge in der Datenbank ist) aus und löschst diese.
    Dann bist du kannst du dir immer sicher sein, dass das eindeutig ist, und das super effizient.

    Schreibs mal so:


    Das zwingt dich, dass jedes Biz, jetzt einen Interior benötigt, den du angeben musst, wenn dir das "anfangs" lieber ist..wieso auch immer :D


    Und wie gesagt, lösche MAX_BIZ. (Vorerst. Wenn du dynamische Interiors verwendest, kannst es ja wieder einführen. Wobei es nicht nötig ist, da du ja sizeof überall verwendest und sich das dadurch dynamisch anpasst, wenn du die größe von dem Array ändert).


    Jetzt ist es auch egal, ob du sizeof(bInfo) oder sizeof(BizInts) verwendest, da die den gleichen Wert haben :)

    Okay, der Erste Beitrag mit den Buildings hat mich super verwirrt...das hat ja nichts mit dem zu tun, was du gerade machst. Sowas kannst du also weglassen, das verwirrt nur.


    In meinen Augen, macht es überhaupt keinen Sinn, die Biz Positionen dynamisch in MySQL zu speichern, wohingegen du die Interiors zu den Bizzes statisch lädst.


    Was macht das für einen Sinn?


    Wäre es nicht sinniger, das alles dynamisch laden zu lassen?


    Sonst kannst du direkt auch die Bizzes statisch laden lassen xD



    Wenn du keinen Dummy dann nutzt:

    if(bInfo[bizid][db_bid]==0)continue;

    Diese Zeile macht dann keinen Sinn mehr.



    PS: Strings deklariert man immer außerhalb von Schleifen.



    Der Fehler entsteht offensichtlich, weil du mehr dynamische Bizzes hast, als statische Interiors angegeben.


    Das ist dein Fehler. Also machst du beides dynamisch, löst das quasi all deine Probleme und macht dein System um einiges sauberer.

    Was soll ich jetzt machen ich kann da doch nicht sizeof(BizInts) hinschreiben.

    Doooch kannst du, du schaffst das :)


    Vertrau mir <3


    //Edit: bzw verwende mal überall sizeof(bInfo) Denn eigentlich greifst du ja überall darauf nur zu :D Wieso hast du so viele Variablen?!?! Eigentlich reicht eine :D


    Ich habe extra die 0 nie besetzt weil es ja wie du es schon sagst zu Komplikationen führt.

    Doch kannst du, wenn du überall das sizeof verwendest, kommt es zu keinen Komplikationen.

    MAX_BIZ stimmt nicht mit sizeof(BizInts) überein.


    Lösche am besten MAX_BIZ und verwende überall nur sizeof(BizInts) :)


    Das Problem ist, dass das alles überschrieben wird, falls noch ein Spieler stirbt.


    Das kann man elegant lösen, sogar ohne globale Variablen:


    Jo ich versuch gerade zu finden wo OnGameModeExit definiert ist oder Rcon Command "exit" aber ich finde nur die natives und nicht die funktion, weißt du wo die sind?

    Ich habe keine Ahnung, was du suchst.



    This callback is called when a gamemode ends, either through 'gmx', the server being shut down, or [wiki]GameModeExit[/wiki].



    This callback will NOT be called if the server crashes or the process is killed by other means, such as using the Linux kill command or pressing the close-button on the Windows console.


    Ich empfehle dir einen eigenen restart befehl, wo du alles speicherst und danach dann den Server neustartest :)

    oder kann ich IsPlayerAdmin lassen für Adminbefehle? (Kein RCON)

    Ich verstehe die Frage nicht? IsPlayerAdmin ist nur für RCON Admins.
    Wenn du möchtest, dass sich ein RCON Admin Admin Befehle ausführen darf, dann kannst du es drinnen lassen, das liegt doch an dir :D



    iPAA(playerid)

    Hier fehlt der Rang. Du müsstest z.B. iPAA(playerid, 4) schreiben.


    Allerdings fragst du ja zusätzlich immer das Admin Level ab..machst du ja direkt neben iPAA...


    2x abfragen brauchst du es nicht ^^

    Zeile 2 natürlich löschen...


    Dafür gibt es ja Zeile 4...



    Deine Variante sagt wieder tag mismatch

    Ist das etwa ein bool?


    Dann schreib es so:


    C
    stock SendAdminMessage(color, message[])
    {
        for(new i=GetPlayerPoolSize(); i!=-1; i--)
        {
            if(SD[i][pEingeloggt] && (SpielerDaten[i][pAdmin] > 0 || IPA(i))) SendClientMessage(i, color, message);
        }
        return 1;
    }

    edit: IsPlayerAdmin ist nur eine Abfrage ob man RCON Admin ist?

    Korrekt: [wiki]IsPlayerAdmin[/wiki] Check if a player is logged in as an RCON admin.



    Ich meine übrigens das au Zeile 26.

    Achso, dann schreibe das so:


    C
    format(string,sizeof(string), GARN(pID));
    SD[pID][pAdmin] = adminid;
    format(string, sizeof(string), "Du hast %s %s den Teamrang %s gegeben", string,SD[pID][pName], GARN(pID));
    SCM(playerid, BLAU, string);


    SendAdminMessage klappt immer noch nicht. Ich habs auch mit deinem Vorschlag probiert.

    Das ist seeehr merkwürdig 8|


    Bist du denn sicher, dass Eingeloggt[i] auf 1 ist und du das damit machst und nicht mit SD[playerid][pEingeloggt]?

    Diese Nachriht bekomt dann doch auch der der den anderen zum Admin macht oder?

    In deinem Fall, ja, da du ihn zum Admin machst und dann SAM aufrufst.



    das wenn ich zb nen Spieler n Teamrang gebe da steht Spieler xy wurde von yz zum Supporter ernannt

    Das machst du doch?! Das steht doch in Zeile 28.



    jedoch will endAdminMesage immer noch nicht

    Ich sagte ja schon dein Code ist korrekt.
    Das einzige was du evtl nicht berücksichtigt hast ist, dass der RCON Admin keine Nachrichten bekommt.
    Soll dieser auch die Nachrichten bekommen? Wenn ja, schreib die Funktion so:


    C
    stock SendAdminMessage(color, message[])
    {
        for(new i=GetPlayerPoolSize(); i!=-1; i--)
        {
            if(Eingeloggt[i] == 1 && (SpielerDaten[i][pAdmin] > 0 || IPA(i))) SendClientMessage(i, color, message);
        }
        return 1;
    }

    Das hat davor funktioniert, bis ich alles auf R41 4 umgescriptet hab.

    Hast du eventuell die Reihenfolge unter MySQL Connect nicht beachtet?


    Da steht ja, Access denied for user das heißt, er kann sich schon mal mit dem remote host verbinden.


    (Dennoch abzuraten weil sehr langsam + unsicher).


    Also kann es nur an 2 Sachen liegen:


    1. Benutzername oder Passwort falsch (evtl verursacht durch die Reihenfolge).
    2. Nicht genügend Rechte.

    Jetzt will meine SendAdminMessage nicht funktionieren.

    Dann bist du eventuell kein Admin?


    Denn der Code ist richtig.



    Momentan kommt der Rang dort den ich vergebe.

    Kannst du mehr von dem Befehl zeigen?


    Und ist das nicht genau das, was du willst?!

    Hey Brotfische,


    bitte nicht hauen, dass ich das in dieser Sektion veröffentliche, aber wusste nicht, wo sonst (kann ja verschoben werden).


    Klammerfehler sind ein doof und passieren leider gerade bei Anfängern relativ häufig.


    Und da der Pawn-Compiler dann crasht (oder man 26 Errors bekommt) und man vor einem großen Skript sitzt...ist man erstmal planlos.


    Es gab mal eine Website, die einen Klammerfehler Finder zur Verfügung gestellt hatte, aber diese ist offline (bzw ich finde keine andere akkurate mehr).


    Deshalb dachte ich mir, ich schreib kurz selbst eine.


    UPDATE


    Was beachtet die Seite?

    • Kommentare werden ignoriert (//).
    • Single-Line Strings werden ignoriert (also alles was in " " steht).
    • Chars werden auch gefiltert '{' wird also übersprungen.
    • Defines werden ignoriert, wenn man jetzt #define a(%0) print("opfer"); { gemacht hat, also unregelmäßige Brackets in einem define..dann hat man selbst Schuld...^^

    Was bedeutet die Zeile die mir ausgegeben wird?
    Wir stellen uns eine Block Funktion vor:


    C
    public OnPlayerConnect(playerid)
    {
        if(playerid == 0)
        {
            print("oh playerid 0");
    
    
        return 1;
    }

    Also hier sehen wir, dass in Zeile 6 eine Klammer vergessen wurde.
    Die Website wird jetzt sagen, dass die Klammer in Zeile 2 nicht geschlossen wurde.


    Das ist auch korrekt. Man weiß also jetzt, dass in diesem Block quasi der Fehler liegt.



    Schlusswort
    Also falls Fehler auftreten oder jemand noch Anregungen hat, könnt ihr diese mir gerne mitteilen :)


    Link: http://klammerfehler.bplaced.net/


    Viel Spaß und Erfolg beim skripten! :klugs:

    Bei mir im Chat kommt das diese Person zu wenig rechte hat. Jedoch kommt dann aber auch noch $Hi wenn ich $ Hi schreibe.

    Achso ja, du hast einfach das return 0 vergessen:


    hab bei MySQL mein MySQL Server angegeben da nur der Server SA-MP drauf hat.

    Das ist keine gute Idee einen externen MySQL Server zu haben.
    Ich weiß nicht, ob SA:MP da überhaupt mitspielt.


    Was muss hier einbauen damit man den Chat mit $ und § nicht nutzen kann wenn man kein Admin ist?
    Wenn ich kein Admin bin kommt ich hab zu enig rechte und es wird zB. $Text ausgegeben.

    Kannst du das etwas genauer erklären? Aktuell wird doch ausgegeben, dass diese Person zu wenig Rechte hat.

    SpielerDaten[playerid][pAdmin] >= 5 && SpielerDaten[playerid][pAdmin] == 7

    Wie soll jemand einen Rang größer 5 aber gleich 7 haben? Das geht nur, wenn er 7 ist :D


    Lösche das mit dem == 7



    Kurze Frage was mache ich falsch es wird alles mit 0 ms ausgegeben?

    Da machst du nix falsch...das ist so, dir werden nur Millisekunden angezeigt, aber dein Server brauch für das Ausführen nur Mikrosekunden :D