1
0
Fork 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(); \
}
#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 "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();
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)
{
m_bTouchGround = true;
@ -470,7 +468,7 @@ void cPlayer::SetTouchGround(bool a_bTouchGround)
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 */);
}

View File

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

View File

@ -82,6 +82,7 @@ cMonster::cMonster(const AString & a_ConfigName, eType a_MobType, const AString
, m_AttackRange(2)
, m_AttackInterval(0)
, m_BurnsInDaylight(false)
, m_LastGroundHeight(POSY_TOINT)
{
if (!a_ConfigName.empty())
{
@ -113,7 +114,7 @@ void cMonster::TickPathFinding()
std::vector<Vector3d> m_PotentialCoordinates;
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;
} gCrossCoords[] =
@ -261,9 +262,9 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
{
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;
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);
SetPitchAndYawFromDestination();
HandleFalling();
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 PosY = (int)floor(GetPosY());

View File

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