mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-09 05:08:36 +00:00
ItemStackRequestExecutor: allow any action to take from the created output slot
fixes #5679
This commit is contained in:
parent
6e8eda4ac1
commit
4bb8daa1a5
@ -147,6 +147,11 @@ class ItemStackRequestExecutor{
|
|||||||
* @throws ItemStackRequestProcessException
|
* @throws ItemStackRequestProcessException
|
||||||
*/
|
*/
|
||||||
protected function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{
|
protected function removeItemFromSlot(ItemStackRequestSlotInfo $slotInfo, int $count) : Item{
|
||||||
|
if($slotInfo->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $slotInfo->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){
|
||||||
|
//special case for the "created item" output slot
|
||||||
|
//TODO: do we need to send a response for this slot info?
|
||||||
|
return $this->takeCreatedItem($count);
|
||||||
|
}
|
||||||
$this->requestSlotInfos[] = $slotInfo;
|
$this->requestSlotInfos[] = $slotInfo;
|
||||||
[$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo);
|
[$inventory, $slot] = $this->getBuilderInventoryAndSlot($slotInfo);
|
||||||
if($count < 1){
|
if($count < 1){
|
||||||
@ -188,6 +193,13 @@ class ItemStackRequestExecutor{
|
|||||||
$inventory->setItem($slot, $newItem);
|
$inventory->setItem($slot, $newItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function dropItem(Item $item, int $count) : void{
|
||||||
|
if($count < 1){
|
||||||
|
throw new ItemStackRequestProcessException("Cannot drop less than 1 of an item");
|
||||||
|
}
|
||||||
|
$this->builder->addAction(new DropItemAction((clone $item)->setCount($count)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws ItemStackRequestProcessException
|
* @throws ItemStackRequestProcessException
|
||||||
*/
|
*/
|
||||||
@ -254,7 +266,7 @@ class ItemStackRequestExecutor{
|
|||||||
/**
|
/**
|
||||||
* @throws ItemStackRequestProcessException
|
* @throws ItemStackRequestProcessException
|
||||||
*/
|
*/
|
||||||
protected function takeCreatedItem(ItemStackRequestSlotInfo $destination, int $count) : void{
|
protected function takeCreatedItem(int $count) : Item{
|
||||||
if($count < 1){
|
if($count < 1){
|
||||||
//this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits
|
//this should be impossible at the protocol level, but in case of buggy core code this will prevent exploits
|
||||||
throw new ItemStackRequestProcessException("Cannot take less than 1 created item");
|
throw new ItemStackRequestProcessException("Cannot take less than 1 created item");
|
||||||
@ -272,10 +284,12 @@ class ItemStackRequestExecutor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->createdItemsTakenCount += $count;
|
$this->createdItemsTakenCount += $count;
|
||||||
$this->addItemToSlot($destination, $createdItem, $count);
|
$createdItem = clone $createdItem;
|
||||||
|
$createdItem->setCount($count);
|
||||||
if(!$this->createdItemFromCreativeInventory && $this->createdItemsTakenCount >= $createdItem->getCount()){
|
if(!$this->createdItemFromCreativeInventory && $this->createdItemsTakenCount >= $createdItem->getCount()){
|
||||||
$this->setNextCreatedItem(null);
|
$this->setNextCreatedItem(null);
|
||||||
}
|
}
|
||||||
|
return $createdItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -299,14 +313,7 @@ class ItemStackRequestExecutor{
|
|||||||
$action instanceof TakeStackRequestAction ||
|
$action instanceof TakeStackRequestAction ||
|
||||||
$action instanceof PlaceStackRequestAction
|
$action instanceof PlaceStackRequestAction
|
||||||
){
|
){
|
||||||
$source = $action->getSource();
|
$this->transferItems($action->getSource(), $action->getDestination(), $action->getCount());
|
||||||
$destination = $action->getDestination();
|
|
||||||
|
|
||||||
if($source->getContainerId() === ContainerUIIds::CREATED_OUTPUT && $source->getSlotId() === UIInventorySlotOffset::CREATED_ITEM_OUTPUT){
|
|
||||||
$this->takeCreatedItem($destination, $action->getCount());
|
|
||||||
}else{
|
|
||||||
$this->transferItems($source, $destination, $action->getCount());
|
|
||||||
}
|
|
||||||
}elseif($action instanceof SwapStackRequestAction){
|
}elseif($action instanceof SwapStackRequestAction){
|
||||||
$this->requestSlotInfos[] = $action->getSlot1();
|
$this->requestSlotInfos[] = $action->getSlot1();
|
||||||
$this->requestSlotInfos[] = $action->getSlot2();
|
$this->requestSlotInfos[] = $action->getSlot2();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user