summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Enderman.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/Enderman.cpp')
-rw-r--r--src/Mobs/Enderman.cpp151
1 files changed, 0 insertions, 151 deletions
diff --git a/src/Mobs/Enderman.cpp b/src/Mobs/Enderman.cpp
index 51255beb3..8a2803492 100644
--- a/src/Mobs/Enderman.cpp
+++ b/src/Mobs/Enderman.cpp
@@ -8,74 +8,6 @@
-////////////////////////////////////////////////////////////////////////////////
-// cPlayerLookCheck
-class cPlayerLookCheck :
- public cPlayerListCallback
-{
-public:
- cPlayerLookCheck(Vector3d a_EndermanPos, int a_SightDistance) :
- m_Player(NULL),
- m_EndermanPos(a_EndermanPos),
- m_SightDistance(a_SightDistance)
- {
- }
-
- virtual bool Item(cPlayer * a_Player) override
- {
- // Don't check players who are in creative gamemode
- if (a_Player->IsGameModeCreative())
- {
- return false;
- }
-
- Vector3d Direction = m_EndermanPos - a_Player->GetPosition();
-
- // Don't check players who are more then SightDistance (64) blocks away
- if (Direction.Length() > m_SightDistance)
- {
- return false;
- }
-
- // Don't check if the player has a pumpkin on his head
- if (a_Player->GetEquippedHelmet().m_ItemType == E_BLOCK_PUMPKIN)
- {
- return false;
- }
-
-
- Vector3d LookVector = a_Player->GetLookVector();
- double dot = Direction.Dot(LookVector);
-
- // 0.09 rad ~ 5 degrees
- // If the player's crosshair is within 5 degrees of the enderman, it counts as looking
- if (dot <= cos(0.09))
- {
- return false;
- }
-
- cTracer LineOfSight(a_Player->GetWorld());
- if (LineOfSight.Trace(m_EndermanPos, Direction, (int)Direction.Length()))
- {
- // No direct line of sight
- return false;
- }
-
- m_Player = a_Player;
- return true;
- }
-
- cPlayer * GetPlayer(void) const { return m_Player; }
-
-protected:
- cPlayer * m_Player;
- Vector3d m_EndermanPos;
- int m_SightDistance;
-} ;
-
-
-
-
cEnderman::cEnderman(void) :
super("Enderman", mtEnderman, "mob.endermen.hit", "mob.endermen.death", 0.5, 2.9),
@@ -98,86 +30,3 @@ void cEnderman::GetDrops(cItems & a_Drops, cEntity * a_Killer)
}
AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_ENDER_PEARL);
}
-
-
-
-
-void cEnderman::CheckEventSeePlayer()
-{
- if (m_Target != NULL)
- {
- return;
- }
-
- cPlayerLookCheck Callback(GetPosition(), m_SightDistance);
- if (m_World->ForEachPlayer(Callback))
- {
- return;
- }
-
- ASSERT(Callback.GetPlayer() != NULL);
-
- if (!CheckLight())
- {
- // Insufficient light for enderman to become aggravated
- // TODO: Teleport to a suitable location
- return;
- }
-
- if (!Callback.GetPlayer()->IsGameModeCreative())
- {
- super::EventSeePlayer(Callback.GetPlayer());
- m_EMState = CHASING;
- m_bIsScreaming = true;
- GetWorld()->BroadcastEntityMetadata(*this);
- }
-}
-
-
-
-
-
-void cEnderman::CheckEventLostPlayer(void)
-{
- super::CheckEventLostPlayer();
- if (!CheckLight())
- {
- EventLosePlayer();
- }
-}
-
-
-
-
-
-void cEnderman::EventLosePlayer()
-{
- super::EventLosePlayer();
- m_bIsScreaming = false;
- GetWorld()->BroadcastEntityMetadata(*this);
-}
-
-
-
-
-
-bool cEnderman::CheckLight()
-{
- int ChunkX, ChunkZ;
- cChunkDef::BlockToChunk(POSX_TOINT, POSZ_TOINT, ChunkX, ChunkZ);
-
- // Check if the chunk the enderman is in is lit
- if (!m_World->IsChunkLighted(ChunkX, ChunkZ))
- {
- m_World->QueueLightChunk(ChunkX, ChunkZ);
- return true;
- }
-
- // Enderman only attack if the skylight is lower or equal to 8
- if (m_World->GetBlockSkyLight(POSX_TOINT, POSY_TOINT, POSZ_TOINT) - GetWorld()->GetSkyDarkness() > 8)
- {
- return false;
- }
-
- return true;
-}