1
0

Merge pull request #2241 from lkolbly/master

Work on NetherPortalScanner. Setup portal scanner to reset PortalCool…
This commit is contained in:
worktycho 2015-06-26 14:12:29 +01:00
commit 0a7c54261f
6 changed files with 40 additions and 21 deletions

View File

@ -1269,11 +1269,12 @@ void cEntity::DetectCacti(void)
void cEntity::ScheduleMoveToWorld(cWorld * a_World, Vector3d a_NewPosition) void cEntity::ScheduleMoveToWorld(cWorld * a_World, Vector3d a_NewPosition, bool a_SetPortalCooldown)
{ {
m_NewWorld = a_World; m_NewWorld = a_World;
m_NewWorldPosition = a_NewPosition; m_NewWorldPosition = a_NewPosition;
m_IsWorldChangeScheduled = true; m_IsWorldChangeScheduled = true;
m_WorldChangeSetPortalCooldown = a_SetPortalCooldown;
} }
@ -1285,6 +1286,14 @@ bool cEntity::DetectPortal()
if (m_IsWorldChangeScheduled) if (m_IsWorldChangeScheduled)
{ {
m_IsWorldChangeScheduled = false; m_IsWorldChangeScheduled = false;
if (m_WorldChangeSetPortalCooldown)
{
// Delay the portal check.
m_PortalCooldownData.m_TicksDelayed = 0;
m_PortalCooldownData.m_ShouldPreventTeleportation = true;
}
MoveToWorld(m_NewWorld, false, m_NewWorldPosition); MoveToWorld(m_NewWorld, false, m_NewWorldPosition);
return true; return true;
} }
@ -1343,10 +1352,10 @@ bool cEntity::DetectPortal()
TargetPos.x *= 8.0; TargetPos.x *= 8.0;
TargetPos.z *= 8.0; TargetPos.z *= 8.0;
cWorld * TargetWorld = cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedOverworldName(), dimNether, GetWorld()->GetName()); cWorld * TargetWorld = cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedOverworldName(), dimNether, GetWorld()->GetName(), false);
LOGD("Jumping nether -> overworld"); LOGD("Jumping nether -> overworld");
new cNetherPortalScanner(this, TargetWorld, TargetPos, 256); new cNetherPortalScanner(this, TargetWorld, TargetPos, 256);
return false; return true;
} }
else else
{ {
@ -1367,10 +1376,10 @@ bool cEntity::DetectPortal()
TargetPos.x /= 8.0; TargetPos.x /= 8.0;
TargetPos.z /= 8.0; TargetPos.z /= 8.0;
cWorld * TargetWorld = cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedNetherWorldName(), dimNether, GetWorld()->GetName()); cWorld * TargetWorld = cRoot::Get()->CreateAndInitializeWorld(GetWorld()->GetLinkedNetherWorldName(), dimNether, GetWorld()->GetName(), false);
LOGD("Jumping overworld -> nether"); LOGD("Jumping overworld -> nether");
new cNetherPortalScanner(this, TargetWorld, TargetPos, 128); new cNetherPortalScanner(this, TargetWorld, TargetPos, 128);
return false; return true;
} }
} }
case E_BLOCK_END_PORTAL: case E_BLOCK_END_PORTAL:

View File

@ -350,31 +350,31 @@ public:
*/ */
virtual bool DetectPortal(void); virtual bool DetectPortal(void);
/// Handles when the entity is in the void /** Handles when the entity is in the void */
virtual void TickInVoid(cChunk & a_Chunk); virtual void TickInVoid(cChunk & a_Chunk);
/// Called when the entity starts burning /** Called when the entity starts burning */
virtual void OnStartedBurning(void); virtual void OnStartedBurning(void);
/// Called when the entity finishes burning /** Called when the entity finishes burning */
virtual void OnFinishedBurning(void); virtual void OnFinishedBurning(void);
// tolua_begin // tolua_begin
/// Sets the maximum value for the health /** Sets the maximum value for the health */
void SetMaxHealth(int a_MaxHealth); void SetMaxHealth(int a_MaxHealth);
int GetMaxHealth(void) const { return m_MaxHealth; } int GetMaxHealth(void) const { return m_MaxHealth; }
/// Sets whether the entity is fireproof /** Sets whether the entity is fireproof */
void SetIsFireproof(bool a_IsFireproof); void SetIsFireproof(bool a_IsFireproof);
bool IsFireproof(void) const { return m_IsFireproof; } bool IsFireproof(void) const { return m_IsFireproof; }
/// Puts the entity on fire for the specified amount of ticks /** Puts the entity on fire for the specified amount of ticks */
void StartBurning(int a_TicksLeftBurning); void StartBurning(int a_TicksLeftBurning);
/// Stops the entity from burning, resets all burning timers /** Stops the entity from burning, resets all burning timers */
void StopBurning(void); void StopBurning(void);
// tolua_end // tolua_end
@ -386,14 +386,14 @@ public:
// tolua_begin // tolua_begin
/// Teleports to the entity specified /** Teleports to the entity specified */
virtual void TeleportToEntity(cEntity & a_Entity); virtual void TeleportToEntity(cEntity & a_Entity);
/// Teleports to the coordinates specified /** Teleports to the coordinates specified */
virtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ); virtual void TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ);
/// Schedules a MoveToWorld call to occur on the next Tick of the entity /** Schedules a MoveToWorld call to occur on the next Tick of the entity */
void ScheduleMoveToWorld(cWorld * a_World, Vector3d a_NewPosition); void ScheduleMoveToWorld(cWorld * a_World, Vector3d a_NewPosition, bool a_SetPortalCooldown = false);
bool MoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn, Vector3d a_NewPosition) { return DoMoveToWorld(a_World, a_ShouldSendRespawn, a_NewPosition); } bool MoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn, Vector3d a_NewPosition) { return DoMoveToWorld(a_World, a_ShouldSendRespawn, a_NewPosition); }
@ -538,6 +538,7 @@ protected:
/** State variables for ScheduleMoveToWorld. */ /** State variables for ScheduleMoveToWorld. */
bool m_IsWorldChangeScheduled; bool m_IsWorldChangeScheduled;
bool m_WorldChangeSetPortalCooldown;
cWorld * m_NewWorld; cWorld * m_NewWorld;
Vector3d m_NewWorldPosition; Vector3d m_NewWorldPosition;

View File

@ -49,6 +49,12 @@ void cNetherPortalScanner::OnChunkAvailable(int a_ChunkX, int a_ChunkZ)
if (blocks[i] == E_BLOCK_NETHER_PORTAL) if (blocks[i] == E_BLOCK_NETHER_PORTAL)
{ {
Vector3i Coordinate = cChunkDef::IndexToCoordinate(i); Vector3i Coordinate = cChunkDef::IndexToCoordinate(i);
if (Coordinate.y >= m_MaxY)
{
// This is above the map, don't consider it.
continue;
}
Vector3d PortalLoc = Vector3d(Coordinate.x + a_ChunkX * cChunkDef::Width, Coordinate.y, Coordinate.z + a_ChunkZ * cChunkDef::Width); Vector3d PortalLoc = Vector3d(Coordinate.x + a_ChunkX * cChunkDef::Width, Coordinate.y, Coordinate.z + a_ChunkZ * cChunkDef::Width);
if (!m_FoundPortal) if (!m_FoundPortal)
{ {
@ -284,7 +290,7 @@ void cNetherPortalScanner::OnDisabled(void)
} }
LOGD("Placing player at {%f, %f, %f}", Position.x, Position.y, Position.z); LOGD("Placing player at {%f, %f, %f}", Position.x, Position.y, Position.z);
m_Entity->ScheduleMoveToWorld(m_World, Position); m_Entity->ScheduleMoveToWorld(m_World, Position, true);
delete this; delete this;
} }

View File

@ -40,7 +40,7 @@ private:
static const int SearchSolidBaseWidth = 3; static const int SearchSolidBaseWidth = 3;
/** Where to place the player out from the face and across the face */ /** Where to place the player out from the face and across the face */
const double OutOffset = 1.5; const double OutOffset = 0.5;
const double AcrossOffset = 0.5; const double AcrossOffset = 0.5;
/** Builds a portal. */ /** Builds a portal. */

View File

@ -342,7 +342,7 @@ void cRoot::LoadWorlds(cSettingsRepositoryInterface & a_Settings)
cWorld * cRoot::CreateAndInitializeWorld(const AString & a_WorldName, eDimension a_Dimension, const AString & a_OverworldName) cWorld * cRoot::CreateAndInitializeWorld(const AString & a_WorldName, eDimension a_Dimension, const AString & a_OverworldName, bool a_InitSpawn)
{ {
cWorld * World = m_WorldsByName[a_WorldName]; cWorld * World = m_WorldsByName[a_WorldName];
if (World != nullptr) if (World != nullptr)
@ -353,7 +353,10 @@ cWorld * cRoot::CreateAndInitializeWorld(const AString & a_WorldName, eDimension
cWorld * NewWorld = new cWorld(a_WorldName.c_str(), a_Dimension, a_OverworldName); cWorld * NewWorld = new cWorld(a_WorldName.c_str(), a_Dimension, a_OverworldName);
m_WorldsByName[a_WorldName] = NewWorld; m_WorldsByName[a_WorldName] = NewWorld;
NewWorld->Start(); NewWorld->Start();
NewWorld->InitializeSpawn(); if (a_InitSpawn)
{
NewWorld->InitializeSpawn();
}
m_PluginManager->CallHookWorldStarted(*NewWorld); m_PluginManager->CallHookWorldStarted(*NewWorld);
return NewWorld; return NewWorld;
} }

View File

@ -69,7 +69,7 @@ public:
The dimension parameter is used to create a world with a specific dimension The dimension parameter is used to create a world with a specific dimension
a_OverworldName should be set for non-overworld dimensions if one wishes that world to link back to an overworld via portals a_OverworldName should be set for non-overworld dimensions if one wishes that world to link back to an overworld via portals
*/ */
cWorld * CreateAndInitializeWorld(const AString & a_WorldName, eDimension a_Dimension = dimOverworld, const AString & a_OverworldName = ""); cWorld * CreateAndInitializeWorld(const AString & a_WorldName, eDimension a_Dimension = dimOverworld, const AString & a_OverworldName = "", bool a_InitSpawn = true);
/** Returns the up time of the server in seconds */ /** Returns the up time of the server in seconds */
int GetServerUpTime(void) int GetServerUpTime(void)