diff options
Diffstat (limited to 'src/Entities/Entity.cpp')
-rw-r--r-- | src/Entities/Entity.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 5c79e58d1..a3388a18f 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -2285,3 +2285,103 @@ void cEntity::BroadcastLeashedMobs() } } } + + + + + +void cEntity::BroadcastDeathMessage(TakeDamageInfo & a_TDI) +{ + cPluginManager * PluginManager = cRoot::Get()->GetPluginManager(); + + AString Name; + if (IsPlayer()) + { + cPlayer * Player = static_cast<cPlayer *>(this); + Name = Player->GetName(); + } + else if (IsMob()) + { + cMonster * Monster = static_cast<cMonster *>(this); + if (Monster->HasCustomName()) + { + Name = Monster->GetCustomName(); + } + else + { + // Tamed ocelots are really cats in vanilla. + if (Monster->IsTame() && (Monster->GetClass() == AString("cOcelot"))) + { + Name = "Cat"; + } + else + { + Name = Monster->GetClass(); + Name.erase(Name.begin()); // Erase the 'c' of the class (e.g. "cWitch" -> "Witch") + } + } + } + else + { + // If the entity is neither a player nor a mob, we should quit. + return; + } + + if (a_TDI.Attacker == nullptr) + { + const AString DamageText = [&] + { + switch (a_TDI.DamageType) + { + case dtRangedAttack: return "was shot"; + case dtLightning: return "was plasmified by lightining"; + case dtFalling: return GetRandomProvider().RandBool() ? "fell to death" : "hit the ground too hard"; + case dtDrowning: return "drowned"; + case dtSuffocating: return GetRandomProvider().RandBool() ? "git merge'd into a block" : "fused with a block"; + case dtStarving: return "forgot the importance of food"; + case dtCactusContact: return "was impaled on a cactus"; + case dtMagmaContact: return "discovered the floor was lava"; + case dtLavaContact: return "was melted by lava"; + case dtPoisoning: return "died from septicaemia"; + case dtWithering: return "is a husk of their former selves"; + case dtOnFire: return "forgot to stop, drop, and roll"; + case dtFireContact: return "burnt themselves to death"; + case dtInVoid: return "somehow fell out of the world"; + case dtPotionOfHarming: return "was magicked to death"; + case dtEnderPearl: return "misused an ender pearl"; + case dtAdmin: return "was administrator'd"; + case dtExplosion: return "blew up"; + case dtAttack: return "was attacked by thin air"; + case dtEnvironment: return "played too much dress up"; // This is not vanilla - added a own pun + } + UNREACHABLE("Unsupported damage type"); + }(); + AString DeathMessage = Printf("%s %s", Name.c_str(), DamageText.c_str()); + PluginManager->CallHookKilled(*this, a_TDI, DeathMessage); + if (DeathMessage != AString("")) + { + GetWorld()->BroadcastChatDeath(DeathMessage); + } + } + else if (a_TDI.Attacker->IsPlayer()) + { + cPlayer * Killer = static_cast<cPlayer *>(a_TDI.Attacker); + AString DeathMessage = Printf("%s was killed by %s", Name.c_str(), Killer->GetName().c_str()); + PluginManager->CallHookKilled(*this, a_TDI, DeathMessage); + if (DeathMessage != AString("")) + { + GetWorld()->BroadcastChatDeath(DeathMessage); + } + } + else + { + AString KillerClass = a_TDI.Attacker->GetClass(); + KillerClass.erase(KillerClass.begin()); // Erase the 'c' of the class (e.g. "cWitch" -> "Witch") + AString DeathMessage = Printf("%s was killed by a %s", Name.c_str(), KillerClass.c_str()); + PluginManager->CallHookKilled(*this, a_TDI, DeathMessage); + if (DeathMessage != AString("")) + { + GetWorld()->BroadcastChatDeath(DeathMessage); + } + } +} |