diff options
author | Mattes D <github@xoft.cz> | 2014-06-01 10:43:37 +0200 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2014-06-01 10:43:37 +0200 |
commit | 2059944d1e39e952c164b8a87c0c3f216b3b731e (patch) | |
tree | fd210c1cf1bfcda2f7ed1292df01a26f9555c057 /src/Entities/Entity.cpp | |
parent | Initial commit of the Generator article. (diff) | |
parent | Updated AlchemistVillage prefabs. (diff) | |
download | cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.tar cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.tar.gz cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.tar.bz2 cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.tar.lz cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.tar.xz cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.tar.zst cuberite-2059944d1e39e952c164b8a87c0c3f216b3b731e.zip |
Diffstat (limited to 'src/Entities/Entity.cpp')
-rw-r--r-- | src/Entities/Entity.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 4cf10a219..1226a2319 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -312,12 +312,16 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI) if ((a_TDI.Attacker != NULL) && (a_TDI.Attacker->IsPlayer())) { + cPlayer * Player = (cPlayer *)a_TDI.Attacker; + // IsOnGround() only is false if the player is moving downwards - if (!((cPlayer *)a_TDI.Attacker)->IsOnGround()) // TODO: Better damage increase, and check for enchantments (and use magic critical instead of plain) + if (!Player->IsOnGround()) // TODO: Better damage increase, and check for enchantments (and use magic critical instead of plain) { a_TDI.FinalDamage += 2; m_World->BroadcastEntityAnimation(*this, 4); // Critical hit } + + Player->GetStatManager().AddValue(statDamageDealt, (StatValue)floor(a_TDI.FinalDamage * 10 + 0.5)); } m_Health -= (short)a_TDI.FinalDamage; @@ -370,6 +374,11 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI) if (m_Health <= 0) { KilledBy(a_TDI.Attacker); + + if (a_TDI.Attacker != NULL) + { + a_TDI.Attacker->Killed(this); + } } return true; } @@ -575,9 +584,16 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk) if (m_AttachedTo != NULL) { - if ((m_Pos - m_AttachedTo->GetPosition()).Length() > 0.5) + Vector3d DeltaPos = m_Pos - m_AttachedTo->GetPosition(); + if (DeltaPos.Length() > 0.5) { SetPosition(m_AttachedTo->GetPosition()); + + if (IsPlayer()) + { + cPlayer * Player = (cPlayer *)this; + Player->UpdateMovementStats(DeltaPos); + } } } else @@ -601,6 +617,10 @@ void cEntity::Tick(float a_Dt, cChunk & a_Chunk) m_TicksSinceLastVoidDamage = 0; } + if (IsMob() || IsPlayer() || IsPickup() || IsExpOrb()) + { + DetectCacti(); + } if (IsMob() || IsPlayer()) { // Set swimming state @@ -998,6 +1018,27 @@ void cEntity::TickInVoid(cChunk & a_Chunk) +void cEntity::DetectCacti(void) +{ + int X = POSX_TOINT, Y = POSY_TOINT, Z = POSZ_TOINT; + double w = m_Width / 2; + if ( + ((Y > 0) && (Y < cChunkDef::Height)) && + ((((X + 1) - GetPosX() < w) && (GetWorld()->GetBlock(X + 1, Y, Z) == E_BLOCK_CACTUS)) || + ((GetPosX() - X < w) && (GetWorld()->GetBlock(X - 1, Y, Z) == E_BLOCK_CACTUS)) || + (((Z + 1) - GetPosZ() < w) && (GetWorld()->GetBlock(X, Y, Z + 1) == E_BLOCK_CACTUS)) || + ((GetPosZ() - Z < w) && (GetWorld()->GetBlock(X, Y, Z - 1) == E_BLOCK_CACTUS)) || + (((GetPosY() - Y < 1) && (GetWorld()->GetBlock(X, Y, Z) == E_BLOCK_CACTUS)))) + ) + { + TakeDamage(dtCactusContact, NULL, 1, 0); + } +} + + + + + void cEntity::SetSwimState(cChunk & a_Chunk) { int RelY = (int)floor(GetPosY() + 0.1); |