summaryrefslogtreecommitdiffstats
path: root/src/Entities
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@hotmail.co.uk>2014-05-31 23:28:51 +0200
committerTiger Wang <ziwei.tiger@hotmail.co.uk>2014-05-31 23:28:51 +0200
commit8bff3e5af220070ecc789ef551c0b8428b8953ef (patch)
tree4e0b04d1595f8441a9ca5f319ea94244143294db /src/Entities
parentVery minor code changes (diff)
downloadcuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.tar
cuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.tar.gz
cuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.tar.bz2
cuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.tar.lz
cuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.tar.xz
cuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.tar.zst
cuberite-8bff3e5af220070ecc789ef551c0b8428b8953ef.zip
Diffstat (limited to 'src/Entities')
-rw-r--r--src/Entities/Entity.cpp117
-rw-r--r--src/Entities/Entity.h6
-rw-r--r--src/Entities/Player.cpp36
-rw-r--r--src/Entities/Player.h2
4 files changed, 150 insertions, 11 deletions
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp
index 1226a2319..b5c272cf2 100644
--- a/src/Entities/Entity.cpp
+++ b/src/Entities/Entity.cpp
@@ -629,6 +629,7 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk)
// Handle drowning
HandleAir();
}
+ DetectPortal();
// None of the above functions change position, we remain in the chunk of NextChunk
HandlePhysics(a_Dt, *NextChunk);
@@ -1039,6 +1040,122 @@ void cEntity::DetectCacti(void)
+void cEntity::DetectPortal()
+{
+ int X = POSX_TOINT, Y = POSY_TOINT, Z = POSZ_TOINT;
+ if ((Y > 0) && (Y < cChunkDef::Height))
+ {
+ switch (GetWorld()->GetBlock(X, Y, Z))
+ {
+ case E_BLOCK_NETHER_PORTAL:
+ {
+ switch (GetWorld()->GetDimension())
+ {
+ case dimNether:
+ {
+ AString OverworldName = GetWorld()->GetName().substr(0, GetWorld()->GetName().size() - 7);
+ cFile::CreateFolder(FILE_IO_PREFIX + OverworldName);
+ cIniFile File;
+ File.ReadFile(OverworldName + "/world.ini");
+ File.SetValue("General", "Dimension", "Overworld");
+ File.WriteFile(OverworldName + "/world.ini");
+
+ MoveToWorld(OverworldName, cRoot::Get()->CreateAndInitializeWorld(OverworldName));
+ break;
+ }
+ case dimOverworld:
+ {
+ AString NetherWorldName = GetWorld()->GetName() + "_nether";
+ cFile::CreateFolder(FILE_IO_PREFIX + NetherWorldName);
+ cIniFile File;
+ File.ReadFile(NetherWorldName + "/world.ini");
+ File.SetValue("General", "Dimension", "Nether");
+ File.WriteFile(NetherWorldName + "/world.ini");
+
+ MoveToWorld(NetherWorldName, cRoot::Get()->CreateAndInitializeWorld(NetherWorldName));
+ break;
+ }
+ default: break;
+ }
+ break;
+ }
+ case E_BLOCK_END_PORTAL:
+ {
+ switch (GetWorld()->GetDimension())
+ {
+ case dimEnd:
+ {
+ AString OverworldName = GetWorld()->GetName().substr(0, GetWorld()->GetName().size() - 4);
+ cFile::CreateFolder(FILE_IO_PREFIX + OverworldName);
+ cIniFile File;
+ File.ReadFile(OverworldName + "/world.ini");
+ File.SetValue("General", "Dimension", "Overworld");
+ File.WriteFile(OverworldName + "/world.ini");
+
+ MoveToWorld(OverworldName, cRoot::Get()->CreateAndInitializeWorld(OverworldName));
+ break;
+ }
+ case dimOverworld:
+ {
+ AString EndWorldName = GetWorld()->GetName() + "_end";
+ cFile::CreateFolder(FILE_IO_PREFIX + EndWorldName);
+ cIniFile File;
+ File.ReadFile(EndWorldName + "/world.ini");
+ File.SetValue("General", "Dimension", "End");
+ File.WriteFile(EndWorldName + "/world.ini");
+
+ MoveToWorld(EndWorldName, cRoot::Get()->CreateAndInitializeWorld(EndWorldName));
+ break;
+ }
+ default: break;
+ }
+ }
+ default: break;
+ }
+ }
+}
+
+
+
+
+
+bool cEntity::MoveToWorld(const AString & a_WorldName, cWorld * a_World)
+{
+ cWorld * World;
+ if (a_World == NULL)
+ {
+ World = cRoot::Get()->GetWorld(a_WorldName);
+ if (World == NULL)
+ {
+ LOG("%s: Couldn't find world \"%s\".", __FUNCTION__, a_WorldName);
+ return false;
+ }
+ }
+ else
+ {
+ World = a_World;
+ }
+
+ if (GetWorld() == World)
+ {
+ return false;
+ }
+
+ // Remove all links to the old world
+ GetWorld()->RemoveEntity(this);
+ GetWorld()->BroadcastDestroyEntity(*this);
+
+ // Add to all the necessary parts of the new world
+ SetWorld(World);
+ World->AddEntity(this);
+
+ return true;
+}
+
+
+
+
+
void cEntity::SetSwimState(cChunk & a_Chunk)
{
int RelY = (int)floor(GetPosY() + 0.1);
diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h
index 0c393c0f5..da8256606 100644
--- a/src/Entities/Entity.h
+++ b/src/Entities/Entity.h
@@ -323,6 +323,9 @@ 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);
/// Handles when the entity is in the void
virtual void TickInVoid(cChunk & a_Chunk);
@@ -365,6 +368,9 @@ public:
/// Teleports to the coordinates specified
virtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ);
+
+ /** Moves entity to specified world */
+ virtual bool MoveToWorld(const AString & a_WorldName, cWorld * a_World = NULL);
// tolua_end
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index 0dfdcfd8b..140b98d5d 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -134,7 +134,7 @@ cPlayer::~cPlayer(void)
SaveToDisk();
- m_World->RemovePlayer( this );
+ m_World->RemovePlayer(this);
m_ClientHandle = NULL;
@@ -150,8 +150,6 @@ cPlayer::~cPlayer(void)
void cPlayer::Destroyed()
{
CloseWindow(false);
-
- m_ClientHandle = NULL;
}
@@ -952,7 +950,7 @@ void cPlayer::Respawn(void)
m_LifetimeTotalXp = 0;
// ToDo: send score to client? How?
- m_ClientHandle->SendRespawn();
+ m_ClientHandle->SendRespawn(*GetWorld());
// Extinguish the fire:
StopBurning();
@@ -1574,12 +1572,25 @@ void cPlayer::TossItems(const cItems & a_Items)
-bool cPlayer::MoveToWorld(const char * a_WorldName)
+bool cPlayer::MoveToWorld(const AString & a_WorldName, cWorld * a_World)
{
- cWorld * World = cRoot::Get()->GetWorld(a_WorldName);
- if (World == NULL)
+ cWorld * World;
+ if (a_World == NULL)
+ {
+ World = cRoot::Get()->GetWorld(a_WorldName);
+ if (World == NULL)
+ {
+ LOG("%s: Couldn't find world \"%s\".", __FUNCTION__, a_WorldName);
+ return false;
+ }
+ }
+ else
+ {
+ World = a_World;
+ }
+
+ if (GetWorld() == World)
{
- LOG("%s: Couldn't find world \"%s\".", __FUNCTION__, a_WorldName);
return false;
}
@@ -1588,11 +1599,11 @@ bool cPlayer::MoveToWorld(const char * a_WorldName)
// Remove all links to the old world
m_World->RemovePlayer(this);
m_ClientHandle->RemoveFromAllChunks();
- m_World->RemoveEntity(this);
// If the dimension is different, we can send the respawn packet
// http://wiki.vg/Protocol#0x09 says "don't send if dimension is the same" as of 2013_07_02
- m_ClientHandle->MoveToWorld(*World, (OldDimension != World->GetDimension()));
+ bool SendRespawn = OldDimension != World->GetDimension();
+ m_ClientHandle->MoveToWorld(*World, SendRespawn);
// Add player to all the necessary parts of the new world
SetWorld(World);
@@ -1600,6 +1611,11 @@ bool cPlayer::MoveToWorld(const char * a_WorldName)
World->AddEntity(this);
World->AddPlayer(this);
+ if (SendRespawn)
+ {
+ GetClientHandle()->SendPlayerMoveLook();
+ }
+
return true;
}
diff --git a/src/Entities/Player.h b/src/Entities/Player.h
index b7cb27d6c..582f79b86 100644
--- a/src/Entities/Player.h
+++ b/src/Entities/Player.h
@@ -328,7 +328,7 @@ public:
void SetVisible( bool a_bVisible ); // tolua_export
bool IsVisible(void) const { return m_bVisible; } // tolua_export
- bool MoveToWorld(const char * a_WorldName); // tolua_export
+ virtual bool MoveToWorld(const AString & a_WorldName, cWorld * a_World = NULL) override; // tolua_export
bool SaveToDisk(void);
bool LoadFromDisk(void);