Wie funktioniert der Drophack?
Die Erklärung ist relativ simpel. Wenn man einen Gegenstand aufhebt, überprüft der Client, wann du das letzte Mal einen Gegenstand aufgehoben hast (der kleine Delay, der verhindert, dass man zig Items nacheinander in kurzer Zeit aufheben kann). Danach wird überprüft, ob das Item dem Spieler gehört. Mit der Überprüfung ist in so weit auch alles okay. Sie verhindert, dass selbst wenn man in Gruppen ist, das Item nicht aufheben kann. Danach erst wird der Pickup-Befehl an den Server gesendet.
Was tut nun der Server? Der Server reagiert daraufhin mit einer Überprüfung, ob das Item dem Spieler gehört - tut es nicht, geht der Server automatisch davon aus, dass der Spieler in einer Gruppe ist und das Item einem aus der Gruppe gehört. Warum? YMIR hat dort ehrlich gesagt etwas verpatzt, denn der Server verlässt sich in dem Moment darauf, dass die Überprüfung im Clienten sauber war. Schafft man es aber, die Überprüfung komplett abzuschalten, so sendet der Client den Pickup-Befehl obwohl das Item der Gruppe gar nicht gehört! Der Server hingegen geht davon aus, dass es einem aus der Gruppe gehört und sucht diesen Spieler. Findet er ihn nicht, geht er davon aus, dass es dem Spieler gehört und gibt ihm das Item. Folglich: Der Drophack funktioniert.
Was kann man nun tun?
Die Lösung befindet sich in der char_item.cpp
Dort wird das Aufheben von Items umgesetzt. Scrollen wir dazu einfach einmal weiter runter, bis wir bei
Code:
namespace NPartyPickupDistribute
Code:
namespace NPartyPickupPermission { struct FCompareOwnership { LPITEM item; bool is_allowed = false; FCompareOwnership(LPITEM item) : item(item) { } void operator () (LPCHARACTER ch) { if (item->IsOwnership(ch) == true) is_allowed = true; } }; }
Code:
bool is_allowed = false; NPartyPickupPermission::FCompareOwnership funcCompareOwnership(item); GetParty()->ForEachOnlineMember(funcCompareOwnership); is_allowed = funcCompareOwnership.is_allowed; if(is_allowed == false) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This item is not yours!")); return false; }
Letztendlich findet dann die Überprüfung statt, ob is_allowed jetzt wahr (also jemand wurde gefunden, dem das Item gehört) oder falsch (keinem Gruppenmitglied gehört das Item) ist. Bei Falsch wird diesmal eine Chatnachricht ausgegeben und die Prozedur abgebrochen.
Das ist auch schon alles. Mit dieser Änderung habt ihr den Drophack behoben. Was ich mir davon wünsche ist lediglich, dass es mehr Server gibt, die sich einmal an den Source setzen und solche Dinge schaffen. Man kann so viel aus dem Quellcode nehmen, Dinge, die einfach schönere Spiele schaffen. Man muss nur den Mut haben, sich mal hinzusetzen und diese Dinge zu tun. Heraus kommt so etwas. Server, die solche "Hacks" behoben haben. Server, die sich mit den Bugs vom Spiel auseinandersetzen und diese beheben. Ich mache meine Arbeit für euch und ich erwarte nichts, weder Thanks noch sonst irgendetwas (mit denen kann ich ohnehin nichts anfangen^^). Ich erhoffe mir nur, dass die Community daraus Nutzen ziehen kann. Oder zumindest einige.
Vanilla,
a developer doing her job.