summaryrefslogtreecommitdiff
path: root/src/being/localplayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/being/localplayer.cpp')
-rw-r--r--src/being/localplayer.cpp140
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;