diff options
Diffstat (limited to 'src/being/localplayer.cpp')
-rw-r--r-- | src/being/localplayer.cpp | 140 |
1 files changed, 59 insertions, 81 deletions
diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp index 8f0f7a4cd..e4285d991 100644 --- a/src/being/localplayer.cpp +++ b/src/being/localplayer.cpp @@ -1,11 +1,11 @@ /* - * The ManaPlus Client + * The ManaVerse Client * Copyright (C) 2004-2009 The Mana World Development Team * Copyright (C) 2009-2010 The Mana Developers * Copyright (C) 2011-2020 The ManaPlus Developers - * Copyright (C) 2020-2023 The ManaVerse Developers + * Copyright (C) 2020-2025 The ManaVerse Developers * - * This file is part of The ManaPlus Client. + * This file is part of The ManaVerse Client. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -137,8 +137,7 @@ LocalPlayer::LocalPlayer(const BeingId id, mPingTime(0), mAfkTime(0), mActivityTime(0), - mNavigateX(0), - mNavigateY(0), + mNavigateDest(0, 0), mNavigateId(BeingId_zero), mCrossX(0), mCrossY(0), @@ -178,7 +177,7 @@ LocalPlayer::LocalPlayer(const BeingId id, mKeepAttacking(false), mPathSetByMouse(false), mWaitPing(false), - mShowNavigePath(false), + mShowNavigatePath(false), mAllowRename(false), mFreezed(false) { @@ -282,7 +281,7 @@ void LocalPlayer::logic() if (!mSyncPlayerMove) dist = 20; - if (((mNavigateX != 0) || (mNavigateY != 0)) && + if (((mNavigateDest.x != 0) || (mNavigateDest.y != 0)) && ((mCrossX + dist >= mX && mCrossX <= mX + dist && mCrossY + dist >= mY && mCrossY <= mY + dist) || ((mCrossX == 0) && (mCrossY == 0)))) @@ -300,10 +299,10 @@ void LocalPlayer::logic() { if (mMessageTime == 0) { - const MessagePair info = mMessages.front(); - if ((particleEngine != nullptr) && (gui != nullptr)) { + const MessagePair& info = mMessages.front(); + particleEngine->addTextRiseFadeOutEffect( info.first, mPixelX, @@ -329,14 +328,15 @@ void LocalPlayer::logic() else { // Find whether target is in range - const int rangeX = CAST_S32( - abs(mTarget->mX - mX)); - const int rangeY = CAST_S32( - abs(mTarget->mY - mY)); + const int dx = abs(mTarget->mX - mX); + const int dy = abs(mTarget->mY - mY); const int attackRange = getAttackRange(); - const TargetCursorTypeT targetType - = rangeX > attackRange || rangeY > attackRange - ? TargetCursorType::NORMAL : TargetCursorType::IN_RANGE; + const bool inRange = (dx <= attackRange + && dy <= attackRange); + const TargetCursorTypeT targetType = + inRange ? TargetCursorType::IN_RANGE + : TargetCursorType::NORMAL; + mTarget->setTargetType(targetType); if (!mTarget->isAlive() && (!mTargetDeadPlayers @@ -516,13 +516,11 @@ bool LocalPlayer::pickUp(FloorItem *const item) const int dx = item->getTileX() - mX; const int dy = item->getTileY() - mY; - int dist = 6; + const int maxTileDist = 1*1 + 1*1; // item in 3x3 area around player const unsigned int pickUpType = settings.pickUpType; - if (pickUpType >= 4 && pickUpType <= 6) - dist = 4; - if (dx * dx + dy * dy < dist) + if (dx*dx + dy*dy <= maxTileDist) { if ((actorManager != nullptr) && actorManager->checkForPickup(item)) { @@ -549,13 +547,13 @@ bool LocalPlayer::pickUp(FloorItem *const item) break; case 1:// should never happen due to above check for adjecent-tile // pickup, but you never know. - navigateTo(item->getTileX(), item->getTileY()); + navigateTo({item->getTileX(), item->getTileY()}); break; default: { // at least two spots, move nearby. const Position& nearby = *(++debugPath.rbegin()); - navigateTo(nearby.x, nearby.y); + navigateTo(nearby); break; } } @@ -830,8 +828,8 @@ void LocalPlayer::attack(Being *const target, return; } -#ifdef TMWA_SUPPORT - if (Net::getNetworkType() == ServerType::TMWATHENA) + if ((mServerAttack == Keep_false) || + (Net::getNetworkType() == ServerType::TMWATHENA)) { const int dist_x = target->mX - mX; const int dist_y = target->mY - mY; @@ -851,12 +849,11 @@ void LocalPlayer::attack(Being *const target, setDirection(BeingDirection::LEFT); } } -#endif // TMWA_SUPPORT mActionTime = tick_time; if (target->getType() != ActorType::Player - || checAttackPermissions(target)) + || checkAttackPermissions(target)) { setAction(BeingAction::ATTACK, 0); @@ -1059,8 +1056,7 @@ void LocalPlayer::setGotoTarget(Being *const target) mPickUpTarget = nullptr; setTarget(target); mGoingToTarget = true; - navigateTo(target->mX, - target->mY); + navigateTo({target->mX, target->mY}); } void LocalPlayer::handleStatusEffect(const StatusEffect *const effect, @@ -1371,12 +1367,12 @@ void LocalPlayer::moveToTarget(int dist) ServerType::TMWATHENA); switch (dist) { - case 10: + case 11: // archer dist = mAttackRange; if (dist == 1 && broken) dist = 2; break; - case 11: + case 12: // range-1 dist = mAttackRange - 1; if (dist < 1) dist = 1; @@ -1408,7 +1404,7 @@ void LocalPlayer::moveToTarget(int dist) limit = CAST_S32(sz) - dist; gotPos = true; } - else if ((mNavigateX != 0) || (mNavigateY != 0)) + else if ((mNavigateDest.x != 0) || (mNavigateDest.y != 0)) { debugPath = mNavigatePath; limit = dist; @@ -1420,7 +1416,7 @@ void LocalPlayer::moveToTarget(int dist) if (dist == 0) { if (mTarget != nullptr) - navigateTo(mTarget->mX, mTarget->mY); + navigateTo({mTarget->mX, mTarget->mY}); } else { @@ -1433,12 +1429,12 @@ void LocalPlayer::moveToTarget(int dist) { pos = (*i); } - navigateTo(pos.x, pos.y); + navigateTo(pos); } } else if ((mLastTargetX != 0) || (mLastTargetY != 0)) { - navigateTo(mLastTargetX, mLastTargetY); + navigateTo({mLastTargetX, mLastTargetY}); } } @@ -1466,7 +1462,7 @@ void LocalPlayer::moveToHome() } else { - navigateTo(CAST_S32(pos.x), CAST_S32(pos.y)); + navigateTo({CAST_S32(pos.x), CAST_S32(pos.y)}); } } } @@ -1672,39 +1668,18 @@ bool LocalPlayer::pickUpItems(int pickUpType) break; case 4: - if (!actorManager->pickUpAll(x - 1, y - 1, x + 1, y + 1, false)) - { - if (actorManager->pickUpNearest(x, y, 4)) - status = true; - } - else - { + if (actorManager->pickUpNearest(x, y, 4)) status = true; - } break; case 5: - if (!actorManager->pickUpAll(x - 1, y - 1, x + 1, y + 1, false)) - { - if (actorManager->pickUpNearest(x, y, 8)) - status = true; - } - else - { + if (actorManager->pickUpNearest(x, y, 8)) status = true; - } break; case 6: - if (!actorManager->pickUpAll(x - 1, y - 1, x + 1, y + 1, false)) - { - if (actorManager->pickUpNearest(x, y, 90)) - status = true; - } - else - { + if (actorManager->pickUpNearest(x, y, 90)) status = true; - } break; default: @@ -1731,8 +1706,11 @@ void LocalPlayer::moveByDirection(const unsigned char dir) void LocalPlayer::specialMove(const unsigned char direction) { - if ((direction != 0U) && ((mNavigateX != 0) || (mNavigateY != 0))) + if ((direction != 0U) + && ((mNavigateDest.x != 0) || (mNavigateDest.y != 0))) + { navigateClean(); + } if ((direction != 0U) && (settings.moveType >= 2 && settings.moveType <= 4)) @@ -2134,7 +2112,8 @@ void LocalPlayer::afkRespond(ChatTab *const tab, const std::string &nick) } } -bool LocalPlayer::navigateTo(const int x, const int y) + +bool LocalPlayer::navigateTo(const Position& to) { if (mMap == nullptr) return false; @@ -2143,20 +2122,19 @@ bool LocalPlayer::navigateTo(const int x, const int y) if (tmpLayer == nullptr) return false; - mShowNavigePath = true; + mShowNavigatePath = true; mOldX = mPixelX; mOldY = mPixelY; mOldTileX = mX; mOldTileY = mY; - mNavigateX = x; - mNavigateY = y; + mNavigateDest = to; mNavigateId = BeingId_zero; mNavigatePath = mMap->findPath( (mPixelX - mapTileSize / 2) / mapTileSize, (mPixelY - mapTileSize) / mapTileSize, - x, - y, + to.x, + to.y, getBlockWalkMask(), 0); @@ -2165,18 +2143,18 @@ bool LocalPlayer::navigateTo(const int x, const int y) return !mNavigatePath.empty(); } + void LocalPlayer::navigateClean() { if (mMap == nullptr) return; - mShowNavigePath = false; + mShowNavigatePath = false; mOldX = 0; mOldY = 0; mOldTileX = 0; mOldTileY = 0; - mNavigateX = 0; - mNavigateY = 0; + mNavigateDest = {0, 0}; mNavigateId = BeingId_zero; mNavigatePath.clear(); @@ -2244,11 +2222,10 @@ void LocalPlayer::updateCoords() navigateClean(); return; } - mNavigateX = being->mX; - mNavigateY = being->mY; + mNavigateDest = {being->mX, being->mY}; } - if (mNavigateX == x && mNavigateY == y) + if (mNavigateDest.x == x && mNavigateDest.y == y) { navigateClean(); return; @@ -2265,7 +2242,7 @@ void LocalPlayer::updateCoords() break; } } - if (mDrawPath && mShowNavigePath) + if (mDrawPath && mShowNavigatePath) { tmpLayer->clean(); tmpLayer->addRoad(mNavigatePath); @@ -2550,7 +2527,7 @@ void LocalPlayer::followMoveTo(const Being *const being, being->mName == mPlayerFollowed) { mPickUpTarget = nullptr; - navigateTo(x, y); + navigateTo({x, y}); } } @@ -2568,20 +2545,20 @@ void LocalPlayer::followMoveTo(const Being *const being, switch (settings.followMode) { case 0: - navigateTo(x1, y1); + navigateTo({x1, y1}); setNextDest(x2, y2); break; case 1: if (x1 != x2 || y1 != y2) { - navigateTo(mX + x2 - x1, mY + y2 - y1); + navigateTo({mX + x2 - x1, mY + y2 - y1}); setNextDest(mX + x2 - x1, mY + y2 - y1); } break; case 2: if (x1 != x2 || y1 != y2) { - navigateTo(mX + x1 - x2, mY + y1 - y2); + navigateTo({mX + x1 - x2, mY + y1 - y2}); setNextDest(mX + x1 - x2, mY + y1 - y2); } break; @@ -2659,13 +2636,13 @@ void LocalPlayer::fixPos() #endif setTileCoords(mCrossX, mCrossY); /* - if (mNavigateX != 0 || mNavigateY != 0) + if (mNavigateDest.x != 0 || mNavigateDest.y != 0) { #ifdef ENABLEDEBUGLOG logger->dlog(strprintf("Renavigate to (%d,%d)", - mNavigateX, mNavigateY)); + mNavigateDest.x, mNavigateDest.y)); #endif - navigateTo(mNavigateX, mNavigateY); + navigateTo({mNavigateDest.x, mNavigateDest.y}); } */ // alternative way to fix, move to real position @@ -2731,6 +2708,7 @@ void LocalPlayer::fixAttackTarget() if ((mMap == nullptr) || (mTarget == nullptr)) return; + // 11 == archer if (settings.moveToTargetType == 11 || (settings.attackType == 0U) || !config.getBoolValue("autofixPos")) { @@ -2857,7 +2835,7 @@ void LocalPlayer::stopAdvert() mBlockAdvert = true; } -bool LocalPlayer::checAttackPermissions(const Being *const target) +bool LocalPlayer::checkAttackPermissions(const Being *const target) { if (target == nullptr) return false; |