Added magma block contact damage (#5055)
* Added magma block contact damage * Fireproof entities do not take damage from magma * Fire resistance prevents magma damage * No magma damage when hovering over magma block
This commit is contained in:
parent
e35519ec8a
commit
3d044d2dde
@ -14452,6 +14452,14 @@ end
|
|||||||
{
|
{
|
||||||
Notes = "Damage from contact with a cactus block"
|
Notes = "Damage from contact with a cactus block"
|
||||||
},
|
},
|
||||||
|
dtMagmaContact =
|
||||||
|
{
|
||||||
|
Notes = "Damage from contact with a magma block"
|
||||||
|
},
|
||||||
|
dtMagma =
|
||||||
|
{
|
||||||
|
Notes = "Damage from contact with a magma block"
|
||||||
|
},
|
||||||
dtDrown =
|
dtDrown =
|
||||||
{
|
{
|
||||||
Notes = "Damage received by drowning in water / lava"
|
Notes = "Damage received by drowning in water / lava"
|
||||||
|
@ -273,6 +273,7 @@ AString DamageTypeToString(eDamageType a_DamageType)
|
|||||||
case dtAdmin: return "dtAdmin";
|
case dtAdmin: return "dtAdmin";
|
||||||
case dtAttack: return "dtAttack";
|
case dtAttack: return "dtAttack";
|
||||||
case dtCactusContact: return "dtCactusContact";
|
case dtCactusContact: return "dtCactusContact";
|
||||||
|
case dtMagmaContact: return "dtMagmaContact";
|
||||||
case dtDrowning: return "dtDrowning";
|
case dtDrowning: return "dtDrowning";
|
||||||
case dtEnderPearl: return "dtEnderPearl";
|
case dtEnderPearl: return "dtEnderPearl";
|
||||||
case dtEnvironment: return "dtEnvironment";
|
case dtEnvironment: return "dtEnvironment";
|
||||||
@ -323,6 +324,7 @@ eDamageType StringToDamageType(const AString & a_DamageTypeString)
|
|||||||
{ dtSuffocating, "dtSuffocation"},
|
{ dtSuffocating, "dtSuffocation"},
|
||||||
{ dtStarving, "dtStarving"},
|
{ dtStarving, "dtStarving"},
|
||||||
{ dtCactusContact, "dtCactusContact"},
|
{ dtCactusContact, "dtCactusContact"},
|
||||||
|
{ dtMagmaContact, "dtMagmaContact"},
|
||||||
{ dtLavaContact, "dtLavaContact"},
|
{ dtLavaContact, "dtLavaContact"},
|
||||||
{ dtPoisoning, "dtPoisoning"},
|
{ dtPoisoning, "dtPoisoning"},
|
||||||
{ dtWithering, "dtWithering"},
|
{ dtWithering, "dtWithering"},
|
||||||
@ -350,6 +352,7 @@ eDamageType StringToDamageType(const AString & a_DamageTypeString)
|
|||||||
{ dtCactusContact, "dtCactus"},
|
{ dtCactusContact, "dtCactus"},
|
||||||
{ dtCactusContact, "dtCactuses"},
|
{ dtCactusContact, "dtCactuses"},
|
||||||
{ dtCactusContact, "dtCacti"},
|
{ dtCactusContact, "dtCacti"},
|
||||||
|
{ dtMagmaContact, "dtMagma"},
|
||||||
{ dtLavaContact, "dtLava"},
|
{ dtLavaContact, "dtLava"},
|
||||||
{ dtPoisoning, "dtPoison"},
|
{ dtPoisoning, "dtPoison"},
|
||||||
{ dtWithering, "dtWither"},
|
{ dtWithering, "dtWither"},
|
||||||
|
@ -278,6 +278,7 @@ enum eDamageType
|
|||||||
dtSuffocating, // Suffocating inside a block
|
dtSuffocating, // Suffocating inside a block
|
||||||
dtStarving, // Hunger
|
dtStarving, // Hunger
|
||||||
dtCactusContact, // Contact with a cactus block
|
dtCactusContact, // Contact with a cactus block
|
||||||
|
dtMagmaContact, // Contact with a magma block
|
||||||
dtLavaContact, // Contact with a lava block
|
dtLavaContact, // Contact with a lava block
|
||||||
dtPoisoning, // Having the poison effect
|
dtPoisoning, // Having the poison effect
|
||||||
dtWithering, // Having the wither effect
|
dtWithering, // Having the wither effect
|
||||||
@ -306,6 +307,7 @@ enum eDamageType
|
|||||||
dtCactus = dtCactusContact,
|
dtCactus = dtCactusContact,
|
||||||
dtCactuses = dtCactusContact,
|
dtCactuses = dtCactusContact,
|
||||||
dtCacti = dtCactusContact,
|
dtCacti = dtCactusContact,
|
||||||
|
dtMagma = dtMagmaContact,
|
||||||
dtLava = dtLavaContact,
|
dtLava = dtLavaContact,
|
||||||
dtPoison = dtPoisoning,
|
dtPoison = dtPoisoning,
|
||||||
dtWither = dtWithering,
|
dtWither = dtWithering,
|
||||||
|
@ -147,6 +147,7 @@ bool cEntity::Initialize(OwnedEntity a_Self, cWorld & a_EntityWorld)
|
|||||||
);
|
);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ASSERT(m_World == nullptr);
|
ASSERT(m_World == nullptr);
|
||||||
ASSERT(GetParentChunk() == nullptr);
|
ASSERT(GetParentChunk() == nullptr);
|
||||||
SetWorld(&a_EntityWorld);
|
SetWorld(&a_EntityWorld);
|
||||||
@ -628,6 +629,7 @@ bool cEntity::ArmorCoversAgainst(eDamageType a_DamageType)
|
|||||||
case dtAttack:
|
case dtAttack:
|
||||||
case dtArrowAttack:
|
case dtArrowAttack:
|
||||||
case dtCactusContact:
|
case dtCactusContact:
|
||||||
|
case dtMagmaContact:
|
||||||
case dtLavaContact:
|
case dtLavaContact:
|
||||||
case dtFireContact:
|
case dtFireContact:
|
||||||
case dtExplosion:
|
case dtExplosion:
|
||||||
@ -656,7 +658,7 @@ float cEntity::GetEnchantmentCoverAgainst(const cEntity * a_Attacker, eDamageTyp
|
|||||||
TotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchProtection)) * 1;
|
TotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchProtection)) * 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((a_DamageType == dtBurning) || (a_DamageType == dtFireContact) || (a_DamageType == dtLavaContact))
|
if ((a_DamageType == dtBurning) || (a_DamageType == dtFireContact) || (a_DamageType == dtLavaContact) || (a_DamageType == dtMagmaContact))
|
||||||
{
|
{
|
||||||
TotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchFireProtection)) * 2;
|
TotalEPF += static_cast<int>(Item.m_Enchantments.GetLevel(cEnchantments::enchFireProtection)) * 2;
|
||||||
}
|
}
|
||||||
@ -899,6 +901,23 @@ void cEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
DetectCacti();
|
DetectCacti();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle magma block damage
|
||||||
|
if
|
||||||
|
(
|
||||||
|
IsOnGround() &&
|
||||||
|
(
|
||||||
|
(IsMob() && !static_cast<cPawn *>(this)->IsFireproof()) ||
|
||||||
|
(
|
||||||
|
IsPlayer() && !((static_cast<cPlayer *>(this))->IsGameModeCreative() || (static_cast<cPlayer *>(this))->IsGameModeSpectator())
|
||||||
|
&& !static_cast<cPlayer *>(this)->IsFireproof()
|
||||||
|
&& !static_cast<cPlayer *>(this)->HasEntityEffect(cEntityEffect::effFireResistance)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DetectMagma();
|
||||||
|
}
|
||||||
|
|
||||||
// Handle drowning:
|
// Handle drowning:
|
||||||
if (IsMob() || IsPlayer())
|
if (IsMob() || IsPlayer())
|
||||||
{
|
{
|
||||||
@ -1314,6 +1333,35 @@ void cEntity::DetectCacti(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cEntity::DetectMagma(void)
|
||||||
|
{
|
||||||
|
int MinX = FloorC(GetPosX() - m_Width / 2);
|
||||||
|
int MaxX = FloorC(GetPosX() + m_Width / 2);
|
||||||
|
int MinZ = FloorC(GetPosZ() - m_Width / 2);
|
||||||
|
int MaxZ = FloorC(GetPosZ() + m_Width / 2);
|
||||||
|
int MinY = Clamp(POSY_TOINT - 1, 0, cChunkDef::Height - 1);
|
||||||
|
int MaxY = Clamp(FloorC(GetPosY() + m_Height), 0, cChunkDef::Height - 1);
|
||||||
|
|
||||||
|
for (int x = MinX; x <= MaxX; x++)
|
||||||
|
{
|
||||||
|
for (int z = MinZ; z <= MaxZ; z++)
|
||||||
|
{
|
||||||
|
for (int y = MinY; y <= MaxY; y++)
|
||||||
|
{
|
||||||
|
if (GetWorld()->GetBlock(x, y, z) == E_BLOCK_MAGMA)
|
||||||
|
{
|
||||||
|
TakeDamage(dtMagmaContact, nullptr, 1, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} // for y
|
||||||
|
} // for z
|
||||||
|
} // for x
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cEntity::DetectPortal()
|
bool cEntity::DetectPortal()
|
||||||
{
|
{
|
||||||
// If somebody scheduled a world change, do nothing.
|
// If somebody scheduled a world change, do nothing.
|
||||||
@ -2334,6 +2382,3 @@ float cEntity::GetExplosionExposureRate(Vector3d a_ExplosionPosition, float a_Ex
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -420,6 +420,9 @@ public:
|
|||||||
/** Detects the time for application of cacti damage */
|
/** Detects the time for application of cacti damage */
|
||||||
virtual void DetectCacti(void);
|
virtual void DetectCacti(void);
|
||||||
|
|
||||||
|
/** Detects the time for application of magma block damage */
|
||||||
|
virtual void DetectMagma(void);
|
||||||
|
|
||||||
/** Detects whether we are in a portal block and begins teleportation procedures if so
|
/** Detects whether we are in a portal block and begins teleportation procedures if so
|
||||||
Returns true if MoveToWorld() was called, false if not
|
Returns true if MoveToWorld() was called, false if not
|
||||||
*/
|
*/
|
||||||
|
@ -1194,6 +1194,7 @@ void cPlayer::KilledBy(TakeDamageInfo & a_TDI)
|
|||||||
case dtSuffocating: return GetRandomProvider().RandBool() ? "git merge'd into a block" : "fused with a block";
|
case dtSuffocating: return GetRandomProvider().RandBool() ? "git merge'd into a block" : "fused with a block";
|
||||||
case dtStarving: return "forgot the importance of food";
|
case dtStarving: return "forgot the importance of food";
|
||||||
case dtCactusContact: return "was impaled on a cactus";
|
case dtCactusContact: return "was impaled on a cactus";
|
||||||
|
case dtMagmaContact: return "discovered the floor was lava";
|
||||||
case dtLavaContact: return "was melted by lava";
|
case dtLavaContact: return "was melted by lava";
|
||||||
case dtPoisoning: return "died from septicaemia";
|
case dtPoisoning: return "died from septicaemia";
|
||||||
case dtWithering: return "is a husk of their former selves";
|
case dtWithering: return "is a husk of their former selves";
|
||||||
|
Loading…
Reference in New Issue
Block a user