Beiträge von ronald drunk

    Zunächst einmal Danke für das durchweg positive Feedback!

    Kommt MTA:TD auch mit OOP (mta-seitiges und eigene Klassen) oder der ClassLib zurecht?

    Die Classlib wird als normaler Lua Code betrachtet. Das hat zur Folge, dass "Step Over" wie erwartet funktioniert, er bei "Step Into" aber den Weg über die Classlib (dort insbesondere über die Funktion __inheritIndex, da diese den Zugriff auf die Felder der Table/Objekt steuert).
    Es ist aber durchaus ein gerechtfertigtes Anliegen diese Teile zu überspringen. Ich habe daher mal ein Ticket (https://github.com/Jusonex/MTATD/issues/13) angelegt, um bestimmte Dateien/Codeabschnitte direkt zu überspringen.

    Ich hab zwar noch nie mit Visual Studio für MTA gearbeitet

    Das ist eine häufig gemachte Verwechselung. Visual Studio und Visual Studio Code sind 2 komplett verschiedene Programme. Während Visual Studio die volle, sehr umfangreiche IDE ist, ist VSCode "nur" ein relativ leichtgewichtiger Editor, für den jedoch sehr viele Erweiterungen verfügbar sind.

    Bei mir steht da einfach nur: Fehler: Could not find a launch configuration. Please make sure you created one.
    wie behebe ich das?

    Das behebst du, indem du im Debugger-Tab eine neue Konfiguration anlegst, bevor du den MTA Server startest.

    Guten Abend,

    hiermit möchte ich euch meine neuste Entwicklung vorstellen, die ich MTA:TD getauft habe.

    MTA:TD steht für MTA Test und Debugging Framework und umfasst zurzeit im Wesentlichen einen Debugger, der als Plugin für Visual Studio Code realisiert ist. Die Architektur des Debuggers erlaubt es aber auch mit relativ wenig Aufwand Erweiterungen für andere Editoren mit Pluginunterstützung (wie z.B. Atom) zu schreiben. Da Visual Studio Code jedoch zurzeit, meiner Meinung nach, der beste Editor auch für MTA ist, habe ich mich entschieden die Erweiterung für VSCode umzusetzen.

    Was kann ich damit machen?
    Der Sinn eines Debuggers ist es, Fehler im Code vor allem erst einmal zu finden. Bisher war man in einer MTA-Umgebung leider immer auf irgendwelche Aufrufe von outputChatBox/outputDebugString angewiesen, um herauszufinden, ob einzelne Codeteile überhaupt ausgeführt werden oder welche Inhalte Variablen haben. Wer bereits mit anderen Programmiersprachen gearbeitet hat, weiß diesen Komfort zu schätzen.
    Das möchte ich mit dieser Erweiterung ändern!

    Externer Inhalt i.imgur.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    Diese Erweiterung erlaubt es z.B. Haltepunkte (engl. Breakpoints) durch Klicken links neben der Codezeile zu setzen (rote Punkte auf dem Bild), die die Codeausführung an dieser Stelle anhält, sobald diese erreicht wird. In dem pausierten Zustand sind dann auf der linken Seite die Inhalte der lokalen, upvalue und globalen Variablen zu sehen. Alternativ kann der Inhalt auch eingesehen werden, indem man mit der Maus über die Variable geht (letzteres funktioniert bisher aber nur mit lokalen Variablen).

    Weitere Features

    • Step Over (nächste Zeile in der aktuellen Funktion ausführen)
    • Step Into (nächste Zeile allgemein ausführen, d.h. ggf. Sprung in die Funktion hinein)
    • Resource bei Änderungen über den Restart-Button neu starten
    • integriertes Runcode, sodass Befehle über die in VSCode integrierte Debug Console ausgeführt werden können

    Installation
    Wer VSCode noch nicht installiert hat, kann das von https://code.visualstudio.com/ tun.
    Nach der Installation reicht es dann über den unteren Eintrag in der Aktivitätsleiste (linke Seitenleiste) nach MTA:SA Debugger and Test Framework zu suchen und auf den Install-Button zu drücken.
    Sobald ihr das getan habt, müssen noch folgende Schritte einmalig ausgeführt werden.

    • Die Ressource öffnen, die gedebuggt werden soll (dazu File -> Open Folder)
    • Eine Launchkonfiguration anlegen, indem ihr auf das Debugsymbol (der Käfer) in der Aktivitätsleiste klickt und dann oben links im Dropdownmenü "Add configuration" auswählt. Daraufhin wird eine neue launch.json mit Standardinhalt geöffnet.
    • Überprüft dort, ob der Eintrag bei serverpath stimmt. Wenn nicht, korrigiert ihn (dort muss der Pfad eingetragen werden, in dem MTA Server.exe liegt, aber ohne MTA Server.exe am Ende des Pfades)
    • Nun müsst ihr ein Script zu eurer Ressource hinzufügen, indem ihr F1 drückt und MTA:TD: Add bundle to current project eingebt. Daraufhin wird im aktuellen Verzeichnis eine Datei namens MTATD.bundle.lua erstellt.
    • Diese Datei muss dann in der meta.xml VOR allen anderen Scripts wie folgt eingetragen werden: <script src="MTATD.bundle.lua" type="shared"/>

    Das war's schon mit der Einrichtung. Wenn ihr nun Debuggen wollt, reichen 2 Schritte:

    • F1 drücken -> MTA:TD: Start MTA Debug Server eingeben und bestätigen. Daraufhin wird ein MTA Server in einem speziellen Modus gestartet (direkt starten funktioniert nicht!).
    • Um dann das eigentliche Debugging zu starten, klickt ihr in der Debugansicht auf das Play-Symbol. Sobald dann die Ressource gestartet wird, ist der Debugger bereit und kann auf Breakpoints u.ä. reagieren.

    Wichtig ist außerdem noch, dass der MTA Server auf einer aktuellen Nightly ist: https://nightly.mtasa.com/

    Beachtet außerdem, dass es sich um eine sehr frühe Version handelt, in der noch einige Features fehlen (unter anderem: voller Funktionsaufrufsstapel, Inhalte von Tables richtig anzeigen, Variablen live editieren).

    Code und Mitwirken
    Wenn ihr Interesse habt an dem Projekt mitzuwirken, könnt ihr das gerne über GitHub tun. Das Repository ist unter der Adresse https://github.com/Jusonex/MTATD zu finden.

    Der Vorteil ist im Wesentlichen, dass es nicht zu Lags kommt, da die Routen parallel und viel schneller berechnet werden (ohne weitere Optimierung dauerts aktuell etwa 1ms pro Route).
    Die Lua Ressource hingegen hat bei längeren Routen schonmal locker 500ms gebraucht, in denen der Server/Client dann komplett hängt.

    Ein weiterer Vorteil die Routen auf dem Server zu berechnen ist, dass die relativ große Datei mit den Wegpunkten nicht heruntergeladen werden muss.

    Was mir hier fehlt sind wirklich konkrete Verbesserungsvorschläge. Als ehemaliger Admin weiß ich, dass es schwierig ist einen großen Mix aus Leuten mit unterschiedlichen Interessen und unterschiedlichem Kenntnissstand (Scripter vs Nicht-Scripter etc.) sinnvoll anzusprechen.
    Wir haben damals vieles versucht, vieles ist aber auch fehlgeschlagen. Da es in dieser Richtung in der letzten Zeit auch öfters Vorschläge gab, will ich kurz auf ein paar unserer Ansätze von damals eingehen und kurz erläutern warum diese aus meiner Sicht fehlgeschlagen sind:

    • Multiplayer Center: Idee war es das Themengebiet um weitere Multiplayer-Spiele zu erweitern, um auch Leute anzusprechen, die nicht oder nicht mehr in MTA aktiv sind. Meiner Einschätzung nach ist das gescheitert, weil wir nicht bekannt genug waren, um Nicht-MTA-Leute anzuziehen, andererseits aber der Großteil trotzdem noch so sehr in MTA verwickelt war, dass das Interesse in Bezug auf andere MPs noch zu gering war.
      Bezogen auf die aktuelle Situation ist mein Fazit, dass es keinen Sinn macht, die Themenbereiche deutlich auszuweiten.
    • Communityserver: Als "Scripter" war das, meiner Meinung nach, damals eine super Idee. Gescheitert ist es, weil zum einen zu wenig Leute involviert waren (die meisten waren dann doch lieber bei ihren eigenen Projekten) und wir zum anderen ein paar Fehler bei der Leitung gemacht haben (wir haben viel zu wenig gesteuert, sodass am Ende niemand mehr wusste, was als nächstes getan werden musste).

    Weiterhin war für mich persönlich damals der Hauptgrund hier aktiv zu sein, dass es mir Spaß gemacht hat (und auch noch macht), mich mit Problemen anderer Leute in der Scripting Base zu beschäftigen und eine Lösung auszuknobeln (und idealerweise noch Leute zu finden, die eine noch bessere Idee haben als man selbst). Damit diese Motivation zustande kommt, muss die Frage aber mehr als nur "Wie behebe ich diese Fehlermeldung in meinem VioLite?" beinhalten (gerade auch, weil es viele dieser Fragen schon oft gab). Wenn ich die Scripting Base heute durchgehe, trifft das pessimistisch geschätzt vielleicht auf 1/30 Themen annähernd zu.

    Das liegt wohl hauptsächlich daran, dass die Zahl der "Pioniere", die ausreichend gute Kenntnisse haben etwas wirklich neues zu schaffen, gesunken ist. Das wiederum liegt wohl zu einem Großteil daran, dass MTA mittlerweile doch recht alt geworden ist und daher zumindest im westlichen Teil der Welt uninteressanter für neue Leute geworden ist (das wird auch durch die MTA-Statistiken belegt, in denen der Anteil der deutschsprachigen Spieler aktuell nur noch bei 1,5% liegt - was aber mittlerweile auch schon länger bei diesem Wert liegt), aber auch weil es viele Sachen schon gibt, die damals noch als innovativ galten.

    Nichtsdestotrotz gibt es Hoffnung ( ;) ) und um nicht gegen meine eigene Kritik im ersten Satz zu verstoßen, hier ein konkreter Vorschlag:
    Auch wenn mir damit womöglich von einigen widersprochen wird, bin ich nach wie vor Fan der Idee eines Communityprojekts, bei dem Leute mit verschiedenen Kenntnissen (Scripter, Mapper, Ideenköche, Organistationstalente etc.) an einem gemeinsamen Projekt arbeiten. Idealerweise sollte das von einem Teammitglied koordiniert werden.
    Damit werden dann gleich mehrere Fliegen mit einer Klatsche geschlagen: Wenn alles gut läuft, gibt es durch die Arbeit am Projekt mehr Kommunikation in der Community und zu den Teammitgliedern, aber auch die Möglichkeit gegenseitig etwas voneinander zu lernen.
    Um dabei aber nicht die Fehler des letzten Mals zu machen, ist es wichtig, dass sich ein paar Leute findeb, die in der Lage sind das Projekt zu leiten und man sich ein wenig von dem "das Script ist meins"-Gedanken löst.
    Ich bin mir sicher, dass es da vom Team und insbesondere auch @Audifire Unterstützung zwecks Hosting und anderweitiger Beschaffungen gibt.
    Wenn ernsthaftes Interesse besteht, würde ich mich auch bei den ersten Planungsschritten beteiligen.


    Und jetzt zum Ende hin schließlich noch ein paar böse gutgemeinte Worte:

    Ich bin seit Ende 2011, also dieses Jahr im Oktober 6 Jahre dabei und habe mit MTA an sich nicht mehr viel bis auf das Forum am Hut. Dennoch bin ich, da es meine Pflicht ist jeden Tag viele Stunden im Forum unterwegs und versuche es zum einen "sauber" zu halten und zum anderen zu helfen, wo ich kann.

    Bitte nimm mir das nicht persönlich und folgendes muss auch eher als eine generelle Einschätzung gesehen werden: Meiner Meinung nach reicht das nicht. Ich schätze es absolut, dass du und andere sich dazu überwinden die Zeit aufzuwenden, dennoch denke ich, dass dadurch per Definition kein enger Kontakt zur Community bestehen kann. Wenn man dann noch bedenkt, dass es hier Leute gibt, die in der Community vernetzt sind und sowohl Interesse als auch in der Lage sind einen Moderationsposten auszuüben, ist es durchaus ein begründeter Gedanke das Team zu verlassen und ggf. weiter als normaler Benutzer aktiv zu sein.

    So war es bei mir selbst auch: Ein wichtiger Grund für meinen Austritt war, dass wir vRP eingestellt haben (und ich vorher sowieso nicht gespielt habe) und ich dadurch nicht mehr so den Draht zur Community hatte (und ich die Zeit für das Forum dann lieber für andere Sachen nutze - was ja wie in deinem Fall auch absolut legitim ist).

    Ich habe für Nein gestimmt, weil...

    die Vergangenheit gezeigt hat, dass solche Ansätze - obwohl sie in der Idee oft gut sind - i.d.R. scheitern. Problem ist, dass dieses Konzept nur richtig funktioniert, wenn die Spielerbasis groß genug ist.
    Das ist aber gerade für einen neuen Server nur sehr schwierig zu erreichen. Ein weiteres Problem ist, dass die Entwicklung extrem aufwendig ist und der Server wahrscheinlich nicht mit dem ganzen geplanten Konzept releast werden wird, was die Spielerproblematik weiter verschärft (weil es dann für Spieler noch weniger zu tun gibt).

    Ich persönlich würde einen Ansatz in genau die entgegengesetzte Richtung fahren: Weg vom "strengen", spielerbasierten Roleplay hin zu etwas in Richtung Cops'n'Robbers wie es von CIT bekannt ist/war. D.h., dass der Großteil der Spielprinzipien durch das Skript direkt reguliert wird.
    Das bedeutet unter anderem: Automatisches Wantedsystem, von anderen Spielern weitgehend unabhängige Jobs und keine Fraktionen. Stattdessen freiere Regelungen, sodass Spieler nahezu wann sie wollen zwischen Gut und Böse wechseln können. Das hat dann insbesondere den Vorteil, dass sich das Verhältnis zwischen Cop und Gangster automatisch ausgleicht und so für genügend Abwechslung gesorgt ist, weniger Spieler notwendig sind, damit es läuft und die Entwicklung Bottom-up erfolgen kann.
    So ist es, meiner Einschätzung nach, möglich, mit einem relativ geringen Funktionsumfang (aber genügend Qualität und Tiefe) schon relativ viel Spaß zu erzeugen, sobald man einige Basissysteme implementiert hat (Cops vs Gangster (quasi als Dauer-Gangwar), zunächst relativ einfache Jobs und einige automatisierte Events zwischen Cops und Gangstern).
    Im weiteren Verlauf des Projekts kann man sich dann problemlos in den Bereichen weiter ausdehnen.

    Für Notepad++ ist mir kein solches Plugin bekannt. Für Visual Studio Code (was ich wärmstes empfehlen kann) gibt es das hier: https://marketplace.visualstudio.com/items?itemName=gccfeli.vscode-lua (was ich allerdings selbst noch nicht getestet habe).

    Wenn du (mal angenommen) später in einem Beruf programmierst und mit so einer Website ankommst wird dich der Arbeitgeber erstmal auslachen und dann wegklatschen.

    Wegen der Webseite ja, aber nicht wegen des Prinzips an sich.

    Code Formatter sind durchaus gebräuchlich, da es in der Praxis doch recht häufig passiert, dass mal unabsichtlich die vom Unternehmen/Projekt vorgeschriebene Styleguide verletzt wird. Code Formatter wie ClangFormat für C/C++ sind z.B. sehr mächtig, da sehr präzise eingestellt werden kann, wie der Code auszusehen hat. Wenn man dann kurz vor dem Commit steht, lässt man einmal das Tool drüber laufen und evtl. vorliegende Unstimmigkeiten werden behoben - alles völlig legitim.

    Unabhängig davon heißt das natürlich nicht, dass man den Code nicht gleich ordentlich schreiben sollte (denn das hilft insbesondere bei korrekten Einrückungen schon umgemein).

    Der LUA-Beautifier ist wie der jsBeautifier dafür gedacht generell Code zu deobfuscaten.

    Obfuscation im eigentlichen Sinne ist nochmal etwas anderes. Beim Obfuscaten ist das primäre Ziel Code zu verschleiern. Wenn das mit einem "Beautifier" so schnell rückgängig gemacht werden könnte, wäre das Ziel klar verfehlt.
    Der Hintergrund, weshalb Javascript Code häufig "zusammengepresst" ist, ist eher um die Dateigröße und damit Downloadgröße durch Weglassen unnötiger Zeichen zu minimieren.

    Wenn im Gerätemanager "aktuell" steht, heißt das nur, dass der Treiber mit dem aktuellen Treiber aus den Windows Updates übereinstimmt.
    Windows Update ist aber häufig einige Treiberversionen hinterher und updatet gerade auch ältere Grafikkarten weniger oft. Von daher macht es also durchaus Sinn einen noch aktuelleren Treiber von der Herstellerseite herunterzuladen.

    Kurz gesagt: Nein, ist nicht möglich.

    Luxorions Ansatz könnte zwar, wenn man es wirklich darauf anlegt, in einer ähnlichen Form realisierbar sein (indem man globale Variablen über diesen Weg erhält), aber dann auch nur mit starken Anpassungen am Script selbst (das Problem mit exakt dieser Vorgehensweise ist, dass bei diesem "klassischen Multigamemode"-Ansatz zu viel neu geladen wird, sodass es im Endeffekt auf einen vollständigen Scriptrestart hinausläuft).
    So müsste dann in Einzelfällen unterschieden werden, ob die Daten behalten oder neu geladen werden sollen.

    Letzteres ist bei Scripten wie Vio-Lite in der Praxis nicht mit realistischem Aufwand zu bewerkstelligen, da das Script dafür viel zu undynamisch ist.

    Ganz so gehts nicht. Das liegt daran, dass zum einen die Befehle selbst unter /usr/bin bzw. /bin liegen und zum anderen, weil einige Konfigurationsdateien für eben diese Befehle unter /etc/ verfügbar sein müssen.

    Je nachdem was du genau vor hast, gibt es jedoch Alternativen.
    Wenn du bspw. nur einen FTP/SFTP Zugang geben möchtest, gibt es bei den meisten FTP/SFTP Servern eine chroot-Option, mit der du das Homeverzeichnis zum neuen Wurzelverzeichnis (/) machst. In diesem Fall ist es auch gar nicht nötig Zugriff auf Kommandozeilenbefehle zu geben (da alles vom FTP/SFTP Dienst geregelt wird).

    Wenn du aber eine eigene vollwertige Konsole für einen Benutzer haben willst, bist du auf andere Lösungen angewiesen. Die wohl populärste ist hier die Absicherung mittels AppArmor/SELinux, mit denen du den Zugriff auf einzelne Verzeichnisse/Dateien/Dienste einschränken kannst. Dir sollte allerdings klar sein, dass diese Tools nicht für die Bedienung durch Anfänger gedacht sind und bei falscher Benutzung das Risiko zum Ausbruch sogar erhöht werden kann (oder eben unzureichend ist).
    Wenn du eine volle Isolation haben und nicht Ewigkeiten damit verbringen willst AppArmor/SELinux richtig zu konfigurieren, ist Virtualisierung wohl die bessere Wahl.

    1. Sollte ich Tabellen direkt triggern oder erst in JSON umwandeln?

    Direkt triggern. MTA kann Tables kompakter serialisieren als es in JSON möglich ist und ist damit auch noch deutlich schneller (JSON parsen dauert dazu im Vergleich sehr lange).

    2. Klappt das auch mit Elementen (z.B. Spielern)?

    Nein, klappt nicht, da die Spieler erstmal nur Zeiger (also Speicheradressen) auf die Spieler sind. Beim Senden an die Clients sendet MTA intern statt der Zeiger eine ElementID (die vom Script nicht ausgelesen/beeinflusst werden kann).

    3. Kann es sein, dass es bei JSON eine max. Anzahl gibt? Bei diesem User hatte ich den Bug fixen können, indem ich JSON weggenommen und die Tabelle direkt getriggert hatte.

    Die Größen solltest du unter normalen Umständen nicht erreichen.


    EDIT: @sbx320 hat mich gerade darauf hingewiesen, dass Punkt 2 nicht stimmt. Tatsächlich werden Elemente von MTA gesondert behandelt und können damit korrekt serialisiert, also über JSON versendet werden.

    Ich glaube obiges ist ihm durchaus klar.

    Du irrst dich...
    Der Server den du über den MTA Ordner öffnest ist der selbe wie über das Menü

    Nicht ganz. Der dedizierte Server nutzt die mtaserver.conf als Config, während der "integrierte" Server local.conf lädt. Deswegen sind die Ports dann auch nicht 22003, 22005 (und 22126), sondern 22010, 22011 (und 22133).

    @Topic:
    Zunächst solltest du sicherstellen, dass der Zielrechner auch über IPv4 erreichbar ist (manchmal schafft Windows es nicht selbst eine IPv4 auszuhandeln, IPv6 aber schon) und da MTA kein IPv6 unterstützt, muss auf jeden Fall die 4er IP gehen. Wenn du nur den Hostnamen kennst, kannst du das mit ping -4 hostname testen.
    Wenn das nun einwandfrei funktioniert, solltest du ausschließen, dass es am lokalen Server liegt (der hat nämlich durch die separate Konfiguration ein paar Eigenheiten). Deswegen starte den dedizierten Server (MTA Server.exe im Serverordner des MTA-Programmordners) (was sowieso besser ist, weil du so dann einfacher Gamemodes/Scripts/Maps starten kannst) und versuche dich durch manuelle Eingabe der IP zu verbinden.

    Sollte es dann immer noch nicht klappen, liegt es wahrscheinlich doch an den Firewalleinstellungen, sodass du dort nochmal schauen solltest (e.g. gibt es noch irgendeine Drittanbieter-Firewall?).

    Um noch ein bisschen mehr dazu zu sagen; Es macht zunächst Sinn Javascript und Node.js zu trennen:

    1) Javascript (oder besser ECMAScript) war ursprünglich nur für die Verwendung im Browser gedacht und hat deswegen einige Eigenheiten, die aber mit dem neuen ECMAScript 6-Standard weit weniger geworden sind, weil die Sprache um richtige Objektorientierung, richtige lokale Variablen u.ä. erweitert wurde.
    Durch die heutige Ausbreitung der Sprache sowohl im Web (z.B. mit Frameworks wie Angular für das Frontend) als auch in Server- und Desktopumgebungen mit Node.js hat die Sprache deutlich an Relevanz zugenommen, wodurch viele Leute sie bereits kennen, sie aber, wenn sie neu erlernt wird, auch für andere Anwendungen genutzt werden kann.

    Durch den hohen Bekanntheitsgrad gibt es zusätzlich einige "Alternativen" wie das von Microsoft entwickelt TypeScript, welches Javascript um statische Typisierung erweitert, sodass man sehr viele Möglichkeiten hat, die Modifikationen zu nutzen - selbst wenn man die Sprache an sich nicht mag. Das ist möglich, weil Typescript in Javascript-Code übersetzt werden kann.

    2) Node.js als Ekosystem bringt alles mit, was man für die Entwicklung von Serveranwendungen braucht. Dazu zählt z.B. der Paketmanager NPM, der vollständig kompatibel mit JC3:MP ist, sodass das Installieren eines MySQL Pakets reicht, Unterstützung für MySQL-Datenbanken zu bekommen, ohne dass von der JC3:MP-Community extra ein Modul (so wie es noch bei MTA üblich war) entwickelt werden muss.
    Das spart zum einen erheblich Zeit, führt zum anderen aber auch dazu, dass eine wesentlich höhere Auswahl an Erweiterungen zur Verfügung steht.

    Ehrlicherweise muss man aber sagen, dass die Wahl von Javascript/Node.js im Vergleich zu z.B. Lua auch einige Tücken hat. So ist die Lernkurve von Javascript aufgrund des höheren und teilweise inkonsistenten Sprachumfangs am Anfang recht flach, wohingegen Lua einen recht begrenzten, aber sehr mächtigen Sprachumfang hat und damit besonders am Anfang leichter zu erlernen ist. Ein weiterer "Problempunkt" ist, dass beim Client aus Sicherheitsgründen kein Node.js verfügbar ist, sodass hier viele Funktionen am Ende doch selbst geschrieben werden müssen.

    Nach dem Abwiegen der Vor- und Nachteile sind wir jedoch zu dem Entschluss gekommen, dass Javascript mit Node.js für dieses Projekt die bessere Entscheidung darstellt.