mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-09 15:29:47 +00:00
move more rollback handling to network handlers, out of Player
This commit is contained in:
parent
04d0b6c054
commit
c21a25efb9
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user