Beiträge von .fr3ak

    Ich hatte vor einiger Zeit mal an einem Selfmade GM gearbeitet, doch durch einige Veränderungen wurde das ganze dann eingestellt.


    Der GM ist primär ein Proof of Concept und deswegen keinesfalls direkt Spielbar und auch nicht gerade Bugfrei. Er soll eher als Inspiration oder C&P Vorlage dienen da ich nichts mehr damit anfangen kann.


    Paar features:
    - Custom Nametags
    - Custom Damage
    - TS3 Implementierung
    - Garagen System
    - Komplett Dynamische BIZes und Fraktionen
    - Simples Mission/Job System
    - "Neuartiger" GF
    - ...


    Das Script benutzt für fast alle Timer einen globalen Timer der Events wie OnSecond, OnMinute, OnHour, OnDay auslöst. Zusätzlich gibts ein paar Referenzen zu einem AC bzw. Launcher der Custom Texturen laden würde.


    Ingame als RCON Admin einloggen und /admindebug gibt einem den Adminrang 9. Alle Maps wurde entfernt da nicht klar ist ob sie veröffentlicht werden dürfen.

    Dateien über eine Datenbank zu ziehen ist verdammt unsicher, fehleranfällig und ausnutzbar.


    Erstelle lieber ein Repository, welches du dann mit individuellen Accounts der einzelnen Kunden Syncst. Damit kannst du auch direkt Updates verwalten und handeln.

    Als ein Kollege und ich alles in einen gepackt haben und dieser dann endgültig 500 Zeilen enthielt, kam es zu dermaßen häufigenund heftigen Lags alle paar Sekunden, sodass keine einzige Funktion richtig funktionieren wollte - selbst die kleinsten Befehl
    hatten eine Verzögerung von über 2-3 Sekunden, weshalb genau das hier - denke ich zumindest - nicht empfehlenswert ist!


    @Nexor


    Genau das ist eigentlich was ich persönlich als Best Practice bezeichnen würde.


    Der Code wird von Haus aus nacheinander abgearbeitet und die zusätzlichen Timer sind daher nur eine Belastung.


    Kristik47: Dein beschriebenes Problem liegt eher an der Qualität des im Timer ausgeführten Codes. Intensive Schleifen Iterationen kosten Ressourcen und wenn dies alle X ms passiert "hängt" der Server.


    Eine einfache Implementierung für den Ansatz "Ein Timer" ist dass ein Timer erstellt wird, welcher mit dem niedrigsten benötigten Interval läuft und den Rest über Variablen berechnet. Es entsteht dabei nur ein Problem, weswegen dies nicht für extrem wichtige Tasks funktioniert, und zwar das wenn viele Sachen in einem Timer ausgeführt werden, die Execution Time kritisch ist und so für ungenaue Intervalle sorgt, wenn hoher Rechenaufwand entsteht.

    Ich habe ein Problem beim extrahieren von Großbuchstaben aus einem String.


    Der Stock

    Code
    stock build_short_name(string[]) {
    	new	capitals[10];
    	for(new i = 0; i < strlen(string); i++)
    		if(string[i] >= 65 && string[i] <= 90)
    			format(capitals, sizeof(capitals), "%s%s", capitals, string[i]);
       	return capitals;
    }


    Anwendungsfall


    Code
    COMMAND:test(playerid, params[]) {
       	return SendClientMessage(playerid, -1, build_short_name("Los Santos Police Department"));
    }


    Das gewünschte Ergebnis wäre in diesem Fall "LSPD" doch ich bekomme nur "Los Santo".


    Irgendwo ein Fehler?

    Um das Objekt instant wieder zuzumachen wenn es auf ist?Auch wenn du in OnObjectMoved musst du noch eine warte Zeit haben sonst musst du ziemlich fix sein beim reinfahren.


    Wenn es automatisch passieren sollte.


    Aber wenn du schon so kommst, man kann auch das gesamte Script nur auf einem einzigen Timer aufbauen, das ist kein Problem.

    gettime() liefert einen Integer Wert, also musst du in deiner Datenbank ein Integer Feld haben, welches ausreichend groß ist.


    Und


    Zitat

    denn es geht nicht!

    ist immer eine große hilfe, wenn es um debugging geht.



    Und mal so ganz am Rande, immer nur nach Jeffry zu fragen wird dir nichts bringen. Du möchtest ja scripten lernen und für jedes kleinste Problem direkt einen Thread zu erstellen ist dabei kontraproduktiv, vor allem wenn du dann nicht einmal wirklich versuchst es selbst hinzubekommen.


    //Register


    SpielerInfo[playerid][erstelldatum] = gettime();


    // Laden
    cache_get_field_content(0, "registered_at", var); SpielerInfo[playerid][erstelldatum] = strval(var);



    Du musst deinen Speicher Query noch um registered_at oder wie du das Feld nennen möchtest erweitern und das Feld in deiner Datenbanktabelle anlegen.