1
0

Monster: added IsUndead(), undead-specific entity effects

This commit is contained in:
archshift
2014-06-08 18:44:20 -07:00
parent 52abd90a28
commit 2574573c88
3 changed files with 71 additions and 6 deletions

View File

@@ -435,6 +435,52 @@ void cMonster::HandleFalling()
void cMonster::HandleEntityEffects(cEntityEffect::eType a_EffectType, cEntityEffect a_Effect)
{
switch (a_EffectType)
{
case cEntityEffect::effPoison:
{
// Default effect for non-undead mobs and non-spiders
if (!IsUndead() && GetMobType() != mtSpider) break;
return; // No effect
}
case cEntityEffect::effRegeneration:
{
// Default effect for non-undead mobs
if (!IsUndead() && GetMobType()) break;
return; // No effect
}
case cEntityEffect::effInstantDamage:
{
// Default effect for non-undead mobs
if (!IsUndead() && GetMobType()) break;
// Undead mobs are healed by instant damage
// Base heal = 6, doubles for every increase in intensity
Heal(6 * std::pow(2, a_Effect.GetIntensity()) * a_Effect.GetDistanceModifier());
return;
}
case cEntityEffect::effInstantHealth:
{
// Default effect for non-undead mobs
if (!IsUndead() && GetMobType()) break;
// Undead mobs are damaged by instant health
// Base damage = 6, doubles for every increase in intensity
int damage = 6 * std::pow(2, a_Effect.GetIntensity());
TakeDamage(dtPotionOfHarming, a_Effect.GetUser(), damage * a_Effect.GetDistanceModifier(), 0);
return;
}
}
super::HandleEntityEffects(a_EffectType, a_Effect);
}
int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
{
int PosY = POSY_TOINT;
@@ -706,6 +752,25 @@ void cMonster::GetMonsterConfig(const AString & a_Name)
bool cMonster::IsUndead(void)
{
switch (GetMobType())
{
case mtZombie:
case mtZombiePigman:
case mtSkeleton:
case mtWither:
{
return true;
}
}
return false;
}
AString cMonster::MobTypeToString(cMonster::eType a_MobType)
{
// Mob types aren't sorted, so we need to search linearly: