1
0

Tamed wolf assists owner (attack / defence)

This commit is contained in:
LogicParrot
2016-01-11 21:34:41 +02:00
parent 1f9908c712
commit 359e772dee
11 changed files with 293 additions and 150 deletions

View File

@@ -29,7 +29,7 @@ cWolf::cWolf(void) :
bool cWolf::DoTakeDamage(TakeDamageInfo & a_TDI)
{
if (super::DoTakeDamage(a_TDI))
if (!super::DoTakeDamage(a_TDI))
{
return false;
}
@@ -55,12 +55,16 @@ bool cWolf::Attack(std::chrono::milliseconds a_Dt)
{
return super::Attack(a_Dt);
}
else
{
m_Target = nullptr;
}
}
else
{
return super::Attack(a_Dt);
}
return false;
}
@@ -68,6 +72,19 @@ bool cWolf::Attack(std::chrono::milliseconds a_Dt)
void cWolf::NearbyPlayerIsFighting(cPlayer * a_Player, cEntity * a_Opponent)
{
if ((m_Target == nullptr) && (a_Player->GetName() == m_OwnerName) && !IsSitting())
{
m_Target = a_Opponent;
}
}
void cWolf::OnRightClicked(cPlayer & a_Player)
{
if (!IsTame() && !IsAngry())
@@ -160,43 +177,65 @@ void cWolf::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
super::Tick(a_Dt, a_Chunk);
}
cPlayer * a_Closest_Player = m_World->FindClosestPlayer(GetPosition(), static_cast<float>(m_SightDistance));
if (a_Closest_Player != nullptr)
if (m_Target == nullptr)
{
switch (a_Closest_Player->GetEquippedItem().m_ItemType)
cPlayer * a_Closest_Player = m_World->FindClosestPlayer(GetPosition(), static_cast<float>(m_SightDistance));
if (a_Closest_Player != nullptr)
{
case E_ITEM_BONE:
case E_ITEM_RAW_BEEF:
case E_ITEM_STEAK:
case E_ITEM_RAW_CHICKEN:
case E_ITEM_COOKED_CHICKEN:
case E_ITEM_ROTTEN_FLESH:
case E_ITEM_RAW_PORKCHOP:
case E_ITEM_COOKED_PORKCHOP:
switch (a_Closest_Player->GetEquippedItem().m_ItemType)
{
if (!IsBegging())
case E_ITEM_BONE:
case E_ITEM_RAW_BEEF:
case E_ITEM_STEAK:
case E_ITEM_RAW_CHICKEN:
case E_ITEM_COOKED_CHICKEN:
case E_ITEM_ROTTEN_FLESH:
case E_ITEM_RAW_PORKCHOP:
case E_ITEM_COOKED_PORKCHOP:
{
SetIsBegging(true);
m_World->BroadcastEntityMetadata(*this);
if (!IsBegging())
{
SetIsBegging(true);
m_World->BroadcastEntityMetadata(*this);
}
m_FinalDestination = a_Closest_Player->GetPosition(); // So that we will look at a player holding food
// Don't move to the player if the wolf is sitting.
if (!IsSitting())
{
MoveToPosition(a_Closest_Player->GetPosition());
}
break;
}
m_FinalDestination = a_Closest_Player->GetPosition(); // So that we will look at a player holding food
// Don't move to the player if the wolf is sitting.
if (!IsSitting())
default:
{
MoveToPosition(a_Closest_Player->GetPosition());
if (IsBegging())
{
SetIsBegging(false);
m_World->BroadcastEntityMetadata(*this);
}
}
break;
}
default:
}
}
else
{
if (IsSitting())
{
m_Target = nullptr;
}
else
{
if (TargetIsInRange())
{
if (IsBegging())
{
SetIsBegging(false);
m_World->BroadcastEntityMetadata(*this);
}
StopMovingToPosition();
Attack(a_Dt);
}
else
{
MoveToPosition(m_Target->GetPosition());
}
}
}
@@ -237,14 +276,33 @@ void cWolf::TickFollowPlayer()
{
Callback.OwnerPos.y = FindFirstNonAirBlockPosition(Callback.OwnerPos.x, Callback.OwnerPos.z);
TeleportToCoords(Callback.OwnerPos.x, Callback.OwnerPos.y, Callback.OwnerPos.z);
m_Target = nullptr;
}
if (Distance < 2)
{
if (m_Target == nullptr)
{
StopMovingToPosition();
}
}
else
{
MoveToPosition(Callback.OwnerPos);
if (m_Target == nullptr)
{
MoveToPosition(Callback.OwnerPos);
}
}
}
}
void cWolf::InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
{
if (!IsTame())
{
cMonster::InStateIdle(a_Dt, a_Chunk);
}
}