From ad8d67137e52b3bb963f2b5242d8dec8912dc43a Mon Sep 17 00:00:00 2001 From: Encritary Date: Mon, 19 Feb 2018 15:14:32 +0500 Subject: [PATCH] Implemented critical hits (#1929) --- src/pocketmine/Player.php | 14 ++++++++++++++ src/pocketmine/event/entity/EntityDamageEvent.php | 1 + 2 files changed, 15 insertions(+) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 9ecc0f6cc..7a51f1196 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2411,6 +2411,10 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $ev->setCancelled(); } + if(!$this->isSprinting() and !$this->isFlying() and $this->fallDistance > 0 and !$this->hasEffect(Effect::BLINDNESS) and !$this->isInsideOfWater()){ + $ev->setDamage($ev->getFinalDamage() / 2, EntityDamageEvent::MODIFIER_CRITICAL); + } + $target->attack($ev); if($ev->isCancelled()){ @@ -2420,6 +2424,16 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return true; } + if($ev->getDamage(EntityDamageEvent::MODIFIER_CRITICAL) > 0){ + $pk = new AnimatePacket(); + $pk->action = AnimatePacket::ACTION_CRITICAL_HIT; + $pk->entityRuntimeId = $target->getId(); + $this->server->broadcastPacket($target->getViewers(), $pk); + if($target instanceof Player){ + $target->dataPacket($pk); + } + } + if($this->isSurvival()){ if($heldItem->useOn($target)){ $this->inventory->setItemInHand($heldItem); diff --git a/src/pocketmine/event/entity/EntityDamageEvent.php b/src/pocketmine/event/entity/EntityDamageEvent.php index 6baf640a0..8d28b7ba5 100644 --- a/src/pocketmine/event/entity/EntityDamageEvent.php +++ b/src/pocketmine/event/entity/EntityDamageEvent.php @@ -39,6 +39,7 @@ class EntityDamageEvent extends EntityEvent implements Cancellable{ public const MODIFIER_RESISTANCE = 4; public const MODIFIER_ABSORPTION = 5; public const MODIFIER_ARMOR_ENCHANTMENTS = 6; + public const MODIFIER_CRITICAL = 7; public const CAUSE_CONTACT = 0; public const CAUSE_ENTITY_ATTACK = 1;