Implemented fall damage for mobs
+ Implemented mobile fall damage * Formatting fixes + Defined new Position->Integer macros
This commit is contained in:
parent
60b7f5f23d
commit
7468ba0f10
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 */);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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());
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user