summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLogicParrot <LogicParrot@users.noreply.github.com>2016-03-24 18:13:23 +0100
committerLogicParrot <LogicParrot@users.noreply.github.com>2016-03-29 14:50:29 +0200
commit8b184e80830380f1c9425ee8383596e2726bccb0 (patch)
treedf536e502f68bcee9b31ed8fe760143e26075efe
parentMerge pull request #3096 from mathias-github/icons (diff)
downloadcuberite-8b184e80830380f1c9425ee8383596e2726bccb0.tar
cuberite-8b184e80830380f1c9425ee8383596e2726bccb0.tar.gz
cuberite-8b184e80830380f1c9425ee8383596e2726bccb0.tar.bz2
cuberite-8b184e80830380f1c9425ee8383596e2726bccb0.tar.lz
cuberite-8b184e80830380f1c9425ee8383596e2726bccb0.tar.xz
cuberite-8b184e80830380f1c9425ee8383596e2726bccb0.tar.zst
cuberite-8b184e80830380f1c9425ee8383596e2726bccb0.zip
-rw-r--r--Server/Plugins/APIDump/APIDesc.lua2
-rw-r--r--src/Entities/Player.cpp40
-rw-r--r--src/Entities/Player.h11
3 files changed, 48 insertions, 5 deletions
diff --git a/Server/Plugins/APIDump/APIDesc.lua b/Server/Plugins/APIDump/APIDesc.lua
index d18cdb81b..b1bbe6eb1 100644
--- a/Server/Plugins/APIDump/APIDesc.lua
+++ b/Server/Plugins/APIDump/APIDesc.lua
@@ -1998,7 +1998,7 @@ a_Player:OpenWindow(Window);
SendAboveActionBarMessage = { Params = "Message", Return = "", Notes = "Sends the specified message to the player (shows above action bar, doesn't show for < 1.8 clients)." },
SendSystemMessage = { Params = "Message", Return = "", Notes = "Sends the specified message to the player (doesn't show for < 1.8 clients)." },
SendRotation = { Params = "YawDegrees, PitchDegrees", Return = "", Notes = "Sends the specified rotation to the player, forcing them to look that way" },
- SetBedPos = { Params = "{{Vector3i|Position}}", Return = "", Notes = "Sets the internal representation of the last bed position the player has slept in. The player will respawn at this position if they die." },
+ SetBedPos = { Params = "{{Vector3i|Position}}, [{{cWorld*|World}}]", Return = "", Notes = "Sets the position and world of the player's respawn point, which is also known as the bed position. The player will respawn at this position and world upon death. If the world is not specified, it is set to the player's current world." },
SetCanFly = { Params = "CanFly", Notes = "Sets if the player can fly or not." },
SetCrouch = { Params = "IsCrouched", Return = "", Notes = "Sets the crouch state, broadcasts the change to other players." },
SetCurrentExperience = { Params = "XPAmount", Return = "", Notes = "Sets the current amount of experience (and indirectly, the XP level)." },
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 9d18cedc4..c94cec3c9 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -828,6 +828,27 @@ void cPlayer::SetCustomName(const AString & a_CustomName)
+void cPlayer::SetBedPos(const Vector3i & a_Pos)
+{
+ m_LastBedPos = a_Pos;
+ m_SpawnWorld = m_World;
+}
+
+
+
+
+
+void cPlayer::SetBedPos(const Vector3i & a_Pos, cWorld * a_World)
+{
+ m_LastBedPos = a_Pos;
+ ASSERT(a_World != nullptr);
+ m_SpawnWorld = a_World;
+}
+
+
+
+
+
void cPlayer::SetFlying(bool a_IsFlying)
{
if (a_IsFlying == m_IsFlying)
@@ -1078,12 +1099,19 @@ void cPlayer::Respawn(void)
m_LifetimeTotalXp = 0;
// ToDo: send score to client? How?
- m_ClientHandle->SendRespawn(GetWorld()->GetDimension(), true);
+ m_ClientHandle->SendRespawn(m_SpawnWorld->GetDimension(), true);
// Extinguish the fire:
StopBurning();
- TeleportToCoords(GetLastBedPos().x, GetLastBedPos().y, GetLastBedPos().z);
+ if (GetWorld() != m_SpawnWorld)
+ {
+ MoveToWorld(m_SpawnWorld, false, GetLastBedPos());
+ }
+ else
+ {
+ TeleportToCoords(GetLastBedPos().x, GetLastBedPos().y, GetLastBedPos().z);
+ }
SetVisible(true);
}
@@ -1895,9 +1923,16 @@ bool cPlayer::LoadFromFile(const AString & a_FileName, cWorldPtr & a_World)
a_World = cRoot::Get()->GetDefaultWorld();
}
+
m_LastBedPos.x = root.get("SpawnX", a_World->GetSpawnX()).asInt();
m_LastBedPos.y = root.get("SpawnY", a_World->GetSpawnY()).asInt();
m_LastBedPos.z = root.get("SpawnZ", a_World->GetSpawnZ()).asInt();
+ AString SpawnWorldName = root.get("SpawnWorld", cRoot::Get()->GetDefaultWorld()->GetName()).asString();
+ m_SpawnWorld = cRoot::Get()->GetWorld(SpawnWorldName);
+ if (m_SpawnWorld == nullptr)
+ {
+ m_SpawnWorld = cRoot::Get()->GetDefaultWorld();
+ }
// Load the player stats.
// We use the default world name (like bukkit) because stats are shared between dimensions / worlds.
@@ -1955,6 +1990,7 @@ bool cPlayer::SaveToDisk()
root["SpawnX"] = GetLastBedPos().x;
root["SpawnY"] = GetLastBedPos().y;
root["SpawnZ"] = GetLastBedPos().z;
+ root["SpawnWorld"] = m_SpawnWorld->GetName();
if (m_World != nullptr)
{
diff --git a/src/Entities/Player.h b/src/Entities/Player.h
index 6d092eeb3..fae0e6177 100644
--- a/src/Entities/Player.h
+++ b/src/Entities/Player.h
@@ -459,8 +459,12 @@ public:
*/
Vector3i GetLastBedPos(void) const { return m_LastBedPos; }
- /** Sets the player's bed (home) position */
- void SetBedPos(const Vector3i & a_Pos) { m_LastBedPos = a_Pos; }
+ /** Sets the player's bed (home / respawn) position to the specified position.
+ Sets the respawn world to the player's world. */
+ void SetBedPos(const Vector3i & a_Pos);
+
+ /** Sets the player's bed (home / respawn) position and respawn world to the specified parameters. */
+ void SetBedPos(const Vector3i & a_Pos, cWorld * a_World);
// tolua_end
@@ -584,6 +588,9 @@ protected:
/** The player's last saved bed position */
Vector3i m_LastBedPos;
+ /** The world which the player respawns in upon death */
+ cWorld * m_SpawnWorld;
+
eGameMode m_GameMode;
AString m_IP;