Beiträge von Lead0b110010100

    Mach das Paketlimit raus in der Client-Source.


    Code
    1. // const DWORD MAX_RECV_COUNT = 4;
    2. // const DWORD SAFE_RECV_BUFSIZE = 8192;
    3. // DWORD dwRecvCount = 0;
    4. while (ret)
    5. {
    6. // if (dwRecvCount++ >= MAX_RECV_COUNT - 1 && GetRecvBufferSize() < SAFE_RECV_BUFSIZE && m_strPhase == "Game") //phase_game
    7. // break;

    Das mit dem Toolset halte ich für Unsinn um ehrlich zu sein, aber klar - Kann ja sein das ein anderes Toolset (ein anderer Stand des Compilers) das ganze im Background anders verarbeitet. Aber sollte nicht.


    Und ja, ist okay - Wäre auch schön wenns getestet wird.

    So, hier der Fix:


    In PythonItem.h über der Klasse einfügen:



    Folgende Funktionsdefinitionen suchen und ersetzen:


    Code
    1. bool GetCloseItem(const TPixelPosition& c_rPixelPosition, DWORD* pdwItemID, DWORD dwDistance);
    2. bool GetCloseMoney(const TPixelPosition& c_rPixelPosition, DWORD* pdwItemID, DWORD dwDistance);


    Hier meine Funktionen für die PythonItem.cpp, einfach bei euch anpassen wie ihr es braucht. Ihr könnts eig. ersetzen denke ich.



    Erklärung: Schuld waren zwei Dinge.


    1) DWORD dwCloseItemDistance = 1000 * 1000; - Die Variable nutzt hardcode 1000 als maximale Distance, es sollte aber dwDistance genutzt werden was entweder 500 (auf dem Pferd) oder 300 (normaler Spieler) ist.


    2) c_rPixelPosition.y-(-pInstance->v3EndPosition.y) - Kann negativ sein. DWORD(...) ihr versteht schon, Wertebereich geht bei unsigned Datentypen nicht ins Negative, deshalb können sie ja doppelt so groß sein wie signed Zahlen.


    ___________________________________________________________________________________________________________


    Bonus:


    Hier die CItem::DistanceValid - Funktion auf Serverseite. Falls der User läuft und dabei Dinge aufhebt, ändert er seine Position. Bis das Packet beim Server ankommt können das einige viele Koordis sein und der Spieler muss zurücklaufen zum Aufheben, zum Fixxen hab ich eine Tolleranzvariable eingeführt + das mit dem Pferd beachtet.


    Ein Salt der nirgendwo steht ist unbrauchbar. Du meinst glaub Pepper. Denn der Salt wird jedes Mal gebraucht, wenn der Nutzer ein Passwort im Klartext sendet, der Server verbindet Salt und Klartextpasswort und vergleicht mit dem Hash, der in der Datenbank steht.


    So ist die wirklich einfachste Methode, es gibt aber auch Hashingalgorithmen die z.B: erst hashen, dann salt einbinden, dann noch Mal hashen usw. Aber needless to say: Man braucht den Salt des Users im Klartext.

    Der Nutzer schickt den Pin=Salt doch beim Login versuch mit

    Ich schreib dich mal privat an zur Klärung.

    Ein + steht für 'UND' demnach ist nicht der Salt mit PIN (könnte aber auch) sondern:

    Wir haben einen Hash UND einen PIN.

    Das ist mir bewusst, die einfachste Möglichkeit, und dazu mit einer der sichersten ist den Pin als Salt zu nutzen anstatt ihn mit abzuspeichern, ein salt der nirgendwo steht ist der sicherste

    Ein Salt der nirgendwo steht ist unbrauchbar. Du meinst glaub Pepper. Denn der Salt wird jedes Mal gebraucht, wenn der Nutzer ein Passwort im Klartext sendet, der Server verbindet Salt und Klartextpasswort und vergleicht mit dem Hash, der in der Datenbank steht.


    So ist die wirklich einfachste Methode, es gibt aber auch Hashingalgorithmen die z.B: erst hashen, dann salt einbinden, dann noch Mal hashen usw. Aber needless to say: Man braucht den Salt des Users im Klartext.

    Mal ein Gedankenanstoß:


    Was bringt der PIN wenn er in Klartext in der Datenbank steht?

    Der PIN alleine insofern ist in diesem Szenario nutzlos. Er ist allerdings nur der zweite Faktor der Sicherheit und entfaltet seine Stärke erst in Kombination mit einem Passwort, dass nicht im Klartext in der Datenbank steht und ordentlich gehasht wurde (samt Salt und Pepper).


    Also kurz:


    Passwort alleine, als md5 = Super schlecht

    Passwort alleine, als shaXXX = okay

    Passwort alleine, als shaXXX mit salt und pepper = super

    Passwort als shaXXX mit salt und pepper + PIN = töfte

    Hallo,


    beim Nutzen der d.purge() Funktion in Dungeons werden Mounts despawned, falls man sie nicht aktuell reitet. Hier der 'Fix' bzw. einfach eine spezifischere IF-Abfrage.


    dungeon.cpp


    In "struct FPurgeSectree" suchen:

    Code
    1. if (!ch->IsPC() && !ch->IsPet())


    ersetzen mit:

    Code
    1. if (ch->IsMonster() || ch->IsStone())


    Erklärung: Nun werden nur Monster ODER Steine gepurged nichts weiter. Keine Reittiere, keine Portale, keine special npc's.

    Hallo,


    auf meinem alten Server hab ich die Prüfungen für Beleidigungen (in Shopnamen usw.) deaktiviert, weil User nun anstelle des "Hurensohn"s einfach "Hs" oder "Huren.Sohn" oder "H.Sohn" geschrieben haben. Hier das Tutorial dazu wie das per Configoption (INSULT_CHECK) geht:


    banword.cpp:


    Unter

    Code
    1. bool CBanwordManager::CheckString(const char *c_pszString, size_t _len)
    2. {


    folgendes einfügen:

    Code
    1. if (!g_bEnableInsultCheck)
    2. return true;



    Und unter

    Code
    1. void CBanwordManager::ConvertString(char *c_pszString, size_t _len)
    2. {


    das Selbe einfügen:

    Code
    1. if (!g_bEnableInsultCheck)
    2. return;


    config.cpp


    Unter ifdefs einfügen:


    Code
    1. bool g_bEnableInsultCheck = true;


    Bei den Tokens in "static bool __LoadGeneralConfigFile(const char *configName)" - Funktion einfügen:


    Code
    1. TOKEN("insult_check")
    2. {
    3. int flag = 0;
    4. str_to_number(flag, value_string);
    5. g_bEnableInsultCheck = !!flag;
    6. fprintf(stdout, "INSULT_CHECK: %s\n", (g_bEnableInsultCheck) ? "ENABLED" : "DISABLED");
    7. continue;
    8. }


    config.h


    Unter ifdefs einfügen:


    Code
    1. extern bool g_bEnableInsultCheck;

    Guck dir den code von dem Official like cube an von ihm, ein haufen scheiße mit 10 codeleichen von ihm selbst, eine unfertigen cube_make funktion und nem core downer. Und sowas verkauft er und wundert sich das sein zeug geleaked wird. Suche verzweifelt nach einem elementar waffen system was auf DE ja neu ist was er nun anbietet, aber hell no nicht mal für 50euro wäre es das wert bei ihm. Ich weiß nicht wie sein support ist wenn man bei ihm kauft aber kann ja wohl nicht angehen das er sein system verbuggt verkauft, du das einbaust und dann erst bemerkst das da zisch tote codestellen drinne sind und funktionen die keinen sinn haben und ins leere verlaufen und noch core downer die man direkt erkennt sobald man sich die stelle anschaut. Selbst wenn er das direkt fixt sollte sowas eigentlich direkt beim erhalt der ware gefixxt sein. Für mich sieht das so aus als codet er die systeme nach yt vorgaben von offi, aber testet diese dann nicht selbst vollständig sondern geht nur grob drüber nach dem motto "ok compile geht, ein test ig hat geklappt, ready to go"

    Friend when you install a normal public system that errors appear, jajajajaja

    Thanks for your criticism

    Regards!

    Just try to improve your coding.. I don't even want to harm you, I think what you do is great but I know you can do it better.

    There's just so much potential that's wasted in my opinion.


    To make that clear: I really like your systems, THEY WORK. But you can't edit them or even change anything, because of the coding style. Ente and VegaS had that problems too when they started. But today? Both of them write really professional and good code. You don't have to like them or their personalities, but they do a GREAT job for this community and they will get my respect for the improvements in their coding over the years. Just compare the PVP System of Vegas from 2016/7 or Maintenance System to his newer systems today. There's a universe between them!


    Try to use programming patterns or just google 'clean code'. You will do yourself and your customers a favor <3

    Let's just begin with the positive aspects that speaks for your work and your abilities:

    - You really know, what the servers need in 2020. They want 'reworks' of .DE systems, they need little adjustments and they want to buy it from a website without having to talk to somebody much

    - You code things, that other people don't. You're unique in this case.


    But I really have one big point which I have to state out:

    Why don't you even consider following the rules of 'clean code'? I've read code from you, that works - But isn't maintainable. If I wanted to add a feature to one of your systems I'd probably end up coding the whole thing from scratch again instead of using yours. I will face bugs that will scare the shit out of me. It's really garbage, but I won't give any examples. Because I think you know that.


    IF you really don't know, write to me in private. I'll show you what I mean and where I would rewrite the code.


    Anyways, keep the work up. Improve yourself, that's anything I want :)!

    Tu ich sowieso 😅

    Mit solcher Menschen hatte ich genug zutun und ich nehme die nicht mal ernst 🙂

    Falls du Interesse hast und ein guten Team suchst dann schreib mir einfach 🤓

    danke für das angebot aber bin aktuell nicht an einem projekt interessiert

    Ist alles gut bei dir? Brauchst du Hilfe? So eine vernünftige und normale Antwort..

    Versteck 2 Karotten in deinem Arsch oder blinzel 2 mal wenn du Hilfe brauchst, ich mache mir Sorgen man..


    Zum Beitrag:

    Bitte leg offen wie viel du bereit bist zu zahlen, ich will nicht endlos diskutieren und Pläne hören wenn am Ende etwa 2-8€ die Stunde bei rumkommt wie bei den Meisten hier üblich und akzeptiert. Ich hätte tatsächlich Interesse an einem festbezahlten Teamplatz zur Überbrückung meiner Langeweile aktuell.

    Hey Leute,


    Previews:


    Wenns das Tutorial schon gibt, ignoriert diesen Beitrag einfach und bei Fehlern wie immer: Schreibt's mir, ich korrigiers.

    folgendes kennt man ja vom WorldEditor, wenn man eine spezielle Wassertextur setzt:

    Code
    1. SpecialWaterPath "D:/ymir work/special/lava"
    2. SpecialWaterCount 30


    Diese zwei Variablen werden standartmäßig von YMIR professionell ignoriert. Hier das Tutorial dazu, um ingame spezielle Wassertexturen zu erlauben:


    GameLib/MapOutdoor.h:


    Suchen:

    Code
    1. bool m_bSettingTerrainVisible;


    Darunter einfügen:


    Code
    1. std::string m_SpecialWaterPath = "";
    2. uint8_t m_SpecialWaterCount = 0;


    GameLib/MapOutdoor.cpp:


    Suchen:


    Code
    1. m_bSettingTerrainVisible = false;


    Darunter einfügen:


    Code
    1. m_SpecialWaterPath = "";
    2. m_SpecialWaterCount = 0;


    GameLib/MapOutdoorLoad.cpp:


    Suchen:


    Code
    1. if (stTokenVectorMap.end() != stTokenVectorMap.find("terrainvisible"))
    2. {
    3. m_bSettingTerrainVisible = (bool)(atoi(stTokenVectorMap["terrainvisible"][0].c_str()) != 0);
    4. }
    5. else
    6. {
    7. m_bSettingTerrainVisible = true;
    8. }


    Darunter einfügen:



    GameLib/MapOutdoorLoad.cpp:


    Suchen:



    Ersetzen mit:



    Et voilá.