Beiträge von Lead0b110010100

    Noch geiler wäre es, wenn du den Text tatsächlich wie bei so einer Schreibmaschine tippen lässt. (Den Effekt imitierst) Dafür einfach Buchstabe für Buchstabe mit random delay printen, statt direkt den ganzen Text :)


    Aber nice Idee!

    Ich weiß nicht genau was mit "Client Performance" gemeint ist, aber es lässt sich sehr viel Performance gewinnen, wenn man auf C++17 und GCC upgraded. Man muss dann halt auch noch wissen worauf man dann genau achtet, denn nur die Version zu erhöhen bringt nichts. Man muss den Code dann auch updaten, da es nun mehr Optimierungsmöglichkeiten gibt, die man auch nutzen sollte.


    Kleines Beispiel: In 99.99% der Fälle lässt sich der "push_back" - Befehl auf Vektoren und der "insert" - Befehl auf map's verhindern. Zusätzlich kann man fast überall die unordered_map in der unordered_map header file aus der STL nutzen, wenn man keine Reihenfolge für Maps braucht. Außerdem sollte man nach dem Deklarieren eines Vektors immer noch mit dem "reserve" Befehl festlegen wie viele Elemente man plant in diesem Vektor abzuspeichern, sofern man das weiß. Lässt sich natürlich disskutieren warum man dann nicht direkt std::array genutzt hat, wenn man doch eh die Länge kennt. Aber jah, soviel dazu.


    Bevor: mein_vector.push_back(NewEntity(a, b, c));

    Danach: mein_vector.emplace_back(a, b, c);


    Man kann zwar auch std::in_place nutzen, aber das oben ist soweit ich weiß die einfachste Möglichkeit etwas Geschwindigkeit insgesamt zu gewinnen. Wenn man das überall konsequent macht, gewinnt man Einiges. Man muss natürlich wissen was man da tut. Falls es dich interessiert warum das 'danach' schneller ist: bei push_back wird die Klasse zunächst einmal erstellt, dann wird der Vektor um 1 Feld erweitert, also der Speicher dafür freigelegt und anschließend wird das zuvor erstellte Objekt in diesen Speicher hineinkopiert. Direkt nach dieser Zeile wird das erste Objekt (welches gemoved wurde) zerstört. Das ist eine move und eine destroy Operation mehr als bei emplace_back passiert, da wird die Entität mit den Parametern a, b und c direkt in place erstellt, muss also nicht kopiert werden. Zusätzlich würde ich überall wo möglich Smart Pointer nutzen, aus eig. obvious reasons. Bei shared_ptr gibt es noch einen kleinen Overhead für den Kontrollblock, aber ich denke das nimmt man dann gern in kauf.


    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    Jetzt noch etwas weniger Technisches: Es gibt die Möglichkeit das FPS Limit von 60 zu entfernen (die public Methoden sind beschissen, bloß nicht machen). Das hat den Effekt, dass die OnUpdate und Render Funktionen des Clienten eben nicht mehr 60x pro Sekunde sondern z.B: 220x gecalled werden. Das sorgt insgesamt für ein flüssigeres Spielerlebnis, finde zumindestens ich. Dieser Change hat aber den Nachteil, dass der CPU nun natürlich mehr genutzt wird, also 5 Clienten nebeneinander öffnen und rendern könnte die Grafikkarte nun stark belasten. (Ist zumindestens bei meiner Graka so). Und zuletzt gibt es einige public memory leak's die man fixxen kann. Es lässt sich auch viel Dead Code aus den Sources entfernen, der für ingesamt weniger Abfragen -> Weniger unnötige CPU Usage -> Mehr Performance sorgt, grob gesagt.


    Zudem kann man diese 'SetOutline' Methode einfach so umschreiben, dass die Textinstanzen auf der Overworld keine Laggs mehr erzeugen, hab das von einem gekauft der das hier mal kurzfristig angeboten hatte. Funktioniert echt gut und dann muss man nicht auf die 'Qualität der Namen' verzichten.


    Wenn du das alles konsequent durchziehst und umsetzt, sehen wir uns in 6-12 Monaten erneut. Dann kannste nochmal fragen, dann gibt es vielleicht sogar schon C++20 und du darfst nochmal 'neueren Codestil' umsetzen :D #TusNicht

    Ich mein man kann die SQL Lücke nicht schönreden. Aber Multiquerys können auf Datenbankebene deaktiviert werden, dann führt diese Query nichts aus. An weitere Daten kommt man trotzdem womöglich, wobei bei einem UPDATE.. Müsste man auf Fehler hoffen. SELECT wäre schöner hierfür.


    Ist das denn immernoch eine Problematik oder schon gefixxt in der aktuellen Version? .colossus.

    Oki thanks but, i search fonction in python for block an item or an button, but is good, i have code this function haha :)

    Blocking an item to use on a specific map on the clientside is really funny though. Just tell me which item you block on which map later and I will constanly use it because you probably won't block it on the serverside. (Even ymir forgot some of that checks, like putting an equipped item to safebox and so on).


    But if you really need it on the clientside (just consider that now hackers could grab the player index of the map too, not only users). I won't tell you how to add it but I tell you the files and the functions.


    InstanceBase.cpp


    InstanceBase.h

    Code
    1. public:
    2. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    3. void SetMapIndex(DWORD map_index);
    4. DWORD GetMapIndex();
    5. #endif
    6. protected:
    7. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    8. DWORD m_dwMapIndex;
    9. #endif


    Locale_inc.h

    Code
    1. #define PLAYER_GET_MAP_INDEX_FUNC // Enables the player.GetMapIndex() + player.InDungeon() function.


    NetworkActorManager.cpp

    Code
    1. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    2. pkInstFind->SetMapIndex(c_rkNetUpdateActorData.m_dwMapIndex);
    3. #endif


    NetworkActorManager.h

    Code
    1. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    2. DWORD m_dwMapIndex;
    3. #endif


    Packet.h (I won' be so cruel here. Put it in the TPacketGCCharacterUpdate typedefed struct):

    Code
    1. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    2. DWORD dwMapIndex;
    3. #endif


    PythonNetworkStreamPhaseGameActor.cpp

    Code
    1. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    2. kNetUpdateActorData.m_dwMapIndex = chrUpdatePacket.dwMapIndex;
    3. #endif


    PythonPlayerModule.cpp


    CommonDefines.h

    Code
    1. #define PLAYER_GET_MAP_INDEX_FUNC // Enables the player.GetMapIndex() + player.InDungeon() function.


    char.cpp (In CHARACTER::UpdatePacket)

    Code
    1. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    2. pack.dwMapIndex = GetMapIndex();
    3. #endif


    packet.h (In TPacketGCCharacterUpdate typedefed struct again)

    Code
    1. #ifdef PLAYER_GET_MAP_INDEX_FUNC
    2. DWORD dwMapIndex;
    3. #endif

    Was ist wenn mans einfach in eine Funktion packt ?

    Code
    1. function DoSelect(left, right) {
    2. return select(left, right)
    3. }
    4. when kill begin
    5. if DoSelect("Ich bin bereit!", "Abbrechen..") == 2 then return end
    6. end

    Das ist natürlich auch nur ein Pflaster das gescheiteste ist dem kurz auf den Grund zu gehen.

    Hab das mal getestet, hat leider nichts an dem Problem geändert. Hab auch probiert den kill Trigger in einem anderen state auszuführen.

    Liegt es nicht daran, dass select ein reservierte Basisfunktion von Lua ist?


    Code
    1. print(type(select) == "function")

    Innerhalb des ersten Kontexts ist dies aber nicht der Fall.

    Macht diese Erklärung Sinn?

    Allerdings wird das Wort ja zu hauf in anderen Quests verwendet und erzeugt da nicht diesen Fehler. Nur in diesem ganz speziellen Szenario, innerhalb eines allgemeinen Triggers erscheint dieser Fehler.

    Ja. Hab auch mit Darisil gesprochen und er hat mir zugestimmt, dass ich zitiere "man nicht jeden Scheiß in diesem Spiel fixxen kann".

    Also bei den Marty files geht es.

    Unsere Funktionen sind identisch. Die Quest oben gibt bei dir also keinen Fehler? (Die ohne Timer meine ich)

    Warum kann man keine "select" Abfragen innerhalb von generellen Triggern machen?`

    Code
    1. when kill begin
    2. local sel = select("Ich bin bereit!", "Abbrechen..")
    3. if sel == 2 then return end
    4. end
    5. -- Working: when xy.kill begin + select
    6. -- Not working: when kill begin + select

    Hab den Code bis questnpc.cpp verglichen und es wird genau die selbe Funktion mit den selben Variablen aufgerufen. Ich hab leider auch kein Beispiel das funktioniert um das Problem über einen Vergleich zu lösen. Bis morgen setz ich mir einen Windows - Server auf und debugge mal die Server - Source, vielleicht find ich ja was. Oder einer von euch weiß mehr darüber.


    P.S: Für die, die das Problem auch haben sollten, hier ein quick and dirty workaround mit einem Timer:

    Code
    1. when kill begin
    2. timer("demonstration", 1)
    3. end
    4. when demonstration.timer begin
    5. local sel = select("Ich bin bereit!", "Abbrechen..")
    6. if sel == 2 then return end
    7. end

    Ich rate auch nochmal ab bei ihm zu kaufen. Er hat eine Map von mir bekommen, bei der das Terrain schon fertig war und schon eine Pseudotextur draufwar. Ich hab ihm gesagt er soll sie einfach etwas 'schöner' machen die Übergänge und Objekte draufplacen.


    Das hat er dann auch recht fix gemacht, allerdings hat er mir neben der Map 5GB an Objekten / Texturen usw. mitgeschickt. Das hat er vorher auch angekündigt, aber so war die Map für mich unnutzbar. Dann habe ich ihm mehrmals geschrieben, das ich meine Map mit passenden Objekten brauche und mir nicht selbst jedes Objekt aus den 5GB + alle Texturen rausfischen kann. Dann hat er mich einige Male vertröstet und nun antwortet er auch schon nicht mehr.


    Zu mir war er ganz nett, also persönlich und bilig ist er auch. Aber genau das sind auch seine Maps, der Service ist nicht existent. Nachdem ihr bezahlt habt antwortet er nur sporadisch wenn er grad die Lust dazu hat. Ein absolutes Nein. Die Map hab ich btw. dann selbst neu gemacht weil seine so unnutzbar war.


    Hier nochmal ein Screen als Beweis (Und bevor das so aussieht als hätte ich nach einer Woche schon gemeckert nein, es ist nun etwa einen Monat her. Aber nach ewigem hin und her, hab ichs aufgegeben):


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


    Damit schließe ich übrigens jegliche Kooperation für die Zukunft aus, die 20€ die ich dir gegeben habe sind zwar verloren aber dafür bin ich um einen unseriösen Partner ärmer und das ist mir das Geld wert, zum Glück waren es nicht mehr.

    So da alle vor mir nur aus der Sicht eines Pservers argumentiert haben. Nun der wirkliche Tipp melde einfach eine Firma and kannst mittlerweile online ein Kleingewerbe anmelden kostet ca. 30€. Dann holst dir ein Buisnessaccount und mach es ganz legitim. Du bist ein Dienstleister und musst dir keine dir eigentlich keine Sorgen machen. Zahlst deine Steuern wie ein normaler Bürger. Kannst dir das Geld am Ende ja eh "zurückholen". Du hast ja auch ein Freibetrag von 24500€ bei der Gewerbesteuer. Lohnt sich aber auch nur wenn du mehr als 500€ im Monat machst.

    Ist meines Erachtens auch die richtigste Herangehensweise an die Sache. Zahl deine Steuern und zumindestens der riesengroße Fick des Finanzamtes bleibt dir erspart. Auch brauchst du dann keine Angst bei PayPal und co. haben, auch bei größeren Summen nicht. Ich weiß nur nicht wie das mit einem Kleingewerbe ist, während man berufstätig ist. Mein Arbeitsvertrag (Auszubildenenvertrag) untersagt diese zwar nicht explizit, aber ich brauch das Ok von meinem Chef für eine Nebentätigkeit und er kann dieses Ok jederzeit widerrufen.

    Nein muss nicht zu deiner inaktiven Phase gewesen sein, der Server hatte nie mehr als 1000 Spieler gleichzeitig online, gehörte also immer zu den Kleineren. Das war auch nur ein Beispiel aus meiner eigenen Erfahrung mit diesem Thema.


    Die Servernamen würde ich gerne weiterhin geheimhalten, weil ich damit gar nicht mehr in Verbindung gebracht werden möchte. Hab damals ein paar technisch wirklich dumme Fehler gemacht, für die ich mich heute schäme :D #RunsSindWiederDown #KeineTimerInRuns

    Vorherrschende vs. meine Meinung

    Anders als Sanii und co. sehe ich nicht, wieso ein Gamemaster in dieser Szene ein festes Gehalt bekommen sollte.

    War doch nie die Rede davon, so wie der Thread Ersteller es geschrieben hat schließt er eine bezahlung von GMs komplett aus. Niemand hat von einem festen Gehalt gesprochen. Es ging nur darum das er schon von Anfang an sagt das GMs keine Vergütung bekommen, damit ist eingeschlossen das die GMs auch bei hoher Aktivität etc. kein Geld erhalten. Ging nur darum, niemand fordert das er GMs fest bezahlen soll.

    Ehrlich gesagt hab ich das gelesen und mir eher gedacht "kleinere Bezahlungen nebenbei werden wohl üblich sein". Nur eben keine feste monatliche Vergütung.


    So wie es auf nahezu allen Servern üblich ist oder? Kennt ihr ein Gegenbeispiel? Kenne ein paar EX GM's aus Lysium, Rubinum und Aeldra, alle wurden nie fest bezahlt. War das nur bei denen so? Wurden höhere Ränge fest bezahlt?

    Vorherrschende vs. meine Meinung

    Anders als Sanii und co. sehe ich nicht, wieso ein Gamemaster in dieser Szene ein festes Gehalt bekommen sollte. Der Aufwand, den diese GM's pro Tag haben begrenzt sich (zumindestens war das bei den Servern wo ich mitgemacht hab oder die ich geleitet hab) auf einige Stunden. Meistens sind 2 oder mehrere GM's gleichzeitig online und können sich abwechseln. Zudem spielen Gamemaster auch zu hoher Wahrscheinlichkeit den Server selbst, was sie auch sollten und wollen dem Projekt einfach helfen. Gamemaster sind leicht zu finden und leicht zu ersetzen, ist aber erstmal ein guter Developer weg, ist das vielleicht einer von 20 Leuten in der Szene, die du nicht mehr ersetzen kannst und bei denen du es dir verscherzt hast. Mach das ein paar Mal und du findest keinen DEV mehr, also keinen Gescheiten.


    "Sollten Gamemaster also gar keinen Teil am finanziellen Erfolg des Servers haben?"

    Wie ich das gemacht habe ist folgendermaßen: Meine Gamemaster haben nie ein Gehalt bekommen. Ich habe mich mit jedem von ihnen angefreundet, ihnen gesagt was ich von ihnen erwarte und ein Bestrafungssystem etabliert. Nach 3 Verwarnungen (die noch liefen) war man raus, ganz einfach. Trotzdem habe ich jedem einzelnen von ihnen, vorallem zu Weihnachten (obwohl ich selbst das nicht einmal feier), die eine oder andere PSC überreicht. Das waren dann einfach die, die ich am Tag bekommen habe. Ich habe also einen Tag im Monat immer dazu genutzt, um meine Gamemaster damit zu 'entschädigen' und den Rest für mich selbst und den Server genutzt. Das waren dann rund 500 bis maximal 1000€ die ich pro Monat dann weniger hatte, dafür aber immernoch mit den Jungs befreundet bin und ab und zu sogar noch in Urlaub fahre. So kanns auch gehen und das beweist mir, das meine Führung und dieses System sehr gut funktionieren kann. Der Server lief immerhin etwas über 1.5 Jahre, ist nicht viel - Aber mehr als 90% der aktuell startenden Server.

    Allgemein: Der Preis ist absolut überteuert. Für die Metinszene. Und nun? Ich habs damals schon gesagt in meinem Teamlerliste Thread und sage es hier gern nochmal: Kauft es oder kauft es nicht, aber nervt den Jungen doch nicht mit euren Preisvorstellungen. Ihr seid höchstwahrscheinlich die selben Personen die sich im Reallife ein in der Herstellung ~350€ Handy für mehr als 1.000€ zum Verkaufsstart holen. Ja ich spreche mit euch, Apple Fans. (Ich gehöre dazu, nur kaufe ich mir die Geräte nie sondern bekomme sie zu Birthdays geschenkt alle 3-4 jahre.)


    Zusammenfassend: Ihr könnt euch das nicht leisten und das ist in Ordnung. Große Server aber schon. Irgendwer wird sich das kaufen und lieber macht er hiermit bei einem Verkauf 800€ als das System bei sich auf dem PC vergammeln zu lassen.

    He is very professional and knows what he does. I recommend him to anybody who likes clean and reliable code and support.

    I mean I even know him longer than he knows me, he helped me in the past with various problems without even considering taking money for the time he spent for me. (I was 16 or 17 back then)


    Love and support for one of the most talented developers out there!