summaryrefslogtreecommitdiffstats
path: root/src/BlockEntities/MobSpawnerEntity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/BlockEntities/MobSpawnerEntity.cpp')
-rw-r--r--src/BlockEntities/MobSpawnerEntity.cpp92
1 files changed, 31 insertions, 61 deletions
diff --git a/src/BlockEntities/MobSpawnerEntity.cpp b/src/BlockEntities/MobSpawnerEntity.cpp
index f5fb5c3ff..8095fc12b 100644
--- a/src/BlockEntities/MobSpawnerEntity.cpp
+++ b/src/BlockEntities/MobSpawnerEntity.cpp
@@ -33,6 +33,12 @@ void cMobSpawnerEntity::CopyFrom(const cBlockEntity & a_Src)
m_Entity = src.m_Entity;
m_IsActive = src.m_IsActive;
m_SpawnDelay = src.m_SpawnDelay;
+ m_SpawnCount = src.m_SpawnCount;
+ m_SpawnRange = src.m_SpawnRange;
+ m_MinSpawnDelay = src.m_MinSpawnDelay;
+ m_MaxSpawnDelay = src.m_MaxSpawnDelay;
+ m_MaxNearbyEntities = src.m_MaxNearbyEntities;
+ m_RequiredPlayerRange = src.m_RequiredPlayerRange;
}
@@ -114,7 +120,7 @@ bool cMobSpawnerEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
void cMobSpawnerEntity::ResetTimer(void)
{
- m_SpawnDelay = GetRandomProvider().RandInt<short>(200, 800);
+ m_SpawnDelay = GetRandomProvider().RandInt<short>(m_MinSpawnDelay, m_MaxSpawnDelay);
m_World->BroadcastBlockEntity(GetPos());
}
@@ -125,7 +131,7 @@ void cMobSpawnerEntity::ResetTimer(void)
void cMobSpawnerEntity::SpawnEntity(void)
{
auto NearbyEntities = GetNearbyMonsterNum(m_Entity);
- if (NearbyEntities >= 6)
+ if (NearbyEntities >= m_MaxNearbyEntities)
{
ResetTimer();
return;
@@ -136,18 +142,18 @@ void cMobSpawnerEntity::SpawnEntity(void)
auto & Random = GetRandomProvider();
bool HaveSpawnedEntity = false;
- for (size_t i = 0; i < 4; i++)
+ for (short I = 0; I < m_SpawnCount; I++)
{
- if (NearbyEntities >= 6)
+ if (NearbyEntities >= m_MaxNearbyEntities)
{
break;
}
auto SpawnRelPos(GetRelPos());
SpawnRelPos += Vector3i(
- static_cast<int>((Random.RandReal<double>() - Random.RandReal<double>()) * 4.0),
+ static_cast<int>((Random.RandReal<double>() - Random.RandReal<double>()) * static_cast<double>(m_SpawnRange)),
Random.RandInt(-1, 1),
- static_cast<int>((Random.RandReal<double>() - Random.RandReal<double>()) * 4.0)
+ static_cast<int>((Random.RandReal<double>() - Random.RandReal<double>()) * static_cast<double>(m_SpawnRange))
);
auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(SpawnRelPos);
@@ -191,39 +197,24 @@ void cMobSpawnerEntity::SpawnEntity(void)
int cMobSpawnerEntity::GetNearbyPlayersNum(void)
{
- auto SpawnerPos = Vector3d(0.5, 0.5, 0.5) + m_Pos;
int NumPlayers = 0;
- class cCallback : public cChunkDataCallback
+ auto Callback = [&] (cEntity & a_Entity)
{
- public:
- cCallback(Vector3d a_SpawnerPos, int & a_NumPlayers) :
- m_SpawnerPos(a_SpawnerPos),
- m_NumPlayers(a_NumPlayers)
+ if (!a_Entity.IsPlayer())
{
+ return false;
}
-
- virtual void Entity(cEntity * a_Entity) override
+ if ((m_Pos - a_Entity.GetPosition()).Length() <= m_RequiredPlayerRange)
{
- if (!a_Entity->IsPlayer())
- {
- return;
- }
-
- if ((m_SpawnerPos - a_Entity->GetPosition()).Length() <= 16)
- {
- m_NumPlayers++;
- }
+ NumPlayers++;
}
+ return false;
+ };
- protected:
- Vector3d m_SpawnerPos;
- int & m_NumPlayers;
- } Callback(SpawnerPos, NumPlayers);
+ auto PlayerBoundingBox = cBoundingBox(Vector3d(m_Pos.x, m_Pos.y - m_RequiredPlayerRange, m_Pos.z), m_RequiredPlayerRange, m_RequiredPlayerRange * 2);
- int ChunkX = GetChunkX();
- int ChunkZ = GetChunkZ();
- m_World->ForEachChunkInRect(ChunkX - 1, ChunkX + 1, ChunkZ - 1, ChunkZ + 1, Callback);
+ m_World->ForEachEntityInBox(PlayerBoundingBox, Callback);
return NumPlayers;
}
@@ -234,47 +225,26 @@ int cMobSpawnerEntity::GetNearbyPlayersNum(void)
int cMobSpawnerEntity::GetNearbyMonsterNum(eMonsterType a_EntityType)
{
- auto SpawnerPos = Vector3d(0.5, 0.5, 0.5) + m_Pos;
int NumEntities = 0;
- class cCallback : public cChunkDataCallback
+ auto Callback = [&] (cEntity & a_Entity)
{
- public:
- cCallback(Vector3d a_SpawnerPos, eMonsterType a_CallbackEntityType, int & a_NumEntities) :
- m_SpawnerPos(a_SpawnerPos),
- m_EntityType(a_CallbackEntityType),
- m_NumEntities(a_NumEntities)
+ if (!a_Entity.IsMob())
{
+ return false;
}
- virtual void Entity(cEntity * a_Entity) override
+ auto & Mob = static_cast<cMonster &>(a_Entity);
+ if (Mob.GetMobType() == m_Entity)
{
- if (!a_Entity->IsMob())
- {
- return;
- }
-
- cMonster * Mob = static_cast<cMonster *>(a_Entity);
- if (Mob->GetMobType() != m_EntityType)
- {
- return;
- }
-
- if ((Diff(m_SpawnerPos.x, a_Entity->GetPosX()) <= 8.0) && (Diff(m_SpawnerPos.y, a_Entity->GetPosY()) <= 4.0) && (Diff(m_SpawnerPos.z, a_Entity->GetPosZ()) <= 8.0))
- {
- m_NumEntities++;
- }
+ NumEntities++;
}
+ return false;
+ };
- protected:
- Vector3d m_SpawnerPos;
- eMonsterType m_EntityType;
- int & m_NumEntities;
- } Callback(SpawnerPos, a_EntityType, NumEntities);
+ auto EntityBoundingBox = cBoundingBox(Vector3d(m_Pos.x, m_Pos.y - 4, m_Pos.z), m_SpawnRange, 8);
- int ChunkX = GetChunkX();
- int ChunkZ = GetChunkZ();
- m_World->ForEachChunkInRect(ChunkX - 1, ChunkX + 1, ChunkZ - 1, ChunkZ + 1, Callback);
+ m_World->ForEachEntityInBox(EntityBoundingBox, Callback);
return NumEntities;
}