mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-26 04:43:45 +00:00
Added InventoryAction->onPreExecute(), fixed PlayerDropItemEvent deleting items
This commit is contained in:
parent
0262465a26
commit
55720d9f0a
@ -49,7 +49,6 @@ use pocketmine\event\player\PlayerBedLeaveEvent;
|
|||||||
use pocketmine\event\player\PlayerChatEvent;
|
use pocketmine\event\player\PlayerChatEvent;
|
||||||
use pocketmine\event\player\PlayerCommandPreprocessEvent;
|
use pocketmine\event\player\PlayerCommandPreprocessEvent;
|
||||||
use pocketmine\event\player\PlayerDeathEvent;
|
use pocketmine\event\player\PlayerDeathEvent;
|
||||||
use pocketmine\event\player\PlayerDropItemEvent;
|
|
||||||
use pocketmine\event\player\PlayerExhaustEvent;
|
use pocketmine\event\player\PlayerExhaustEvent;
|
||||||
use pocketmine\event\player\PlayerGameModeChangeEvent;
|
use pocketmine\event\player\PlayerGameModeChangeEvent;
|
||||||
use pocketmine\event\player\PlayerInteractEvent;
|
use pocketmine\event\player\PlayerInteractEvent;
|
||||||
@ -2723,11 +2722,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->server->getPluginManager()->callEvent($ev = new PlayerDropItemEvent($this, $item));
|
|
||||||
if($ev->isCancelled()){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$motion = $this->getDirectionVector()->multiply(0.4);
|
$motion = $this->getDirectionVector()->multiply(0.4);
|
||||||
|
|
||||||
$this->level->dropItem($this->add(0, 1.3, 0), $item, $motion, 40);
|
$this->level->dropItem($this->add(0, 1.3, 0), $item, $motion, 40);
|
||||||
|
@ -222,6 +222,12 @@ class SimpleInventoryTransaction implements InventoryTransaction{
|
|||||||
return $this->matchItems($needItems, $haveItems) and count($this->actions) > 0 and count($haveItems) === 0 and count($needItems) === 0;
|
return $this->matchItems($needItems, $haveItems) and count($this->actions) > 0 and count($haveItems) === 0 and count($needItems) === 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function handleFailed(){
|
||||||
|
foreach($this->actions as $action){
|
||||||
|
$action->onExecuteFail($this->source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@ -232,7 +238,15 @@ class SimpleInventoryTransaction implements InventoryTransaction{
|
|||||||
|
|
||||||
Server::getInstance()->getPluginManager()->callEvent($ev = new InventoryTransactionEvent($this));
|
Server::getInstance()->getPluginManager()->callEvent($ev = new InventoryTransactionEvent($this));
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled()){
|
||||||
return false;
|
$this->handleFailed();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($this->actions as $action){
|
||||||
|
if(!$action->onPreExecute($this->source)){
|
||||||
|
$this->handleFailed();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($this->actions as $action){
|
foreach($this->actions as $action){
|
||||||
|
@ -23,6 +23,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace pocketmine\inventory\transaction\action;
|
namespace pocketmine\inventory\transaction\action;
|
||||||
|
|
||||||
|
use pocketmine\event\player\PlayerDropItemEvent;
|
||||||
use pocketmine\Player;
|
use pocketmine\Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,6 +42,15 @@ class DropItemAction extends InventoryAction{
|
|||||||
return $this->sourceItem->isNull();
|
return $this->sourceItem->isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onPreExecute(Player $source) : bool{
|
||||||
|
$source->getServer()->getPluginManager()->callEvent($ev = new PlayerDropItemEvent($source, $this->targetItem));
|
||||||
|
if($ev->isCancelled()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Drops the target item in front of the player.
|
* Drops the target item in front of the player.
|
||||||
*
|
*
|
||||||
|
@ -74,6 +74,18 @@ abstract class InventoryAction{
|
|||||||
*/
|
*/
|
||||||
abstract public function isValid(Player $source) : bool;
|
abstract public function isValid(Player $source) : bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by inventory transactions before any actions are processed. If this returns false, the transaction will
|
||||||
|
* be cancelled.
|
||||||
|
*
|
||||||
|
* @param Player $source
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function onPreExecute(Player $source) : bool{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs actions needed to complete the inventory-action server-side. Returns if it was successful. Will return
|
* Performs actions needed to complete the inventory-action server-side. Returns if it was successful. Will return
|
||||||
* false if plugins cancelled events. This will only be called if the transaction which it is part of is considered
|
* false if plugins cancelled events. This will only be called if the transaction which it is part of is considered
|
||||||
|
Loading…
x
Reference in New Issue
Block a user