summaryrefslogtreecommitdiffstats
path: root/src/Entities
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@hotmail.co.uk>2014-07-22 18:26:48 +0200
committerTiger Wang <ziwei.tiger@hotmail.co.uk>2014-07-22 18:26:48 +0200
commita28b0dc1201dca7c34d9a6c33232157e45a6d4f8 (patch)
treec904fd2faa10ed724e7229749b31ad6fe37fed9b /src/Entities
parentSuggestion and failed merge fix (diff)
downloadcuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.tar
cuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.tar.gz
cuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.tar.bz2
cuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.tar.lz
cuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.tar.xz
cuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.tar.zst
cuberite-a28b0dc1201dca7c34d9a6c33232157e45a6d4f8.zip
Diffstat (limited to '')
-rw-r--r--src/Entities/Entity.cpp59
-rw-r--r--src/Entities/Entity.h6
-rw-r--r--src/Entities/Player.cpp6
-rw-r--r--src/Entities/Player.h1
4 files changed, 37 insertions, 35 deletions
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp
index a7340a29c..68bfabb30 100644
--- a/src/Entities/Entity.cpp
+++ b/src/Entities/Entity.cpp
@@ -614,11 +614,13 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk)
// Handle drowning
HandleAir();
+ }
+
+ if (!DetectPortal()) // Our chunk is invalid if we have moved to another world
+ {
+ // None of the above functions changed position, we remain in the chunk of NextChunk
+ HandlePhysics(a_Dt, *NextChunk);
}
- DetectPortal();
-
- // None of the above functions change position, we remain in the chunk of NextChunk
- HandlePhysics(a_Dt, *NextChunk);
}
}
@@ -1026,18 +1028,18 @@ void cEntity::DetectCacti(void)
-void cEntity::DetectPortal()
+bool cEntity::DetectPortal()
{
if (GetWorld()->GetDimension() == dimOverworld)
{
if (GetWorld()->GetNetherWorldName().empty() && GetWorld()->GetEndWorldName().empty())
{
- return;
+ return false;
}
}
else if (GetWorld()->GetLinkedOverworldName().empty())
{
- return;
+ return false;
}
int X = POSX_TOINT, Y = POSY_TOINT, Z = POSZ_TOINT;
@@ -1049,13 +1051,13 @@ void cEntity::DetectPortal()
{
if (m_PortalCooldownData.m_ShouldPreventTeleportation)
{
- return;
+ return false;
}
if (IsPlayer() && !((cPlayer *)this)->IsGameModeCreative() && m_PortalCooldownData.m_TicksDelayed != 80)
{
m_PortalCooldownData.m_TicksDelayed++;
- return;
+ return false;
}
m_PortalCooldownData.m_TicksDelayed = 0;
@@ -1065,7 +1067,7 @@ void cEntity::DetectPortal()
{
if (GetWorld()->GetLinkedOverworldName().empty())
{
- return;
+ return false;
}
m_PortalCooldownData.m_ShouldPreventTeleportation = true; // Stop portals from working on respawn
@@ -1074,15 +1076,14 @@ void cEntity::DetectPortal()
{
((cPlayer *)this)->GetClientHandle()->SendRespawn(dimOverworld);
}
- MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedOverworldName()), false);
-
- return;
+
+ return MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedOverworldName()), false);
}
case dimOverworld:
{
if (GetWorld()->GetNetherWorldName().empty())
{
- return;
+ return false;
}
m_PortalCooldownData.m_ShouldPreventTeleportation = true; // Stop portals from working on respawn
@@ -1092,18 +1093,17 @@ void cEntity::DetectPortal()
((cPlayer *)this)->AwardAchievement(achEnterPortal);
((cPlayer *)this)->GetClientHandle()->SendRespawn(dimNether);
}
- MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetNetherWorldName(), dimNether, GetWorld()->GetName()), false);
-
- return;
+
+ return MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetNetherWorldName(), dimNether, GetWorld()->GetName()), false);
}
- default: return;
+ default: return false;
}
}
case E_BLOCK_END_PORTAL:
{
if (m_PortalCooldownData.m_ShouldPreventTeleportation)
{
- return;
+ return false;
}
switch (GetWorld()->GetDimension())
@@ -1112,7 +1112,7 @@ void cEntity::DetectPortal()
{
if (GetWorld()->GetLinkedOverworldName().empty())
{
- return;
+ return false;
}
m_PortalCooldownData.m_ShouldPreventTeleportation = true; // Stop portals from working on respawn
@@ -1122,16 +1122,15 @@ void cEntity::DetectPortal()
cPlayer * Player = (cPlayer *)this;
Player->TeleportToCoords(Player->GetLastBedPos().x, Player->GetLastBedPos().y, Player->GetLastBedPos().z);
Player->GetClientHandle()->SendRespawn(dimOverworld);
- }
- MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedOverworldName()), false);
+ }
- return;
+ return MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedOverworldName()), false);
}
case dimOverworld:
{
if (GetWorld()->GetEndWorldName().empty())
{
- return;
+ return false;
}
m_PortalCooldownData.m_ShouldPreventTeleportation = true; // Stop portals from working on respawn
@@ -1140,12 +1139,11 @@ void cEntity::DetectPortal()
{
((cPlayer *)this)->AwardAchievement(achEnterTheEnd);
((cPlayer *)this)->GetClientHandle()->SendRespawn(dimEnd);
- }
- MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetEndWorldName(), dimEnd, GetWorld()->GetName()), false);
+ }
- return;
+ return MoveToWorld(cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetEndWorldName(), dimEnd, GetWorld()->GetName()), false);
}
- default: return;
+ default: return false;
}
}
default: break;
@@ -1155,6 +1153,7 @@ void cEntity::DetectPortal()
// Allow portals to work again
m_PortalCooldownData.m_ShouldPreventTeleportation = false;
m_PortalCooldownData.m_ShouldPreventTeleportation = 0;
+ return false;
}
@@ -1164,7 +1163,7 @@ void cEntity::DetectPortal()
bool cEntity::MoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn)
{
UNUSED(a_ShouldSendRespawn);
- ASSERT(a_World == NULL);
+ ASSERT(a_World != NULL);
if (GetWorld() == a_World)
{
@@ -1173,7 +1172,7 @@ bool cEntity::MoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn)
}
// Remove all links to the old world
- SetWorldTravellingFrom(GetWorld()); // cChunk handles entity removal
+ SetWorldTravellingFrom(GetWorld()); // cChunk handles entity removal
GetWorld()->BroadcastDestroyEntity(*this);
// Queue add to new world
diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h
index 1679b00d6..62a4097f3 100644
--- a/src/Entities/Entity.h
+++ b/src/Entities/Entity.h
@@ -337,8 +337,10 @@ public:
/** Detects the time for application of cacti damage */
virtual void DetectCacti(void);
- /** Detects whether we are in a portal block and begins teleportation procedures if so */
- virtual void DetectPortal(void);
+ /** Detects whether we are in a portal block and begins teleportation procedures if so
+ Returns true if MoveToWorld() was called, false if not
+ */
+ virtual bool DetectPortal(void);
/// Handles when the entity is in the void
virtual void TickInVoid(cChunk & a_Chunk);
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index e54e10a08..087ac448f 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -95,7 +95,7 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName) :
SetPosX(World->GetSpawnX());
SetPosY(World->GetSpawnY());
SetPosZ(World->GetSpawnZ());
- SetBedPos(Vector3i(World->GetSpawnX(), World->GetSpawnY(), World->GetSpawnZ()));
+ SetBedPos(Vector3i((int)World->GetSpawnX(), (int)World->GetSpawnY(), (int)World->GetSpawnZ()));
LOGD("Player \"%s\" is connecting for the first time, spawning at default world spawn {%.2f, %.2f, %.2f}",
a_PlayerName.c_str(), GetPosX(), GetPosY(), GetPosZ()
@@ -1611,6 +1611,8 @@ void cPlayer::TossItems(const cItems & a_Items)
bool cPlayer::MoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn)
{
+ ASSERT(a_World != NULL);
+
if (GetWorld() == a_World)
{
// Don't move to same world
@@ -1624,7 +1626,7 @@ bool cPlayer::MoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn)
}
// Remove player from the old world
- SetWorldTravellingFrom(GetWorld()); // cChunk handles entity removal
+ SetWorldTravellingFrom(GetWorld()); // cChunk handles entity removal
GetWorld()->RemovePlayer(this);
// Queue adding player to the new world, including all the necessary adjustments to the object
diff --git a/src/Entities/Player.h b/src/Entities/Player.h
index 400377381..d1b3a0339 100644
--- a/src/Entities/Player.h
+++ b/src/Entities/Player.h
@@ -424,7 +424,6 @@ public:
/** Returns wheter the player can fly or not. */
virtual bool CanFly(void) const { return m_CanFly; }
-
// tolua_end
// cEntity overrides: