Hallo,
Wie macht sich der Bug den bemerbar?
Wenn einzelnde Gegenstände um einen herum liegen mag alles noch relativ gut funktionieren, werden es aber mehr Items und Yang nähe des Charakters so merkt man das man manchmal nichts mehr aufheben kann. Wenn man um den gesamten Drop herumläuft und öfters ^ oder Y drückt kann es sein das er manchmal Items aufhebt und manchmal nicht. Selten passiert es auch das man trotz mehrerer Drops aufheben kann, aber dann nimmt er nicht das was am nähesten ist zuerst sondern sehr willkürlich.
Ein großen Dank an Lead der sich um dieses Problem gekümmert hat und nun wie es scheint einen vollständigen Fix dafür geschrieben hat!
Alles anzeigenSo, hier der Fix:
In PythonItem.h über der Klasse einfügen:
Alles anzeigenC: PythonItem.h
Hier meine Funktionen für die PythonItem.cpp, einfach bei euch anpassen wie ihr es braucht. Ihr könnts eig. ersetzen denke ich.
Alles anzeigenC: PythonItem.cpp
- bool CPythonItem::GetCloseMoney(const TPixelPosition &c_rPixelPosition, uint32_t*pdwItemID, uint32_t dwDistance)
- {
- uint32_t dwCloseItemID = 0;
- uint32_t 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;
- uint32_t dwxDistance = DISTANCE_APPROX(c_rPixelPosition.x, pInstance->v3EndPosition.x);
- uint32_t dwyDistance = DISTANCE_APPROX(c_rPixelPosition.y, pInstance->v3EndPosition.y);
- uint32_t dwDistance = uint32_t(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, uint32_t*pdwItemID, uint32_t dwDistance)
- {
- uint32_t dwCloseItemID = 0;
- uint32_t dwCloseItemDistance = dwDistance * dwDistance;
- TGroundItemInstanceMap::iterator i;
- for (i = m_GroundItemInstanceMap.begin(); i != m_GroundItemInstanceMap.end(); ++i)
- {
- TGroundItemInstance *pInstance = i->second;
- uint32_t dwxDistance = DISTANCE_APPROX(c_rPixelPosition.x, pInstance->v3EndPosition.x);
- uint32_t dwyDistance = DISTANCE_APPROX(c_rPixelPosition.y, pInstance->v3EndPosition.y);
- uint32_t dwDistance = uint32_t(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.
Alles anzeigenC
- bool CItem::DistanceValid(LPCHARACTER ch)
- {
- if (!GetSectree())
- return false;
- int32_t iDist = DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY());
- uint16_t max_distance = ch->IsRiding() ? 500 : 300;
- uint16_t 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;
- }
Mit freundlichen Grüßen!