From 0e3549dd92ac1eac1916b3f5110036ab59fe2fec Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 20 Mar 2019 22:14:01 +0300 Subject: Possible fix for desync in moving Handle player stop packet always. Check desync always if tile changed client side. Check desync always if server move response packet received. Removed unused configuration option. --- src/being/being.h | 2 +- src/being/localplayer.cpp | 37 +++++++++++++++++++++++++++++++++++-- src/being/localplayer.h | 3 +++ src/defaults.cpp | 1 - src/net/ea/beinghandler.cpp | 3 +-- src/net/ea/beinghandler.h | 2 +- src/net/ea/beingrecv.cpp | 3 +-- src/net/eathena/beinghandler.cpp | 4 ++-- src/net/eathena/beinghandler.h | 2 +- src/net/eathena/generalhandler.cpp | 2 +- src/net/messagein.cpp | 27 +++++++++++++++------------ src/net/tmwa/beinghandler.cpp | 4 ++-- src/net/tmwa/beinghandler.h | 2 +- src/net/tmwa/generalhandler.cpp | 2 +- 14 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/being/being.h b/src/being/being.h index 553dbcb64..f42cae281 100644 --- a/src/being/being.h +++ b/src/being/being.h @@ -176,7 +176,7 @@ class Being notfinal : public ActorSprite, /** * Sets the tile x and y coord */ - void setTileCoords(const int x, const int y) restrict2; + virtual void setTileCoords(const int x, const int y) restrict2; /** * Puts a "speech balloon" above this being for the specified amount diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp index e5d1ff725..840417803 100644 --- a/src/being/localplayer.cpp +++ b/src/being/localplayer.cpp @@ -480,14 +480,21 @@ void LocalPlayer::nextTile() if (mPath.empty()) { if (mNavigatePath.empty() || mAction != BeingAction::MOVE) + { setAction(BeingAction::STAND, 0); + // +++ probably sync position here always? + } else + { mNextStep = true; + } } else { Being::nextTile(); } + + fixPos(); } bool LocalPlayer::pickUp(FloorItem *const item) @@ -2577,8 +2584,8 @@ void LocalPlayer::fixPos() if ((mCrossX == 0) && (mCrossY == 0)) return; - const int dx = abs(mX - mCrossX); - const int dy = abs(mY - mCrossY); + const int dx = (mX >= mCrossX) ? mX - mCrossX : mCrossX - mX; + const int dy = (mY >= mCrossY) ? mY - mCrossY : mCrossY - mY; const int dist = dx > dy ? dx : dy; const time_t time = cur_time; const int maxDist = mSyncPlayerMove ? mSyncPlayerMoveDistance : 7; @@ -2586,12 +2593,34 @@ void LocalPlayer::fixPos() if (dist > maxDist) { mActivityTime = time; +#ifdef ENABLEDEBUGLOG + logger->dlog(strprintf("Fix position from (%d,%d) to (%d,%d)", + mX, mY, + mCrossX, mCrossY)); +#endif setTileCoords(mCrossX, mCrossY); +/* + if (mNavigateX != 0 || mNavigateY != 0) + { +#ifdef ENABLEDEBUGLOG + logger->dlog(strprintf("Renavigate to (%d,%d)", + mNavigateX, mNavigateY)); +#endif + navigateTo(mNavigateX, mNavigateY); + } +*/ // alternative way to fix, move to real position // setDestination(mCrossX, mCrossY); } } +void LocalPlayer::setTileCoords(const int x, const int y) restrict2 +{ + Being::setTileCoords(x, y); + mCrossX = x; + mCrossY = y; +} + void LocalPlayer::setRealPos(const int x, const int y) { if (mMap == nullptr) @@ -2630,11 +2659,14 @@ void LocalPlayer::setRealPos(const int x, const int y) { mCrossX = x; mCrossY = y; + // +++ possible configuration option + fixPos(); } } if (mMap->isCustom()) mMap->setWalk(x, y); } + void LocalPlayer::fixAttackTarget() { if ((mMap == nullptr) || (mTarget == nullptr)) @@ -2693,6 +2725,7 @@ void LocalPlayer::updateNavigateList() void LocalPlayer::failMove(const int x A_UNUSED, const int y A_UNUSED) { + fixPos(); } void LocalPlayer::waitFor(const std::string &nick) diff --git a/src/being/localplayer.h b/src/being/localplayer.h index d8b3bdf92..9847f7970 100644 --- a/src/being/localplayer.h +++ b/src/being/localplayer.h @@ -277,6 +277,9 @@ class LocalPlayer final : public Being, void fixPos(); + void setTileCoords(const int x, + const int y) restrict2 override final; + /** * Sets the map the being is on */ diff --git a/src/defaults.cpp b/src/defaults.cpp index 7b5190fe2..337d1e89a 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -175,7 +175,6 @@ void setConfigDefaults(Configuration &cfg) AddDEF("screenshotDirectory3", ""); AddDEF("useScreenshotDirectorySuffix", true); AddDEF("screenshotDirectorySuffix", ""); - AddDEF("EnableSync", false); AddDEF("joystickEnabled", false); AddDEF("upTolerance", 100); AddDEF("downTolerance", 100); diff --git a/src/net/ea/beinghandler.cpp b/src/net/ea/beinghandler.cpp index 2870bc85b..511154fd5 100644 --- a/src/net/ea/beinghandler.cpp +++ b/src/net/ea/beinghandler.cpp @@ -29,10 +29,9 @@ namespace Ea { -BeingHandler::BeingHandler(const bool enableSync) : +BeingHandler::BeingHandler() : Net::BeingHandler() { - BeingRecv::mSync = enableSync; BeingRecv::mSpawnId = BeingId_zero; } diff --git a/src/net/ea/beinghandler.h b/src/net/ea/beinghandler.h index a151601bc..8c90dbf01 100644 --- a/src/net/ea/beinghandler.h +++ b/src/net/ea/beinghandler.h @@ -34,7 +34,7 @@ class BeingHandler notfinal : public Net::BeingHandler A_DELETE_COPY(BeingHandler) protected: - explicit BeingHandler(const bool enableSync); + explicit BeingHandler(); }; } // namespace Ea diff --git a/src/net/ea/beingrecv.cpp b/src/net/ea/beingrecv.cpp index 4ac1f90eb..ed6e031b6 100644 --- a/src/net/ea/beingrecv.cpp +++ b/src/net/ea/beingrecv.cpp @@ -54,7 +54,6 @@ namespace Ea namespace BeingRecv { - bool mSync = false; BeingId mSpawnId = BeingId_zero; } // namespace BeingRecv @@ -345,7 +344,7 @@ void BeingRecv::processPlayerStop(Net::MessageIn &msg) const BeingId id = msg.readBeingId("account id"); - if (mSync || id != localPlayer->getId()) +// if (mSync || id != localPlayer->getId()) { Being *const dstBeing = actorManager->findBeing(id); if (dstBeing != nullptr) diff --git a/src/net/eathena/beinghandler.cpp b/src/net/eathena/beinghandler.cpp index 7e8dc43e2..c132609e3 100644 --- a/src/net/eathena/beinghandler.cpp +++ b/src/net/eathena/beinghandler.cpp @@ -34,8 +34,8 @@ extern int serverVersion; namespace EAthena { -BeingHandler::BeingHandler(const bool enableSync) : - Ea::BeingHandler(enableSync) +BeingHandler::BeingHandler() : + Ea::BeingHandler() { beingHandler = this; } diff --git a/src/net/eathena/beinghandler.h b/src/net/eathena/beinghandler.h index 6372ea336..41dafb6aa 100644 --- a/src/net/eathena/beinghandler.h +++ b/src/net/eathena/beinghandler.h @@ -31,7 +31,7 @@ namespace EAthena class BeingHandler final : public Ea::BeingHandler { public: - explicit BeingHandler(const bool enableSync); + explicit BeingHandler(); A_DELETE_COPY(BeingHandler) diff --git a/src/net/eathena/generalhandler.cpp b/src/net/eathena/generalhandler.cpp index ff420092d..1226e03f9 100644 --- a/src/net/eathena/generalhandler.cpp +++ b/src/net/eathena/generalhandler.cpp @@ -83,7 +83,7 @@ namespace EAthena GeneralHandler::GeneralHandler() : mAdminHandler(new AdminHandler), - mBeingHandler(new BeingHandler(config.getBoolValue("EnableSync"))), + mBeingHandler(new BeingHandler), mBuySellHandler(new BuySellHandler), mCharServerHandler(new CharServerHandler), mChatHandler(new ChatHandler), diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index bdac098c5..22d0510ce 100644 --- a/src/net/messagein.cpp +++ b/src/net/messagein.cpp @@ -473,20 +473,23 @@ unsigned char *MessageIn::readBytes(int length, const char *const dstr) mPos += length; #ifdef ENABLEDEBUGLOG - std::string str; - for (int f = 0; f < length; f ++) - str.append(strprintf("%02x", CAST_U32(buf[f]))); - str += " "; - for (int f = 0; f < length; f ++) + if (!mIgnore) { - if (buf[f] != 0U) - str.append(strprintf("%c", buf[f])); - else - str.append("_"); + std::string str; + for (int f = 0; f < length; f ++) + str.append(strprintf("%02x", CAST_U32(buf[f]))); + str += " "; + for (int f = 0; f < length; f ++) + { + if (buf[f] != 0U) + str.append(strprintf("%c", buf[f])); + else + str.append("_"); + } + if (dstr != nullptr) + logger->dlog(dstr); + logger->dlog("ReadBytes: " + str); } - if (dstr != nullptr) - logger->dlog(dstr); - logger->dlog("ReadBytes: " + str); #endif // ENABLEDEBUGLOG PacketCounters::incInBytes(length); diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index e944fa835..f3d3acdf8 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -31,8 +31,8 @@ namespace TmwAthena { -BeingHandler::BeingHandler(const bool enableSync) : - Ea::BeingHandler(enableSync) +BeingHandler::BeingHandler() : + Ea::BeingHandler() { beingHandler = this; } diff --git a/src/net/tmwa/beinghandler.h b/src/net/tmwa/beinghandler.h index ed486c9ee..32e01db1f 100644 --- a/src/net/tmwa/beinghandler.h +++ b/src/net/tmwa/beinghandler.h @@ -31,7 +31,7 @@ namespace TmwAthena class BeingHandler final : public Ea::BeingHandler { public: - explicit BeingHandler(const bool enableSync); + explicit BeingHandler(); A_DELETE_COPY(BeingHandler) diff --git a/src/net/tmwa/generalhandler.cpp b/src/net/tmwa/generalhandler.cpp index 994be2ce7..7e5eb70de 100644 --- a/src/net/tmwa/generalhandler.cpp +++ b/src/net/tmwa/generalhandler.cpp @@ -82,7 +82,7 @@ namespace TmwAthena GeneralHandler::GeneralHandler() : mAdminHandler(new AdminHandler), - mBeingHandler(new BeingHandler(config.getBoolValue("EnableSync"))), + mBeingHandler(new BeingHandler), mBuySellHandler(new BuySellHandler), mCharServerHandler(new CharServerHandler), mChatHandler(new ChatHandler), -- cgit v1.2.3-60-g2f50