mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-16 00:15:35 +00:00
Minor cleanup to attack handler
This commit is contained in:
parent
cd44551d64
commit
bdfd9c95dd
@ -2389,63 +2389,65 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
case InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT:
|
case InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT:
|
||||||
break; //TODO
|
break; //TODO
|
||||||
case InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_ATTACK:
|
case InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_ATTACK:
|
||||||
|
if(!$target->isAlive()){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if($target instanceof DroppedItem or $target instanceof Arrow){
|
||||||
|
$this->kick("Attempting to attack an invalid entity");
|
||||||
|
$this->server->getLogger()->warning($this->getServer()->getLanguage()->translateString("pocketmine.player.invalidEntity", [$this->getName()]));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
$cancelled = false;
|
$cancelled = false;
|
||||||
if($target instanceof Player and $this->server->getConfigBoolean("pvp", true) === false){
|
if($target instanceof Player and $this->server->getConfigBoolean("pvp", true) === false){
|
||||||
$cancelled = true;
|
$cancelled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($target->isAlive()){
|
$heldItem = $this->inventory->getItemInHand();
|
||||||
if($target instanceof DroppedItem or $target instanceof Arrow){
|
|
||||||
$this->kick("Attempting to attack an invalid entity");
|
|
||||||
$this->server->getLogger()->warning($this->getServer()->getLanguage()->translateString("pocketmine.player.invalidEntity", [$this->getName()]));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$heldItem = $this->inventory->getItemInHand();
|
$damage = [
|
||||||
|
EntityDamageEvent::MODIFIER_BASE => $heldItem->getAttackPoints()
|
||||||
|
];
|
||||||
|
|
||||||
$damage = [
|
if(!$this->canInteract($target, 8)){
|
||||||
EntityDamageEvent::MODIFIER_BASE => $heldItem->getAttackPoints()
|
$cancelled = true;
|
||||||
];
|
}elseif($target instanceof Player){
|
||||||
|
if(($target->getGamemode() & 0x01) > 0){
|
||||||
if(!$this->canInteract($target, 8)){
|
|
||||||
$cancelled = true;
|
|
||||||
}elseif($target instanceof Player){
|
|
||||||
if(($target->getGamemode() & 0x01) > 0){
|
|
||||||
return true;
|
|
||||||
}elseif($this->server->getConfigBoolean("pvp") !== true){
|
|
||||||
$cancelled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$points = 0;
|
|
||||||
foreach($target->getInventory()->getArmorContents() as $armorItem){
|
|
||||||
$points += $armorItem->getDefensePoints();
|
|
||||||
}
|
|
||||||
|
|
||||||
$damage[EntityDamageEvent::MODIFIER_ARMOR] = -($damage[EntityDamageEvent::MODIFIER_BASE] * $points * 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
$ev = new EntityDamageByEntityEvent($this, $target, EntityDamageEvent::CAUSE_ENTITY_ATTACK, $damage);
|
|
||||||
if($cancelled){
|
|
||||||
$ev->setCancelled();
|
|
||||||
}
|
|
||||||
|
|
||||||
$target->attack($ev);
|
|
||||||
|
|
||||||
if($ev->isCancelled()){
|
|
||||||
if($heldItem->isTool() and $this->isSurvival()){
|
|
||||||
$this->inventory->sendContents($this);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
|
}elseif($this->server->getConfigBoolean("pvp") !== true){
|
||||||
|
$cancelled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->isSurvival()){
|
$points = 0;
|
||||||
if($heldItem->useOn($target)){
|
foreach($target->getInventory()->getArmorContents() as $armorItem){
|
||||||
$this->inventory->setItemInHand($heldItem);
|
$points += $armorItem->getDefensePoints();
|
||||||
}
|
|
||||||
|
|
||||||
$this->exhaust(0.3, PlayerExhaustEvent::CAUSE_ATTACK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$damage[EntityDamageEvent::MODIFIER_ARMOR] = -($damage[EntityDamageEvent::MODIFIER_BASE] * $points * 0.04);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$ev = new EntityDamageByEntityEvent($this, $target, EntityDamageEvent::CAUSE_ENTITY_ATTACK, $damage);
|
||||||
|
if($cancelled){
|
||||||
|
$ev->setCancelled();
|
||||||
|
}
|
||||||
|
|
||||||
|
$target->attack($ev);
|
||||||
|
|
||||||
|
if($ev->isCancelled()){
|
||||||
|
if($heldItem->isTool() and $this->isSurvival()){
|
||||||
|
$this->inventory->sendContents($this);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->isSurvival()){
|
||||||
|
if($heldItem->useOn($target)){
|
||||||
|
$this->inventory->setItemInHand($heldItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->exhaust(0.3, PlayerExhaustEvent::CAUSE_ATTACK);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
break; //unknown
|
break; //unknown
|
||||||
|
Loading…
x
Reference in New Issue
Block a user