aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/DamageSource.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/DamageSource.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/DamageSource.cpp')
-rw-r--r--Minecraft.World/DamageSource.cpp180
1 files changed, 180 insertions, 0 deletions
diff --git a/Minecraft.World/DamageSource.cpp b/Minecraft.World/DamageSource.cpp
new file mode 100644
index 00000000..29ea727e
--- /dev/null
+++ b/Minecraft.World/DamageSource.cpp
@@ -0,0 +1,180 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.h"
+#include "net.minecraft.world.entity.player.h"
+#include "net.minecraft.world.entity.projectile.h"
+#include "net.minecraft.world.damagesource.h"
+#include "net.minecraft.world.food.h"
+#include "net.minecraft.network.packet.h"
+
+DamageSource *DamageSource::inFire = (new DamageSource(ChatPacket::e_ChatDeathInFire))->setIsFire();
+DamageSource *DamageSource::onFire = (new DamageSource(ChatPacket::e_ChatDeathOnFire))->bypassArmor()->setIsFire();
+DamageSource *DamageSource::lava = (new DamageSource(ChatPacket::e_ChatDeathLava))->setIsFire();
+DamageSource *DamageSource::inWall = (new DamageSource(ChatPacket::e_ChatDeathInWall))->bypassArmor();
+DamageSource *DamageSource::drown = (new DamageSource(ChatPacket::e_ChatDeathDrown))->bypassArmor();
+DamageSource *DamageSource::starve = (new DamageSource(ChatPacket::e_ChatDeathStarve))->bypassArmor();
+DamageSource *DamageSource::cactus = new DamageSource(ChatPacket::e_ChatDeathCactus);
+DamageSource *DamageSource::fall = (new DamageSource(ChatPacket::e_ChatDeathFall))->bypassArmor();
+DamageSource *DamageSource::outOfWorld = (new DamageSource(ChatPacket::e_ChatDeathOutOfWorld))->bypassArmor()->bypassInvul();
+DamageSource *DamageSource::genericSource = (new DamageSource(ChatPacket::e_ChatDeathGeneric))->bypassArmor();
+DamageSource *DamageSource::explosion = (new DamageSource(ChatPacket::e_ChatDeathExplosion))->setScalesWithDifficulty();
+DamageSource *DamageSource::controlledExplosion = (new DamageSource(ChatPacket::e_ChatDeathExplosion));
+DamageSource *DamageSource::magic = (new DamageSource(ChatPacket::e_ChatDeathMagic))->bypassArmor()->setMagic();
+DamageSource *DamageSource::dragonbreath = (new DamageSource(ChatPacket::e_ChatDeathDragonBreath))->bypassArmor();
+DamageSource *DamageSource::wither = (new DamageSource(ChatPacket::e_ChatDeathWither))->bypassArmor();
+DamageSource *DamageSource::anvil = (new DamageSource(ChatPacket::e_ChatDeathAnvil));
+DamageSource *DamageSource::fallingBlock = (new DamageSource(ChatPacket::e_ChatDeathFallingBlock));
+
+DamageSource *DamageSource::mobAttack(shared_ptr<Mob> mob)
+{
+ return new EntityDamageSource(ChatPacket::e_ChatDeathMob, mob);
+}
+
+DamageSource *DamageSource::playerAttack(shared_ptr<Player> player)
+{
+ return new EntityDamageSource(ChatPacket::e_ChatDeathPlayer, player);
+}
+
+DamageSource *DamageSource::arrow(shared_ptr<Arrow> arrow, shared_ptr<Entity> owner)
+{
+ return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathArrow, arrow, owner))->setProjectile();
+}
+
+DamageSource *DamageSource::fireball(shared_ptr<Fireball> fireball, shared_ptr<Entity> owner)
+{
+ if (owner == NULL)
+ {
+ return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathOnFire, fireball, fireball))->setIsFire()->setProjectile();
+ }
+ return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathFireball, fireball, owner))->setIsFire()->setProjectile();
+}
+
+DamageSource *DamageSource::thrown(shared_ptr<Entity> entity, shared_ptr<Entity> owner)
+{
+ return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathThrown, entity, owner))->setProjectile();
+}
+
+DamageSource *DamageSource::indirectMagic(shared_ptr<Entity> entity, shared_ptr<Entity> owner)
+{
+ return (new IndirectEntityDamageSource(ChatPacket::e_ChatDeathIndirectMagic, entity, owner) )->bypassArmor()->setMagic();;
+}
+
+DamageSource *DamageSource::thorns(shared_ptr<Entity> source)
+{
+ return (new EntityDamageSource(ChatPacket::e_ChatDeathThorns, source))->setMagic();
+}
+
+bool DamageSource::isProjectile()
+{
+ return _isProjectile;
+}
+
+DamageSource *DamageSource::setProjectile()
+{
+ this->_isProjectile = true;
+ return this;
+}
+
+bool DamageSource::isBypassArmor()
+{
+ return _bypassArmor;
+}
+
+float DamageSource::getFoodExhaustion()
+{
+ return exhaustion;
+}
+
+bool DamageSource::isBypassInvul()
+{
+ return _bypassInvul;
+}
+
+
+//DamageSource::DamageSource(const wstring &msgId)
+DamageSource::DamageSource(ChatPacket::EChatPacketMessage msgId)
+{
+ // 4J added initialisors
+ _bypassArmor = false;
+ _bypassInvul = false;
+ // food exhastion caused by being damaged by this source
+ exhaustion = FoodConstants::EXHAUSTION_ATTACK;
+ isFireSource = false;
+ _isProjectile = false;
+ _isMagic = false;
+
+ //this->msgId = msgId;
+ m_msgId = msgId;
+}
+
+shared_ptr<Entity> DamageSource::getDirectEntity()
+{
+ return getEntity();
+}
+
+shared_ptr<Entity> DamageSource::getEntity()
+{
+ return shared_ptr<Entity>();
+}
+
+DamageSource *DamageSource::bypassArmor()
+{
+ _bypassArmor = true;
+ // these kinds of damages don't cause the player to grow more hungry
+ exhaustion = 0;
+ return this;
+}
+
+DamageSource *DamageSource::bypassInvul()
+{
+ _bypassInvul = true;
+ return this;
+}
+
+DamageSource *DamageSource::setIsFire()
+{
+ isFireSource = true;
+ return this;
+}
+
+DamageSource *DamageSource::setScalesWithDifficulty()
+{
+ _scalesWithDifficulty = true;
+ return this;
+}
+
+bool DamageSource::scalesWithDifficulty()
+{
+ return _scalesWithDifficulty;
+}
+
+bool DamageSource::isMagic()
+{
+ return _isMagic;
+}
+
+DamageSource *DamageSource::setMagic()
+{
+ _isMagic = true;
+ return this;
+}
+
+//wstring DamageSource::getLocalizedDeathMessage(shared_ptr<Player> player)
+//{
+// return L"death." + msgId + player->name;
+// //return I18n.get(L"death." + msgId, player.name);
+//}
+
+shared_ptr<ChatPacket> DamageSource::getDeathMessagePacket(shared_ptr<Player> player)
+{
+ return shared_ptr<ChatPacket>( new ChatPacket(player->name, m_msgId ) );
+}
+
+bool DamageSource::isFire()
+{
+ return isFireSource;
+}
+
+ChatPacket::EChatPacketMessage DamageSource::getMsgId()
+{
+ return m_msgId;
+} \ No newline at end of file