Beiträge von Templer

    Also ich finde es einfach schlecht überdacht dies als selbstentpackende Ausführungsdatei zu erstellen. Somit werden alle die kein Windows besitzen ausgeschlossen dies zu Benutzen. Daher nutz bitte ein einfaches Packverfahren wie als *.zip, oder sonstwas.


    Mit Umständen habe ich es doch nun entpackt, jedoch sehe ich das es sehr statisch aufgebaut ist und es daher etwas mühselig ist neue Callback´s einzufügen.


    Unteranderem ist dir auch wohl nicht im klaren, dass public-Namen maximal 32 Zeichen besitzen dürfen und es daher mit 'MAX_SCRIPTNAME_LENGTH' bei manchen Callback´s Probleme auftauchen könnten.


    Eine kleine Feinheit anzumerken ist, dass manche Definitionen 'üblich' sind und es sozusagen mit Überschneidungen kommen könnte, wo andere wieder diesen Thread zusammen (Beispiel DEBUG_MODE). Daher wäre es ratsam vor den Definitionen eindeutige TAGS zu verwenden. Bsp. ATC_DEBUG_MODE


    Ansonsten da dies die erste Veröffentlichung von so einem Konzept hier im Forum ist, sieht es einigermaßen gut aus.

    Scheiß druff, ich hab Zeit, keine Lust mir Dokumentationen anzusehen was ich derzeit eh nicht verwende, aber schaden tuts nicht ^^


    Bin dabei


    //EDIT: Da ich irgendwie wegen dem schnellen scrollen das meiste nur überflogen habe, hier ein kleiner Senf zu meinem Post: Interesse wäre von meiner Seite aus eher an PHP, sollte dies nicht das Thema werden weil andere was anders wollen, so wäre ich dann doch nicht dabei :P

    Und hier nun ein kleines Feedback:


    - Benütze für Float Vergleiche immer 'floatcmp', da durch falsche Abrundungen falsche Ergebnisse erzielt werden (siehe Besonders den Teil, wo das Script neugestartet wird).
    - Nebenbei gibt es auch Leute die auf der Position 0.000000 auch vielleicht was setzen, daher ist es nicht besonders Ratsam ^^
    - Das du die Anzahl der bewegten Objekte loggst ist eher sinnlos, denn nicht jedem interessiert es besonders, wie oft alle Objekte bewegt worden sind. Wenn dann vielleicht Spielerseitig, aber dies wäre auch etwas nutzlos.
    - SaveMover sollte keinen bool Parameter haben, sondern einen Integer Parameter, wo die Möglichkeit besteht in ms anzugeben, in welchem Takt Objekte bewegt werden sollen und dies höchstwahrscheinlich auch Spielerseitig, also per SetTimerEx.


    Ansonsten sieht es recht passabel aus.

    Wenn bei dir InGame die Meldung "Es ist ein Fehler bei der Registrierung entstanden. Bitte Relogg!" erscheint und du gekickt wirst, dann liegt es daran, dass er glaubt du seist registriert und letztendlich er deine eindeutige MySQLID nicht findet, die dein Script so merkwürdig und selten verwendet.


    Wenn nicht, dann musst du andere KickPlayer Code Zeilen posten. Sollten keine vorhanden sein, so vielleicht auch BanPlayer.

    Als ob SetPlayerTeam funktionieren würde ^^


    Das wäre fast so lustig, als würde OnVehicleDeath aufgerufen, wenn ein unbenütztes Fahrzeug explodiert oder ins Wasser fliegt. (Ehrlich das geht mich echt an, dass es nicht ging)

    Ehrlich gesagt ist da nun nicht die Frage von der Schnelligkeit, sondern vom verwenden her. Denn Schnell sind eigentlich beide ^^


    Ich meine, wenn du bei einer FOR-Schleife ein continue verwendest, so wird trotzdem die variable, jene du im 3. Parameter stets editiert, weiter gezählt.


    Wenn du nun bei einer WHILE-Schleife ein continue verwendest, so müsstest du vor dem continue noch selber eine Zeile setzen, dass die Variable verändert wird, ansonsten entsteht ein Dauer-Loop.


    Natürlich gibt es auch andere Beispiele, wo ein WHILE besser ist, als ein FOR, wie bei einer von vielen mySQL Funktionen, wo die Funktion solange true wiedergibt, bis es keine Zeilen mehr gibt und daher am Ende false wiedergibt ^^.


    Nebenbei eine kleine Anmerkung, bei deiner obigen FOR-Schleife wird von 0 bis 99 gezählt und bei deiner obigen WHILE-Schleife von 0 bis 100. Keine Ahnung ob dir dies bekannt war, wollts nur so zu meinem Roman anhängen.

    So entschuldige, leider hab ich mich gestern irgendwie verdacht. Nicht addiert, sondern multipliziert müssen die 2 Array Größen. Und das zzgl. addieren von Zahlen kann man (egal ob String oder ein anderer Datentyp) weglassen.


    Tut mir echt leid ^^



    return CallLocalFunction(cmdtext,"ad",params, sizeof(params) * sizeof(params[]));

    Also ich finde es endlich mal anreizend, dass hier richtige Fragen gestellt werden ^^


    Es ist ganz einfach, wofür dir der Parameter 'a' in CallLocalFunction helfen wird. Er deklariert bzw. in diesem Fall eine Meldung, dass ein Array kommt. Nachfolgend zum 'a' kommt ein Platzhalter für einen Integer, also ein 'd' der die Gesamtgröße des Array´s übermittelt. Ein Beispiel für ein ein-dimensionales Array:


    new string[128] = "Hallo, Willkommen auf unserem Server";
    CallLocalFunction("WelcomeText", "ad", string, sizeof(string)); //sizeof(string) wiedergibt 128, also die Gesamtgrößte.


    Beachte auch, dass wenn du das Feld string (im obigen Beispiel) leer lässt, da er anhand der direkten Eingabe die Größe der Eingabe berechnen kann ist es auch wichtig, dass du dann den Array Global Initialisieren musst, denn ansonsten entsteht ein Kompiler Fehler.


    Und nun schauen wir uns ein zwei-dimensionales Array an:


    new multistring[5][128] = {"Hallo Joe wie gehts dir?", "Mir gehts gut danke, und dir?", "Altah wat für ne Frage..", "Kleine Spaltung in der Persönlichkeit?", "Guten Morgen :D"}; //Ich nenne ihn einfach multistring, keine Ahnung warum ^^
    CallLocalFunction("WelcomeText", "ad", multistring, sizeof(multistring) * sizeof(multistring[])); //Es wird nun auch die Größe vom 2. Array per sizeof(multistring[]) ermittelt und mit der 1. Arraygrößte multipliziert, womit wir die Gesamtgröße erhalten.


    Bei einem drei-dimensionalem Array sieht es nun kurz gezeigt dann so aus:


    new uberstring[5][20][128]; //Ich definiere nun direkt keinen Text dafür, da es zu viel Aufwand wäre ^^
    CallLocalFunction("WelcomeText", "ad", uberstring, sizeof(uberstring) * sizeof(uberstring[]) * sizeof(uberstring[][]));


    //EDIT: Kleiner Fix, da ich mich vertan habe, Sry ^^

    Jungs, zwar ist es in einer Hinsicht sinnlos, aber fast jeder hier kapiert den Code nicht.


    Das was der Autor gepostet hat ist ideal um Funktionen in einen eigenen Thread zu legen. Bedeutet der Code von der Funktion der so aufgerufen wird, wie es der Autor gezeigt hat, wird erst unmittelbar nach der endgültigen Ausführung von jener Funktion, wo 'GetFunction' aufgerufen worden ist, ausgeführt.


    Würde man nun eure nicht mit dem Kontext übereinstimmenden CallLocalFunction, CallRemoteFunktion bzw. ein einfaches aufrufen (bsp.: Funktion();) erzwingen, so wird der Code von der aufgerufenen Funktion sofort ausgeführt und bei Beendigung führt es dann den Rest von jener Funktion auf, wo die Funktion aufgerufen worden ist.




    @ SplInTeC


    Er erstellt trotzdem einen Timer, nur wird er nach der erstmaligen Ausführung automatisch beendet :P
    Jedoch wäre es doch einfacher SetTimer und SetTimerEx direkt aufzurufen und nicht noch umständig einen string formatieren ^^, nebenbei ist leider deine Funktion nicht kompatible mit public´s, die Parameter besitzen.

    Vergewissere dich bei deinem 2. Problem, dass 'Spielerdatei' ein String ist und auch wirklich zu einer Spielerdatei verlinkt.


    format(Spielerdatei, sizeof(Spielerdatei), "%s.ini", GetName(playerid));


    Nebenbei überprüfe auch, ob du den Skin auch wirklich in die Datei gespeichert hast und schau sicherhaltshalber auch in der Datei nach.

    ocmd:cuff(playerid,params[])
    {
    if(!isPlayerInFrakt(playerid,1) && !isPlayerInFrakt(playerid,) return SendClientMessage(playerid,ROT,"Du bist kein Cop!");
    new pID;
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,ROT,"Benutze: /cuff [ID]");
    TogglePlayerControllable(pID,false);
    return 1;
    }

    Callback OnPlayerSpawn zeigen, damit man sieht welche Variablen zu benützt. Ansonsten hier kleine Fixes für deinen Befehl. Unnötige Sachen wurden auskommentiert:



    ocmd:uninvite(playerid,params[])
    {
    //new text[128],pName[MAX_PLAYER_NAME];
    //GetPlayerName(playerid,pName,sizeof(pName));
    if(isPlayerInFrakt(playerid,0))
    {
    SendClientMessage(playerid,COLOR_RED,"Du gehörst keiner Fraktion an.");
    return 1;
    }
    //if(sscanf(params, "s", text))return SendClientMessage(playerid, COLOR_GREY, "Verwendung: /uninvite [Spieler/ID]");
    if(GetPVarInt(playerid,"Leader") == 6 || GetPVarInt(playerid,"Leader") == 1 || GetPVarInt(playerid,"Leader") == 2 || GetPVarInt(playerid,"Leader") == 3 || GetPVarInt(playerid,"Leader") == 4 || GetPVarInt(playerid,"Leader") == 5 || GetPVarInt(playerid,"Leader") == 6 || GetPVarInt(playerid,"Leader") == 7 || GetPVarInt(playerid,"Leader") == 8 || GetPVarInt(playerid,"Leader") == 9)
    {
    new pID,string[280];
    if(sscanf(params,"u",pID)) return SendClientMessage(playerid,COLOR_GREY,"Benutze: /invite [Spieler/ID]");
    format(string,sizeof(string),"Du wurdest von Leader %s aus der Fraktion geworfen",SpielerName(playerid));
    SendClientMessage(pID,COLOR_LIGHTBLUE,string);
    format(string,sizeof(string),"Du hast %s aus der Fraktion geworfen",SpielerName(pID));
    SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
    SetPVarInt(pID,"Member",0);
    SpawnPlayer(pID);
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Du bist kein Leader!");
    }
    return 1;
    }

    Zur Info, für IsPlayerAdmin musst du als RCON angemeldet sein.


    Und den letzten Parameter bei strcmp mit der Zahl 10, kannst du bei beiden weglassen.