summaryrefslogtreecommitdiff
path: root/src/being
diff options
context:
space:
mode:
Diffstat (limited to 'src/being')
-rw-r--r--src/being/localplayer.cpp25
-rw-r--r--src/being/localplayer.h4
2 files changed, 27 insertions, 2 deletions
diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp
index 97845ae31..01e4466bf 100644
--- a/src/being/localplayer.cpp
+++ b/src/being/localplayer.cpp
@@ -158,6 +158,7 @@ LocalPlayer::LocalPlayer(const BeingId id,
mTestParticleTime(0),
mTestParticleHash(0L),
mSyncPlayerMoveDistance(config.getBoolValue("syncPlayerMoveDistance")),
+ mUnfreezeTime(0),
mWalkingDir(0),
mUpdateName(true),
mBlockAdvert(false),
@@ -179,7 +180,8 @@ LocalPlayer::LocalPlayer(const BeingId id,
mPathSetByMouse(false),
mWaitPing(false),
mShowNavigePath(false),
- mAllowRename(false)
+ mAllowRename(false),
+ mFreezed(false)
{
logger->log1("LocalPlayer::LocalPlayer");
@@ -251,6 +253,13 @@ void LocalPlayer::logic()
if (mActivityTime == 0 || mLastAction != -1)
mActivityTime = cur_time;
+ if (mUnfreezeTime > 0 &&
+ mUnfreezeTime <= tick_time)
+ {
+ mUnfreezeTime = 0;
+ mFreezed = false;
+ }
+
if ((mAction != BeingAction::MOVE || mNextStep) && !mNavigatePath.empty())
{
mNextStep = false;
@@ -2714,7 +2723,19 @@ void LocalPlayer::playerDeath()
bool LocalPlayer::canMove() const
{
- return mAction != BeingAction::DEAD &&
+ return !mFreezed &&
+ mAction != BeingAction::DEAD &&
(serverFeatures->haveMoveWhileSit() ||
mAction != BeingAction::SIT);
}
+
+void LocalPlayer::freezeMoving(const int timeWaitTicks)
+{
+ if (timeWaitTicks <= 0)
+ return;
+ const int nextTime = tick_time + timeWaitTicks;
+ if (mUnfreezeTime < nextTime)
+ mUnfreezeTime = nextTime;
+ if (mUnfreezeTime > 0)
+ mFreezed = true;
+}
diff --git a/src/being/localplayer.h b/src/being/localplayer.h
index 08974a621..b09e63828 100644
--- a/src/being/localplayer.h
+++ b/src/being/localplayer.h
@@ -423,6 +423,8 @@ class LocalPlayer final : public Being,
bool canMove() const;
+ void freezeMoving(const int timeWaitTicks);
+
protected:
void updateCoords() override final;
@@ -493,6 +495,7 @@ class LocalPlayer final : public Being,
int mTestParticleTime;
unsigned long mTestParticleHash;
int mSyncPlayerMoveDistance;
+ int mUnfreezeTime;
unsigned char mWalkingDir; // The direction the player is walking in.
/** Whether or not the name settings have changed */
bool mUpdateName;
@@ -519,6 +522,7 @@ class LocalPlayer final : public Being,
bool mWaitPing;
bool mShowNavigePath;
bool mAllowRename;
+ bool mFreezed;
};
extern LocalPlayer *localPlayer;