Mach das Paketlimit raus in der Client-Source.
Beiträge von Lead0b110010100
-
-
Dankeschön, ich werde es mal testen wenn ich Zeit habe! Oder jemand anderes kann es gerne vorher testen und uns sagen obs geklappt hat!
@Lead, ich habe dein Fix in den Startpost geschrieben, hoffe das ist in ordnung!
Du hast zwar erklärt was Schuld an der ganzen Sache ist, frage mich jedoch wie es trotzdem mit Toolset v141 problemlos mit DWORD etc klappt?
Mfg
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:
CodeFolgende Funktionsdefinitionen suchen und ersetzen:
Hier meine Funktionen für die PythonItem.cpp, einfach bei euch anpassen wie ihr es braucht. Ihr könnts eig. ersetzen denke ich.
Code- bool CPythonItem::GetCloseMoney(const TPixelPosition &c_rPixelPosition, DWORD*pdwItemID, DWORD dwDistance)
- {
- DWORD dwCloseItemID = 0;
- DWORD dwCloseItemDistance = dwDistance * dwDistance;
- TGroundItemInstanceMap::iterator i;
- for (i = m_GroundItemInstanceMap.begin(); i != m_GroundItemInstanceMap.end(); ++i)
- {
- TGroundItemInstance *pInstance = i->second;
- if (pInstance->dwVirtualNumber != VNUM_MONEY)
- continue;
- DWORD dwxDistance = DISTANCE_APPROX(c_rPixelPosition.x, pInstance->v3EndPosition.x);
- DWORD dwyDistance = DISTANCE_APPROX(c_rPixelPosition.y, pInstance->v3EndPosition.y);
- DWORD dwDistance = DWORD(dwxDistance * dwxDistance + dwyDistance * dwyDistance);
- if (dwDistance < dwCloseItemDistance)
- {
- dwCloseItemID = i->first;
- dwCloseItemDistance = dwDistance;
- }
- }
- if (dwCloseItemDistance > dwDistance * dwDistance)
- return false;
- *pdwItemID = dwCloseItemID;
- return false;
- }
- bool CPythonItem::GetCloseItem(const TPixelPosition &c_rPixelPosition, DWORD*pdwItemID, DWORD dwDistance)
- {
- DWORD dwCloseItemID = 0;
- DWORD dwCloseItemDistance = dwDistance * dwDistance;
- TGroundItemInstanceMap::iterator i;
- for (i = m_GroundItemInstanceMap.begin(); i != m_GroundItemInstanceMap.end(); ++i)
- {
- TGroundItemInstance *pInstance = i->second;
- DWORD dwxDistance = DISTANCE_APPROX(c_rPixelPosition.x, pInstance->v3EndPosition.x);
- DWORD dwyDistance = DISTANCE_APPROX(c_rPixelPosition.y, pInstance->v3EndPosition.y);
- DWORD dwDistance = DWORD(dwxDistance * dwxDistance + dwyDistance * dwyDistance);
- if (dwDistance < dwCloseItemDistance)
- {
- dwCloseItemID = i->first;
- dwCloseItemDistance = dwDistance;
- }
- }
- if (dwCloseItemDistance > dwDistance * dwDistance)
- return false;
- *pdwItemID = dwCloseItemID;
- return true;
- }
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.
Code- bool CItem::DistanceValid(LPCHARACTER ch)
- {
- if (!GetSectree())
- return false;
- int iDist = DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY());
- WORD max_distance = ch->IsRiding() ? 500 : 300;
- WORD tolerance = 150;
- if (iDist > max_distance + tolerance)
- {
- if (test_server)
- ch->ChatPacket(CHAT_TYPE_INFO, "%d: Distance is not valid: %d > %d", GetID(), iDist, max_distance + tolerance);
- return false;
- }
- return true;
- }
-
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.
-
Passwort als shaXXX mit salt und pepper + PIN = töfte
Pin als salt, bingo
Ein + steht für 'UND' demnach ist nicht der Salt mit PIN (könnte aber auch) sondern:
Wir haben einen Hash UND einen PIN.
-
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
-
Hatte mich schon gefragt, wann der Service endlich kommt.
War ja nur eine Frage der Zeit, wünsche dir viel Erfolg!
Das dus drauf hast weißt du ja schon, siehe FAQ.
-
-
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:
ersetzen mit:
Erklärung: Nun werden nur Monster ODER Steine gepurged nichts weiter. Keine Reittiere, keine Portale, keine special npc's.
-
cmd_emotion.cpp
Suchen
und darunter einfügen:
-
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
folgendes einfügen:
Und unter
das Selbe einfügen:
config.cpp
Unter ifdefs einfügen:
Bei den Tokens in "static bool __LoadGeneralConfigFile(const char *configName)" - Funktion einfügen:
config.h
Unter ifdefs einfügen:
-
Welches Tutorial hast du denn befolgt?
-
Is he inactive at the moment?
Didn't got any replies since 26th august.
-
Schreib mir mal auf Discord:
Lead0b110010100#4415
Let's see ob sich da was entwickelt.
-
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
-
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:
Bitte melden Sie sich an, um dieses Bild zu sehen.
Bitte melden Sie sich an, um dieses Bild zu sehen.
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:
Diese zwei Variablen werden standartmäßig von YMIR professionell ignoriert. Hier das Tutorial dazu, um ingame spezielle Wassertexturen zu erlauben:
GameLib/MapOutdoor.h:
Suchen:
Darunter einfügen:
GameLib/MapOutdoor.cpp:
Suchen:
Darunter einfügen:
GameLib/MapOutdoorLoad.cpp:
Suchen:
Darunter einfügen:
Code- if (stTokenVectorMap.end() != stTokenVectorMap.find("specialwaterpath"))
- {
- m_SpecialWaterPath = stTokenVectorMap["specialwaterpath"][0];
- }
- else
- {
- m_SpecialWaterPath = "d:/ymir work/special/water";
- }
- if (stTokenVectorMap.end() != stTokenVectorMap.find("specialwatercount"))
- {
- m_SpecialWaterCount = atoi(stTokenVectorMap["specialwatercount"][0].c_str());
- }
- else
- {
- m_SpecialWaterCount = 30;
- }
GameLib/MapOutdoorLoad.cpp:
Suchen:
Code- void CMapOutdoor::LoadWaterTexture()
- {
- UnloadWaterTexture();
- char buf[256];
- for (int i = 0; i < 30; ++i)
- {
- sprintf(buf, "d:/ymir Work/special/water/%02d.dds", i + 1);
- m_WaterInstances[i].SetImagePointer((CGraphicImage *)CResourceManager::Instance().GetResourcePointer(buf));
- }
- }
- void CMapOutdoor::UnloadWaterTexture()
- {
- for (int i = 0; i < 30; ++i)
- m_WaterInstances[i].Destroy();
- }
Ersetzen mit:
Code- void CMapOutdoor::LoadWaterTexture()
- {
- UnloadWaterTexture();
- char buf[256];
- for (int i = 0; i < m_SpecialWaterCount; ++i)
- {
- sprintf(buf, "%s/%02d.dds", m_SpecialWaterPath.c_str(), i + 1);
- m_WaterInstances[i].SetImagePointer((CGraphicImage *)CResourceManager::Instance().GetResourcePointer(buf));
- }
- }
- void CMapOutdoor::UnloadWaterTexture()
- {
- for (int i = 0; i < m_SpecialWaterCount; ++i)
- m_WaterInstances[i].Destroy();
- }
Et voilá.