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(); \
|
||||
}
|
||||
|
||||
#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 "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 */);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user