move more rollback handling to network handlers, out of Player

This commit is contained in:
Dylan K. Taylor 2019-05-20 16:13:14 +01:00
parent 04d0b6c054
commit c21a25efb9
2 changed files with 46 additions and 45 deletions

View File

@ -74,7 +74,6 @@ use pocketmine\inventory\CraftingGrid;
use pocketmine\inventory\Inventory; use pocketmine\inventory\Inventory;
use pocketmine\inventory\PlayerCursorInventory; use pocketmine\inventory\PlayerCursorInventory;
use pocketmine\item\Consumable; use pocketmine\item\Consumable;
use pocketmine\item\Durable;
use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\item\enchantment\EnchantmentInstance;
use pocketmine\item\enchantment\MeleeWeaponEnchantment; use pocketmine\item\enchantment\MeleeWeaponEnchantment;
use pocketmine\item\Item; use pocketmine\item\Item;
@ -1723,15 +1722,13 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
} }
public function equipItem(int $hotbarSlot) : bool{ public function equipItem(int $hotbarSlot) : bool{
if(!$this->inventory->isHotbarSlot($hotbarSlot)){ if(!$this->inventory->isHotbarSlot($hotbarSlot)){ //TODO: exception here?
$this->inventory->sendContents($this);
return false; return false;
} }
$ev = new PlayerItemHeldEvent($this, $this->inventory->getItem($hotbarSlot), $hotbarSlot); $ev = new PlayerItemHeldEvent($this, $this->inventory->getItem($hotbarSlot), $hotbarSlot);
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->inventory->sendHeldItem($this);
return false; return false;
} }
@ -1758,18 +1755,17 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->inventory->sendHeldItem($this);
return false; return false;
} }
$result = $item->onClickAir($this, $directionVector); $result = $item->onClickAir($this, $directionVector);
if($result === ItemUseResult::SUCCESS()){ if($result !== ItemUseResult::SUCCESS()){
$this->resetItemCooldown($item); return false;
if($this->hasFiniteResources()){ }
$this->inventory->setItemInHand($item);
} $this->resetItemCooldown($item);
}elseif($result === ItemUseResult::FAIL()){ if($this->hasFiniteResources()){
$this->inventory->sendHeldItem($this); $this->inventory->setItemInHand($item);
} }
//TODO: check if item has a release action - if it doesn't, this shouldn't be set //TODO: check if item has a release action - if it doesn't, this shouldn't be set
@ -1781,7 +1777,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
/** /**
* Consumes the currently-held item. * Consumes the currently-held item.
* *
* @return bool * @return bool if the consumption succeeded.
*/ */
public function consumeHeldItem() : bool{ public function consumeHeldItem() : bool{
$slot = $this->inventory->getItemInHand(); $slot = $this->inventory->getItemInHand();
@ -1793,8 +1789,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$ev->call(); $ev->call();
if($ev->isCancelled() or !$this->consumeObject($slot)){ if($ev->isCancelled() or !$this->consumeObject($slot)){
$this->inventory->sendContents($this); return false;
return true;
} }
$this->resetItemCooldown($slot); $this->resetItemCooldown($slot);
@ -1818,22 +1813,16 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
*/ */
public function releaseHeldItem() : bool{ public function releaseHeldItem() : bool{
try{ try{
if($this->isUsingItem()){ $item = $this->inventory->getItemInHand();
$item = $this->inventory->getItemInHand(); if(!$this->isUsingItem() or $this->hasItemCooldown($item)){
if($this->hasItemCooldown($item)){ return false;
$this->inventory->sendContents($this); }
return false;
} $result = $item->onReleaseUsing($this);
$result = $item->onReleaseUsing($this); if($result === ItemUseResult::SUCCESS()){
if($result === ItemUseResult::SUCCESS()){ $this->resetItemCooldown($item);
$this->resetItemCooldown($item); $this->inventory->setItemInHand($item);
$this->inventory->setItemInHand($item); return true;
return true;
}
if($result === ItemUseResult::FAIL()){
$this->inventory->sendContents($this);
return true;
}
} }
return false; return false;
@ -1894,7 +1883,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
* @param Vector3 $pos * @param Vector3 $pos
* @param int $face * @param int $face
* *
* @return bool * @return bool if an action took place successfully
*/ */
public function attackBlock(Vector3 $pos, int $face) : bool{ public function attackBlock(Vector3 $pos, int $face) : bool{
if($pos->distanceSquared($this) > 10000){ if($pos->distanceSquared($this) > 10000){
@ -1906,9 +1895,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$ev = new PlayerInteractEvent($this, $this->inventory->getItemInHand(), $target, null, $face, PlayerInteractEvent::LEFT_CLICK_BLOCK); $ev = new PlayerInteractEvent($this, $this->inventory->getItemInHand(), $target, null, $face, PlayerInteractEvent::LEFT_CLICK_BLOCK);
$ev->call(); $ev->call();
if($ev->isCancelled()){ if($ev->isCancelled()){
$this->world->sendBlocks([$this], [$target]); return false;
$this->inventory->sendHeldItem($this);
return true;
} }
if($target->onAttack($this->inventory->getItemInHand(), $face, $this)){ if($target->onAttack($this->inventory->getItemInHand(), $face, $this)){
return true; return true;
@ -2037,9 +2024,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$entity->attack($ev); $entity->attack($ev);
if($ev->isCancelled()){ if($ev->isCancelled()){
if($heldItem instanceof Durable and $this->hasFiniteResources()){
$this->inventory->sendContents($this);
}
return false; return false;
} }

View File

@ -280,7 +280,9 @@ class InGameSessionHandler extends SessionHandler{
} }
return true; return true;
case UseItemTransactionData::ACTION_CLICK_AIR: case UseItemTransactionData::ACTION_CLICK_AIR:
$this->player->useHeldItem(); if(!$this->player->useHeldItem()){
$this->player->getInventory()->sendHeldItem($this->player);
}
return true; return true;
} }
@ -315,12 +317,17 @@ class InGameSessionHandler extends SessionHandler{
return false; return false;
} }
//TODO: use transactiondata for rollbacks here
switch($data->getActionType()){ switch($data->getActionType()){
case UseItemOnEntityTransactionData::ACTION_INTERACT: case UseItemOnEntityTransactionData::ACTION_INTERACT:
$this->player->interactEntity($target, $data->getClickPos()); if(!$this->player->interactEntity($target, $data->getClickPos())){
$this->player->getInventory()->sendHeldItem($this->player);
}
return true; return true;
case UseItemOnEntityTransactionData::ACTION_ATTACK: case UseItemOnEntityTransactionData::ACTION_ATTACK:
$this->player->attackEntity($target); if(!$this->player->attackEntity($target)){
$this->player->getInventory()->sendHeldItem($this->player);
}
return true; return true;
} }
@ -328,12 +335,17 @@ class InGameSessionHandler extends SessionHandler{
} }
private function handleReleaseItemTransaction(ReleaseItemTransactionData $data) : bool{ private function handleReleaseItemTransaction(ReleaseItemTransactionData $data) : bool{
//TODO: use transactiondata for rollbacks here (resending entire inventory is very wasteful)
switch($data->getActionType()){ switch($data->getActionType()){
case ReleaseItemTransactionData::ACTION_RELEASE: case ReleaseItemTransactionData::ACTION_RELEASE:
$this->player->releaseHeldItem(); if(!$this->player->releaseHeldItem()){
$this->player->getInventory()->sendContents($this->player);
}
return true; return true;
case ReleaseItemTransactionData::ACTION_CONSUME: case ReleaseItemTransactionData::ACTION_CONSUME:
$this->player->consumeHeldItem(); if(!$this->player->consumeHeldItem()){
$this->player->getInventory()->sendHeldItem($this->player);
}
return true; return true;
} }
@ -341,7 +353,10 @@ class InGameSessionHandler extends SessionHandler{
} }
public function handleMobEquipment(MobEquipmentPacket $packet) : bool{ public function handleMobEquipment(MobEquipmentPacket $packet) : bool{
return $this->player->equipItem($packet->hotbarSlot); if(!$this->player->equipItem($packet->hotbarSlot)){
$this->player->getInventory()->sendHeldItem($this->player);
}
return true;
} }
public function handleMobArmorEquipment(MobArmorEquipmentPacket $packet) : bool{ public function handleMobArmorEquipment(MobArmorEquipmentPacket $packet) : bool{
@ -373,7 +388,9 @@ class InGameSessionHandler extends SessionHandler{
switch($packet->action){ switch($packet->action){
case PlayerActionPacket::ACTION_START_BREAK: case PlayerActionPacket::ACTION_START_BREAK:
$this->player->attackBlock($pos, $packet->face); if(!$this->player->attackBlock($pos, $packet->face)){
$this->onFailedBlockAction($pos, $packet->face);
}
break; break;