Merge branch 'master' into portals
Conflicts: src/Blocks/WorldInterface.h src/ClientHandle.cpp src/ClientHandle.h src/Entities/Player.cpp src/Entities/Player.h src/Generating/FinishGen.cpp src/Protocol/Protocol.h src/Protocol/Protocol125.cpp src/Protocol/Protocol125.h src/Protocol/Protocol16x.cpp src/Protocol/Protocol16x.h src/Protocol/Protocol17x.cpp src/Protocol/Protocol17x.h src/Protocol/ProtocolRecognizer.cpp src/Protocol/ProtocolRecognizer.h src/Root.h src/World.cpp
This commit is contained in:
@@ -46,8 +46,8 @@ static const struct
|
||||
{cMonster::mtSheep, "sheep"},
|
||||
{cMonster::mtSilverfish, "silverfish"},
|
||||
{cMonster::mtSkeleton, "skeleton"},
|
||||
{cMonster::mtSnowGolem, "snowgolem"},
|
||||
{cMonster::mtSlime, "slime"},
|
||||
{cMonster::mtSnowGolem, "snowgolem"},
|
||||
{cMonster::mtSpider, "spider"},
|
||||
{cMonster::mtSquid, "squid"},
|
||||
{cMonster::mtVillager, "villager"},
|
||||
@@ -62,7 +62,7 @@ static const struct
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cMonster:
|
||||
|
||||
cMonster::cMonster(const AString & a_ConfigName, eType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height)
|
||||
@@ -115,12 +115,10 @@ void cMonster::TickPathFinding()
|
||||
const int PosY = POSY_TOINT;
|
||||
const int PosZ = POSZ_TOINT;
|
||||
|
||||
m_FinalDestination.y = (double)FindFirstNonAirBlockPosition(m_FinalDestination.x, m_FinalDestination.z);
|
||||
|
||||
std::vector<Vector3d> m_PotentialCoordinates;
|
||||
m_TraversedCoordinates.push_back(Vector3i(PosX, PosY, PosZ));
|
||||
|
||||
static const struct // Define which directions to try to move to
|
||||
static const struct // Define which directions to try to move to
|
||||
{
|
||||
int x, z;
|
||||
} gCrossCoords[] =
|
||||
@@ -201,19 +199,6 @@ void cMonster::TickPathFinding()
|
||||
|
||||
|
||||
|
||||
void cMonster::MoveToPosition(const Vector3f & a_Position)
|
||||
{
|
||||
FinishPathFinding();
|
||||
|
||||
m_FinalDestination = a_Position;
|
||||
m_bMovingToDestination = true;
|
||||
TickPathFinding();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cMonster::MoveToPosition(const Vector3d & a_Position)
|
||||
{
|
||||
FinishPathFinding();
|
||||
@@ -227,15 +212,7 @@ void cMonster::MoveToPosition(const Vector3d & a_Position)
|
||||
|
||||
bool cMonster::IsCoordinateInTraversedList(Vector3i a_Coords)
|
||||
{
|
||||
for (std::vector<Vector3i>::const_iterator itr = m_TraversedCoordinates.begin(); itr != m_TraversedCoordinates.end(); ++itr)
|
||||
{
|
||||
if (itr->Equals(a_Coords))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return (std::find(m_TraversedCoordinates.begin(), m_TraversedCoordinates.end(), a_Coords) != m_TraversedCoordinates.end());
|
||||
}
|
||||
|
||||
|
||||
@@ -296,17 +273,15 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
{
|
||||
if (m_bOnGround)
|
||||
{
|
||||
m_Destination.y = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
|
||||
|
||||
if (DoesPosYRequireJump((int)floor(m_Destination.y)))
|
||||
{
|
||||
m_bOnGround = false;
|
||||
AddSpeedY(5.2); // Jump!!
|
||||
AddSpeedY(5.2); // Jump!!
|
||||
}
|
||||
}
|
||||
|
||||
Vector3f Distance = m_Destination - GetPosition();
|
||||
if(!ReachedDestination() && !ReachedFinalDestination()) // If we haven't reached any sort of destination, move
|
||||
if(!ReachedDestination() && !ReachedFinalDestination()) // If we haven't reached any sort of destination, move
|
||||
{
|
||||
Distance.y = 0;
|
||||
Distance.Normalize();
|
||||
@@ -325,20 +300,20 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
AddSpeedZ(Distance.z);
|
||||
|
||||
if (m_EMState == ESCAPING)
|
||||
{ //Runs Faster when escaping :D otherwise they just walk away
|
||||
{ // Runs Faster when escaping :D otherwise they just walk away
|
||||
SetSpeedX (GetSpeedX() * 2.f);
|
||||
SetSpeedZ (GetSpeedZ() * 2.f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ReachedFinalDestination()) // If we have reached the ultimate, final destination, stop pathfinding and attack if appropriate
|
||||
if (ReachedFinalDestination()) // If we have reached the ultimate, final destination, stop pathfinding and attack if appropriate
|
||||
{
|
||||
FinishPathFinding();
|
||||
}
|
||||
else
|
||||
{
|
||||
TickPathFinding(); // We have reached the next point in our path, calculate another point
|
||||
TickPathFinding(); // We have reached the next point in our path, calculate another point
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -353,13 +328,13 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
|
||||
// If enemy passive we ignore checks for player visibility
|
||||
InStateIdle(a_Dt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case CHASING:
|
||||
{
|
||||
// If we do not see a player anymore skip chasing action
|
||||
InStateChasing(a_Dt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case ESCAPING:
|
||||
{
|
||||
InStateEscaping(a_Dt);
|
||||
@@ -435,6 +410,7 @@ void cMonster::HandleFalling()
|
||||
|
||||
|
||||
|
||||
|
||||
int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
|
||||
{
|
||||
int PosY = POSY_TOINT;
|
||||
@@ -478,7 +454,7 @@ bool cMonster::DoTakeDamage(TakeDamageInfo & a_TDI)
|
||||
|
||||
if (!m_SoundHurt.empty() && (m_Health > 0))
|
||||
{
|
||||
m_World->BroadcastSoundEffect(m_SoundHurt, (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 1.0f, 0.8f);
|
||||
m_World->BroadcastSoundEffect(m_SoundHurt, GetPosX(), GetPosY(), GetPosZ(), 1.0f, 0.8f);
|
||||
}
|
||||
|
||||
if (a_TDI.Attacker != NULL)
|
||||
@@ -492,12 +468,12 @@ bool cMonster::DoTakeDamage(TakeDamageInfo & a_TDI)
|
||||
|
||||
|
||||
|
||||
void cMonster::KilledBy(cEntity * a_Killer)
|
||||
void cMonster::KilledBy(TakeDamageInfo & a_TDI)
|
||||
{
|
||||
super::KilledBy(a_Killer);
|
||||
super::KilledBy(a_TDI);
|
||||
if (m_SoundHurt != "")
|
||||
{
|
||||
m_World->BroadcastSoundEffect(m_SoundDeath, (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 1.0f, 0.8f);
|
||||
m_World->BroadcastSoundEffect(m_SoundDeath, GetPosX(), GetPosY(), GetPosZ(), 1.0f, 0.8f);
|
||||
}
|
||||
int Reward;
|
||||
switch (m_MobType)
|
||||
@@ -558,7 +534,7 @@ void cMonster::KilledBy(cEntity * a_Killer)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ((a_Killer != NULL) && (!IsBaby()))
|
||||
if ((a_TDI.Attacker != NULL) && (!IsBaby()))
|
||||
{
|
||||
m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward);
|
||||
}
|
||||
@@ -569,8 +545,8 @@ void cMonster::KilledBy(cEntity * a_Killer)
|
||||
|
||||
|
||||
|
||||
//Checks to see if EventSeePlayer should be fired
|
||||
//monster sez: Do I see the player
|
||||
// Checks to see if EventSeePlayer should be fired
|
||||
// monster sez: Do I see the player
|
||||
void cMonster::CheckEventSeePlayer(void)
|
||||
{
|
||||
// TODO: Rewrite this to use cWorld's DoWithPlayers()
|
||||
@@ -587,7 +563,7 @@ void cMonster::CheckEventSeePlayer(void)
|
||||
|
||||
|
||||
void cMonster::CheckEventLostPlayer(void)
|
||||
{
|
||||
{
|
||||
if (m_Target != NULL)
|
||||
{
|
||||
if ((m_Target->GetPosition() - GetPosition()).Length() > m_SightDistance)
|
||||
@@ -630,7 +606,7 @@ void cMonster::InStateIdle(float a_Dt)
|
||||
{
|
||||
if (m_bMovingToDestination)
|
||||
{
|
||||
return; // Still getting there
|
||||
return; // Still getting there
|
||||
}
|
||||
|
||||
m_IdleInterval += a_Dt;
|
||||
@@ -639,7 +615,7 @@ void cMonster::InStateIdle(float a_Dt)
|
||||
{
|
||||
// At this interval the results are predictable
|
||||
int rem = m_World->GetTickRandomNumber(6) + 1;
|
||||
m_IdleInterval -= 1; // So nothing gets dropped when the server hangs for a few seconds
|
||||
m_IdleInterval -= 1; // So nothing gets dropped when the server hangs for a few seconds
|
||||
|
||||
Vector3d Dist;
|
||||
Dist.x = (double)m_World->GetTickRandomNumber(10) - 5;
|
||||
@@ -706,6 +682,25 @@ void cMonster::GetMonsterConfig(const AString & a_Name)
|
||||
|
||||
|
||||
|
||||
bool cMonster::IsUndead(void)
|
||||
{
|
||||
switch (GetMobType())
|
||||
{
|
||||
case mtZombie:
|
||||
case mtZombiePigman:
|
||||
case mtSkeleton:
|
||||
case mtWither:
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
AString cMonster::MobTypeToString(cMonster::eType a_MobType)
|
||||
{
|
||||
// Mob types aren't sorted, so we need to search linearly:
|
||||
@@ -900,7 +895,7 @@ cMonster * cMonster::NewMonsterFromType(cMonster::eType a_MobType)
|
||||
case mtMooshroom: toReturn = new cMooshroom(); break;
|
||||
case mtOcelot: toReturn = new cOcelot(); break;
|
||||
case mtPig: toReturn = new cPig(); break;
|
||||
case mtSheep: toReturn = new cSheep (Random.NextInt(15)); break; // Colour parameter
|
||||
case mtSheep: toReturn = new cSheep(); break;
|
||||
case mtSilverfish: toReturn = new cSilverfish(); break;
|
||||
case mtSnowGolem: toReturn = new cSnowGolem(); break;
|
||||
case mtSpider: toReturn = new cSpider(); break;
|
||||
@@ -908,7 +903,7 @@ cMonster * cMonster::NewMonsterFromType(cMonster::eType a_MobType)
|
||||
case mtWitch: toReturn = new cWitch(); break;
|
||||
case mtWither: toReturn = new cWither(); break;
|
||||
case mtWolf: toReturn = new cWolf(); break;
|
||||
case mtZombie: toReturn = new cZombie(false); break; // TODO: Infected zombie parameter
|
||||
case mtZombie: toReturn = new cZombie(false); break; // TODO: Infected zombie parameter
|
||||
case mtZombiePigman: toReturn = new cZombiePigman(); break;
|
||||
default:
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user