1
0

Implemented fall damage for mobs

+ Implemented mobile fall damage
* Formatting fixes
+ Defined new Position->Integer macros
This commit is contained in:
Tiger Wang 2014-01-25 19:02:13 +00:00
parent 60b7f5f23d
commit 7468ba0f10
5 changed files with 41 additions and 11 deletions

View File

@ -29,6 +29,11 @@
return super::GetClass(); \ return super::GetClass(); \
} }
#define POSX_TOINT (int)floor(GetPosX())
#define POSY_TOINT (int)floor(GetPosY())
#define POSZ_TOINT (int)floor(GetPosZ())
#define POS_TOINT Vector3i(POSXTOINT, POSYTOINT, POSZTOINT)

View File

@ -26,8 +26,6 @@
#include "inifile/iniFile.h" #include "inifile/iniFile.h"
#include "json/json.h" #include "json/json.h"
#define float2int(x) ((x)<0 ? ((int)(x))-1 : (int)(x))
@ -440,7 +438,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
cWorld * World = GetWorld(); cWorld * World = GetWorld();
if ((GetPosY() >= 0) && (GetPosY() < cChunkDef::Height)) if ((GetPosY() >= 0) && (GetPosY() < cChunkDef::Height))
{ {
BLOCKTYPE BlockType = World->GetBlock(float2int(GetPosX()), float2int(GetPosY()), float2int(GetPosZ())); BLOCKTYPE BlockType = World->GetBlock((int)floor(GetPosX()), (int)floor(GetPosY()), (int)floor(GetPosZ()));
if (BlockType != E_BLOCK_AIR) if (BlockType != E_BLOCK_AIR)
{ {
m_bTouchGround = true; m_bTouchGround = true;
@ -470,7 +468,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
TakeDamage(dtFalling, NULL, Damage, Damage, 0); TakeDamage(dtFalling, NULL, Damage, Damage, 0);
} }
// Mojang uses floor() to get X and Z positions, instead of just casting it to an (int) // Fall particles
GetWorld()->BroadcastSoundParticleEffect(2006, (int)floor(GetPosX()), (int)GetPosY() - 1, (int)floor(GetPosZ()), Damage /* Used as particle effect speed modifier */); GetWorld()->BroadcastSoundParticleEffect(2006, (int)floor(GetPosX()), (int)GetPosY() - 1, (int)floor(GetPosZ()), Damage /* Used as particle effect speed modifier */);
} }

View File

@ -415,7 +415,7 @@ protected:
float m_LastBlockActionTime; float m_LastBlockActionTime;
int m_LastBlockActionCnt; int m_LastBlockActionCnt;
eGameMode m_GameMode; eGameMode m_GameMode;
std::string m_IP; AString m_IP;
/// The item being dragged by the cursor while in a UI window /// The item being dragged by the cursor while in a UI window
cItem m_DraggingItem; cItem m_DraggingItem;

View File

@ -82,6 +82,7 @@ cMonster::cMonster(const AString & a_ConfigName, eType a_MobType, const AString
, m_AttackRange(2) , m_AttackRange(2)
, m_AttackInterval(0) , m_AttackInterval(0)
, m_BurnsInDaylight(false) , m_BurnsInDaylight(false)
, m_LastGroundHeight(POSY_TOINT)
{ {
if (!a_ConfigName.empty()) if (!a_ConfigName.empty())
{ {
@ -113,7 +114,7 @@ void cMonster::TickPathFinding()
std::vector<Vector3d> m_PotentialCoordinates; std::vector<Vector3d> m_PotentialCoordinates;
m_TraversedCoordinates.push_back(Vector3i(PosX, PosY, PosZ)); m_TraversedCoordinates.push_back(Vector3i(PosX, PosY, PosZ));
static const struct // Define which directions the torch can power static const struct // Define which directions to try to move to
{ {
int x, z; int x, z;
} gCrossCoords[] = } gCrossCoords[] =
@ -261,9 +262,9 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
{ {
if (m_bOnGround) if (m_bOnGround)
{ {
int NextHeight = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z); m_Destination.y = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
if (DoesPosYRequireJump(NextHeight)) if (DoesPosYRequireJump(m_Destination.y))
{ {
m_bOnGround = false; m_bOnGround = false;
AddPosY(1.5); // Jump!! AddPosY(1.5); // Jump!!
@ -298,10 +299,11 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
} }
} }
if (ReachedFinalDestination()) if (ReachedFinalDestination() && (m_Target != NULL))
Attack(a_Dt); Attack(a_Dt);
SetPitchAndYawFromDestination(); SetPitchAndYawFromDestination();
HandleFalling();
switch (m_EMState) switch (m_EMState)
{ {
@ -369,6 +371,27 @@ void cMonster::SetPitchAndYawFromDestination()
void cMonster::HandleFalling()
{
if (m_bOnGround)
{
int Damage = (m_LastGroundHeight - POSY_TOINT) - 3;
if (Damage > 0)
{
TakeDamage(dtFalling, NULL, Damage, Damage, 0);
// Fall particles
GetWorld()->BroadcastSoundParticleEffect(2006, POSX_TOINT, POSY_TOINT - 1, POSZ_TOINT, Damage /* Used as particle effect speed modifier */);
}
m_LastGroundHeight = (int)floor(GetPosY());
}
}
int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ) int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
{ {
int PosY = (int)floor(GetPosY()); int PosY = (int)floor(GetPosY());

View File

@ -199,9 +199,13 @@ protected:
/** Sets the body yaw and head yaw/pitch based on next/ultimate destinations */ /** Sets the body yaw and head yaw/pitch based on next/ultimate destinations */
void SetPitchAndYawFromDestination(void); void SetPitchAndYawFromDestination(void);
/* ===========================*/ /* =========================== */
/* ========= FALLING ========= */
virtual void HandleFalling(void);
int m_LastGroundHeight;
/* =========================== */
float m_IdleInterval; float m_IdleInterval;
float m_DestroyTimer; float m_DestroyTimer;