Beiträge von Lead0b110010100

    Hallo,


    ich war gerade dabei eine etwas spannendere Hochzeit zu schreiben und dabei sind mir einige Ungereimtheiten und nicht nötige Abfragen von ymir aufgefallen, die ich mit euch teilen wollte.

    Bei Fehlern im Tutorial einfach kommentieren.


    1. Unnötige Abfrage in "marriage_wedding_is_playing_music" in questlua_marriage.cpp:

    Code
    1. if (pWedding)
    2. lua_pushboolean(L, pWedding->IsPlayingMusic());
    3. else
    4. lua_pushboolean(L, false);


    ersetzen mit:


    Code
    1.             lua_pushboolean(L, pWedding->IsPlayingMusic());
    2.             return 1;


    Erklärung: Die Funktion IsPlayingMusic gibt bereits einen boolean zurück, pWedding kann in dieser Stelle nicht NULL bzw. ein nullptr sein, da die Funktion hier nur auf der Marriage-Map selbst ausgeführt wird. Gestützt wird das durch die unzähligen anderen Funktion in der questlua_marriage.cpp, die diesen Pointer auch nicht vorher prüfen.


    2. Ungenutzte Variable in "ShoutInMap" in marriage.cpp:


    Code
    1. ch->ChatPacket(CHAT_TYPE_COMMAND, msg);


    suchen und ersetzen mit:


    Code
    1. ch->ChatPacket(type, msg);


    Erklärung: Nun kann die ShoutInMap Funktion auch genutzt werden um ganz normale Chatnachrichten in der Map zu senden, Beispiel gefällig?


    Code
    1. std::stringstream test("");
    2. test << "hey " << 123;
    3. ShoutInMap(CHAT_TYPE_INFO, test.str().c_str());



    3. Nullpointer Fix in "marriage_wedding_client_command" in questlua_marriage.cpp:


    In der Funktion suchen:


    Code
    1. if (pMarriage->pWeddingInfo)


    ersetzen mit


    Code
    1. if (pMarriage && pMarriage->pWeddingInfo)


    Erklärung: Sollte der Pointer Null sein, kann man nicht auf pWeddingInfo zugreifen. In allen anderen Funktion wird das auch vorher abgefragt, nur hier nicht. Who knows why.


    4. Bonus: wedding_is_dark und wedding_is_snow Funktionen, um einfacherere Quests schreiben zu können:


    In wedding.cpp irgendwo unter public: einfügen:


    Code
    1. bool IsDark() { return m_isDark; };
    2. bool IsSnow() { return m_isSnow; };


    In questlua_marriage.cpp folgende Funktionen irgendwo einfügen im namespace marriage:



    Unten in der Tabelle folgende zwei Einträge einfügen:


    Code
    1. {"wedding_is_dark", marriage_wedding_is_dark},
    2. {"wedding_is_snow", marriage_wedding_is_snow},


    Dies erlaubt nun Togglefunktionalitäten in Quests wie hier als Beispiel aus meiner Hochzeitsquest:


    Code
    1. when WEDDING_MANAGER.click with pc.is_engaged_or_married() and marriage.in_my_wedding() begin
    2. local sel = select3("Wetter togglen", "Schnee togglen")
    3. if sel == -1 then return end
    4. if sel == 1 then
    5. marriage.wedding_dark(not marriage.wedding_is_dark())
    6. elseif sel == 2 then
    7. marriage.wedding_snow(not marriage.wedding_is_snow())
    8. end
    9. end

    Ja I see. Bei mir und bei anderen nur leider nicht. Wie wählst du deine Mapkoordinaten? (Die in der Settings.txt).

    Achtest du dabei auf irgendetwas Besonderes? Ich nehme den Atlasinfo Manager, damit es keine Überschneidungen gibt, vllt. ist das das Problem?

    Genau gleich, wenn du willst, kannst du mir mal eine nicht funktionierende Map zukommen lassen, dann kann ich's mal bei mir testen.

    Kannst du dich bei mir mal melden per Discord? Würds mit dir gern ausprobieren, vielleicht finden wir ja den Fehler gemeinsam.


    Addy: Lead0b110010100#4415

    Ja I see. Bei mir und bei anderen nur leider nicht. Wie wählst du deine Mapkoordinaten? (Die in der Settings.txt).

    Achtest du dabei auf irgendetwas Besonderes? Ich nehme den Atlasinfo Manager, damit es keine Überschneidungen gibt, vllt. ist das das Problem?

    Wäre zu schön gewesen wenn es gepasst hätte. Mit der server_attr habe ich das Hauptproblem leider immer noch:


    WE:


    Bitte melden Sie sich an, um dieses Bild zu sehen.


    Ingame:


    Bitte melden Sie sich an, um diesen Link zu sehen.

    Perfekt. Dies löst das Problem, wenn auch auf extrem umständliche Art und Weise.

    Ich werde das Ganze für mich so umbauen, dass die Server attr per Knopfdruck clientseitig erstellt und auf den Server gepusht wird.


    Damit ist das Grundproblem gelöst, vielen lieben Dank nochmal!

    Also. Du setzt per WE block zones und Wasser. Dann exportierst du.

    Wie ist der Ablauf bei dir?


    Schau mal oben die beiden .gif's. Da geht's z.B nicht, so ist es bei mir auch und bei meinen Kollegen (etwa 3-4 Leute mit unterschiedlichen Serverfiles) auch.

    map fertigstellen -> safezones -> attr exportieren -> kollision bzw block setzen

    Da ist der Fehler. In deiner server_attr sind keine Blockzones. Das kann dafür sorgen das am Ende z.B Steine in Blockzones spawnen. Also auch in Stadtmitte etc. Das sag nicht nur ich, das beweist der Code:



    Die Prüfung ist eig. verständlich. Falls man keine Ader hat -> Prüfen ob Monster in Blockzone ODER auf einem Objekt ist -> Wenn ja, return, nicht spawnen.

    Und dann die Map in den Server packen und riskieren, dass man nirgends fischen kann oder in irgendeinem Run an einem Fleck keine Monster spawnen und dadurch die Ebene nicht möglich ist. Nur um 12.000 mal die Koordinaten der Map zu ändern damits an diesem Fleck geht und woanders dann nicht mehr.


    Ich weiß nicht, ob mappen dann Spaß macht wenns solche Fehler gibt. Ne leere server_attr ist aus genannten Gründen wohl auch keine Lösung.

    hatte ich noch nie das irgendetwas nicht ging? fischen kannst du, wenn du die server_atttr exportierst wenn wasser gesetzt ist. Monster spawnen 100% an jeder stelle wenn du es so machst

    Also. Du setzt per WE block zones und Wasser. Dann exportierst du.

    Wie ist der Ablauf bei dir?


    Schau mal oben die beiden .gif's. Da geht's z.B nicht, so ist es bei mir auch und bei meinen Kollegen (etwa 3-4 Leute mit unterschiedlichen Serverfiles) auch.

    Wollt mich halt auch mal am Mappen versuchen wäre halt dann wirklich ganz nice wenn es da was geben würde

    was hat das mit dem thema zu tun? mappen kann man seit dem der we public ist.

    Und dann die Map in den Server packen und riskieren, dass man nirgends fischen kann oder in irgendeinem Run an einem Fleck keine Monster spawnen und dadurch die Ebene nicht möglich ist. Nur um 12.000 mal die Koordinaten der Map zu ändern damits an diesem Fleck geht und woanders dann nicht mehr.


    Ich weiß nicht, ob mappen dann Spaß macht wenns solche Fehler gibt. Ne leere server_attr ist aus genannten Gründen wohl auch keine Lösung.

    _Tx Mein Vorredner hat bereits ein Beispiel dazu gepostet. Logischerweise buggen alte Maps nicht rum (z.B: DE, Map 1), weil ich davon ja keine neue server_attr erstellt habe. Ich habe da immernoch die drin, die schon immer drin war. Dementsprechend hab ich keine verbuggte server_attr aus dem WE oder sonstigen Tools reingezogen. Ich hatte diesen Fehler aber auch schon damals bei Fliegefiles. Ich bin mir fast sicher, dass es am Exportierer liegt (WE für fast alle), wie auch Marty es anscheinend selbst schon geschrieben hat und nicht an den Serverfiles


    M3ragon Ich probiere es sofort aus. Ergebnis meines Tests:

    Der Test ist hinfällig, da die aktuellste Version die v34 ist und mit der habe ich es getestet.


    Syntax Der WE hat die server_attr Exporation als 'Beta function' seit der Version v14 drin, genau so funktioniert sie auch. Sie funktioniert und gibt dir eine server_attr aus, aber ingame ist alles verschoben. Da wo sonst keine Blockzone auf dem WE ist, ist plötzlich für den Server eine Blockzone usw.

    Das Problem: WorldEditor von Marty erzeugt zwar eine gülltige server_attr, im Server sind die Blockzones dann allerdings völlig verschoben und an den unmöglichsten Stellen sind plötzlich Blockzones und da spawnen keine Monster. Map Converter wurde probiert, funktionierte leider auch nicht.


    Der Link zu den anderen Tools auf den anderen Foren (auch ausländischen) war leider down. Gab noch eine Japanische (?) Seite, wo ich den Downloadlink trotz Übersetzung nicht gefunden hab.


    Wäre nett wenn hier jemand einen zur Verfügung stellt, auf Marty braucht man eig. nicht zu hoffen. Geil wärs natürlich, wenns direkt im WE geht in Zukunft.

    Füge in intrologin.py unter imports ein:

    Code
    1. import serverCommandParser


    Erklärung:

    In der Datei serverCommandParser.py, in Zeile 63 wird eine Instanz der Klasse 'ServerCommandParser' erstellt:

    Code
    1. parserWnd = ServerCommandParser()


    Der Aufruf der __init__ Funktion führt folgendes aus:

    Code
    1. net.SetServerCommandParserWindow(self)


    Das ist ein Call auf eine Funktion in der Binary, die grob gesagt eine Variable setzt, die hier genutzt wird (CPythonNetworkStream::ServerCommand):


    Im SelectWindow können sonst keine Commandos, die im Clienten in Python definiert sind, verarbeitet werden. Dies geht erst wenn

    Code
    1. if (m_apoPhaseWnd[PHASE_WINDOW_GAME])

    m_apoPhaseWnd[PHASE_WINDOW_GAME] einen gülltigen boolschen Wert ergibt, der true ist. (Im Prinzip jede Zahl im Speicher an dieser Stelle != 0)


    Stattdessen hast du mit diesen Zeilen nun eingestellt, dass er auf den else if (...) Teil springt und ganz bestimmte Funktionen innerhalb des servercommandparser.py definiert hat, die auch im SelectWindow gesetzt werden können. Vieles geht aber erst, wenn das Interface aufgebaut ist. Achte darauf in welcher Phase du dem Clienten Instruktionen schickst, nicht jede Phase kann jedes Element erreichen. Login kann z.B: nicht interfaceModule erreichen usw.


    Hoffe das genügt und fixxt dein Problem. Mein Problem wurde damit vor einer Woche tatsächlich gefixxt (Ist aber standartmäßig eig. schon bei den Serverfiles drin dieser Import). Es gibt eine weitere Lösungsmethode bzw. Fehler von YMIR, aber der erfordert etwas mehr TO-DO in der Server-Source bzgl. Events und GlobalEventFlags.

    Der Preis ist absolut gerechtfertigt, hab auch schon in Monaten das Dreifache angeboten bekommen und abgelehnt. Ich hab aber auch eigene Systeme gecoded für die Server.

    Rechnet es einfach auf 4Std / Tag runter, ist gar nicht so viel. Klingt nur in dieser Szene etwas over the top, weil man es nicht gewohnt ist.


    Viel Glück!

    Was mich gerade interessieren würde ist, wie M2BOB diese 'Security' Funktionen wie das PIN - System umgehen können. Ich mein, damit die LoginPrepare Methode aufgerufen wird, MUSS man in der db.cpp durch die QID_AUTH_LOGIN case gehen, anders kommt man da ja nicht hin. Also wenn deine Abfragen da drin sind, muss m2bob ja auch daran vorbei. Weiß jemand da mehr?


    Hat jemand zufällig eine Sekunde Zeit um das Mal mit mir zu testen (am Besten mit m2bob Account)?

    Warum muss M2bob daran vorbei wenn die einfach automatisiert bei der Pin Code abfrage den Code eingeben müssen?

    Ist ja nicht so dass der Code sich immer ändert wie bei OTPs und selbst da könnte man das automatisieren wenn auch mit mehr Aufwand.

    Achso ja, aber ich mein wer macht denn keine automatische 'Sperre' rein bei zu vielen falschen Versuchen? Das sollte man doch alleine schon deshalb verhindern, damit nicht jemand auf die Idee kommt den Server zu belasten durch zu viele Anfragen.


    Oder übersehe ich da was?

    Was mich gerade interessieren würde ist, wie M2BOB diese 'Security' Funktionen wie das PIN - System umgehen können. Ich mein, damit die LoginPrepare Methode aufgerufen wird, MUSS man in der db.cpp durch die QID_AUTH_LOGIN case gehen, anders kommt man da ja nicht hin. Also wenn deine Abfragen da drin sind, muss m2bob ja auch daran vorbei. Weiß jemand da mehr?


    Hat jemand zufällig eine Sekunde Zeit um das Mal mit mir zu testen (am Besten mit m2bob Account)?

    Nein warum schwer? Hatte das mal prototypisch gebastelt wie bei Pokemon rot. (Falls du die Textboxxen da kennst).

    Hab den Code leider nicht mehr hier, aber ich hatte den Satz einfach getrennt in Buchstaben. Dann hab ich die Buchstaben in Wörtern zusammengefügt, bis die maximale Länge der Seite erreicht war. Anschließend musste man enter drücken, damit die nächsten Buchstaben einfliegen.


    Du kannst dafür die OnUpdate Funktion und eines der zahlreichen Timer nutzen. Ich nutze gern app.GetTime(), gibt aber auch GetServerTime und andere Konsorten mit denen du sowas Ähnliches umsetzen könntest. Yuma