mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-12 00:39:45 +00:00
commit
d53b84386f
@ -80,7 +80,6 @@ use pocketmine\item\Consumable;
|
||||
use pocketmine\item\Durable;
|
||||
use pocketmine\item\enchantment\EnchantmentInstance;
|
||||
use pocketmine\item\enchantment\MeleeWeaponEnchantment;
|
||||
use pocketmine\item\Food;
|
||||
use pocketmine\item\Item;
|
||||
use pocketmine\item\WritableBook;
|
||||
use pocketmine\item\WrittenBook;
|
||||
@ -99,7 +98,6 @@ use pocketmine\nbt\tag\ByteTag;
|
||||
use pocketmine\nbt\tag\CompoundTag;
|
||||
use pocketmine\nbt\tag\DoubleTag;
|
||||
use pocketmine\nbt\tag\ListTag;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\network\mcpe\PlayerNetworkSessionAdapter;
|
||||
use pocketmine\network\mcpe\protocol\ActorEventPacket;
|
||||
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
|
||||
@ -838,10 +836,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
* Plugin developers should not use this, use setSkin() and sendSkin() instead.
|
||||
*
|
||||
* @param Skin $skin
|
||||
* @param string $newSkinName
|
||||
* @param string $oldSkinName
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function changeSkin(Skin $skin) : bool{
|
||||
public function changeSkin(Skin $skin, string $newSkinName, string $oldSkinName) : bool{
|
||||
if(!$skin->isValid()){
|
||||
return false;
|
||||
}
|
||||
@ -1114,13 +1114,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
}
|
||||
}
|
||||
|
||||
protected function sendCompletedUsingItemPacket(int $itemId, int $action){
|
||||
$pk = new CompletedUsingItemPacket();
|
||||
$pk->itemId = $itemId;
|
||||
$pk->action = $action;
|
||||
$this->sendDataPacket($pk);
|
||||
}
|
||||
|
||||
protected function sendRespawnPacket(Vector3 $pos, int $respawnState = RespawnPacket::SEARCHING_FOR_SPAWN){
|
||||
$pk = new RespawnPacket();
|
||||
$pk->position = $pos->add(0, $this->baseOffset, 0);
|
||||
@ -2512,6 +2505,27 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
|
||||
return true;
|
||||
case InventoryTransactionPacket::USE_ITEM_ACTION_CLICK_AIR:
|
||||
if($this->isUsingItem()){
|
||||
$slot = $this->inventory->getItemInHand();
|
||||
if($slot instanceof Consumable){
|
||||
$ev = new PlayerItemConsumeEvent($this, $slot);
|
||||
if($this->hasItemCooldown($slot)){
|
||||
$ev->setCancelled();
|
||||
}
|
||||
$ev->call();
|
||||
if($ev->isCancelled() or !$this->consumeObject($slot)){
|
||||
$this->inventory->sendContents($this);
|
||||
return true;
|
||||
}
|
||||
$this->resetItemCooldown($slot);
|
||||
if($this->isSurvival()){
|
||||
$slot->pop();
|
||||
$this->inventory->setItemInHand($slot);
|
||||
$this->inventory->addItem($slot->getResidue());
|
||||
}
|
||||
$this->setUsingItem(false);
|
||||
}
|
||||
}
|
||||
$directionVector = $this->getDirectionVector();
|
||||
|
||||
if($this->isCreative()){
|
||||
@ -2541,15 +2555,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
}
|
||||
}
|
||||
|
||||
if(!$this->isUsingItem()){
|
||||
$this->setUsingItem(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->setUsingItem(false);
|
||||
if($item->onUse($this)){
|
||||
$this->sendCompletedUsingItemPacket($item->getId(), $item->getCompletedAction());
|
||||
}
|
||||
$this->setUsingItem(true);
|
||||
|
||||
return true;
|
||||
default:
|
||||
@ -2667,15 +2673,12 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
if($item->onReleaseUsing($this)){
|
||||
$this->resetItemCooldown($item);
|
||||
$this->inventory->setItemInHand($item);
|
||||
$this->sendCompletedUsingItemPacket($item->getId(), $item->getCompletedAction());
|
||||
}
|
||||
}else{
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
case InventoryTransactionPacket::RELEASE_ITEM_ACTION_CONSUME:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -2718,7 +2721,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
if(!$this->spawned or !$this->isAlive()){
|
||||
return true;
|
||||
}
|
||||
|
||||
if($packet->action === InteractPacket::ACTION_MOUSEOVER and $packet->target === 0){
|
||||
//TODO HACK: silence useless spam (MCPE 1.8)
|
||||
//this packet is EXPECTED to only be sent when interacting with an entity, but due to some messy Mojang
|
||||
@ -3822,6 +3824,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
|
||||
$this->addWindow($this->cursorInventory, ContainerIds::UI, true);
|
||||
|
||||
$this->craftingGrid = new CraftingGrid($this, CraftingGrid::SIZE_SMALL);
|
||||
|
||||
//TODO: more windows
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,6 @@ class CraftingGrid extends BaseInventory{
|
||||
public $offset;
|
||||
/** @var Player */
|
||||
protected $holder;
|
||||
|
||||
/** @var int */
|
||||
private $gridWidth;
|
||||
|
||||
|
@ -29,7 +29,6 @@ use pocketmine\entity\projectile\Projectile;
|
||||
use pocketmine\event\entity\EntityShootBowEvent;
|
||||
use pocketmine\event\entity\ProjectileLaunchEvent;
|
||||
use pocketmine\item\enchantment\Enchantment;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
|
||||
use pocketmine\Player;
|
||||
use function intdiv;
|
||||
@ -48,10 +47,6 @@ class Bow extends Tool{
|
||||
return 385;
|
||||
}
|
||||
|
||||
public function getCompletedAction(){
|
||||
return CompletedUsingItemPacket::ACTION_SHOOT;
|
||||
}
|
||||
|
||||
public function onReleaseUsing(Player $player) : bool{
|
||||
if($player->isSurvival() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){
|
||||
$player->getInventory()->sendContents($player);
|
||||
|
@ -30,9 +30,7 @@ use pocketmine\block\Liquid;
|
||||
use pocketmine\entity\Living;
|
||||
use pocketmine\event\player\PlayerBucketEmptyEvent;
|
||||
use pocketmine\event\player\PlayerBucketFillEvent;
|
||||
use pocketmine\event\player\PlayerItemConsumeEvent;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\Player;
|
||||
|
||||
class Bucket extends Item implements Consumable{
|
||||
@ -116,36 +114,4 @@ class Bucket extends Item implements Consumable{
|
||||
public function onConsume(Living $consumer){
|
||||
$consumer->removeAllEffects();
|
||||
}
|
||||
|
||||
public function getCompletedAction(){
|
||||
if($this->canBeConsumed()){
|
||||
return CompletedUsingItemPacket::ACTION_CONSUME;
|
||||
}else{
|
||||
return CompletedUsingItemPacket::ACTION_POUR_BUCKET;
|
||||
}
|
||||
}
|
||||
|
||||
public function onUse(Player $player) : bool{
|
||||
if($this->canBeConsumed()){
|
||||
$slot = $player->getInventory()->getItemInHand();
|
||||
|
||||
$ev = new PlayerItemConsumeEvent($player, $slot);
|
||||
$ev->call();
|
||||
|
||||
/** @var $slot Consumable */
|
||||
if($ev->isCancelled() or !$player->consumeObject($slot)){
|
||||
$player->getInventory()->sendContents($player);
|
||||
return true;
|
||||
}
|
||||
|
||||
if($player->isSurvival()){
|
||||
$slot->pop();
|
||||
$player->getInventory()->setItemInHand($slot);
|
||||
$player->getInventory()->addItem($slot->getResidue());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -24,10 +24,6 @@ declare(strict_types=1);
|
||||
namespace pocketmine\item;
|
||||
|
||||
use pocketmine\entity\Living;
|
||||
use pocketmine\event\player\PlayerItemConsumeEvent;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\Player;
|
||||
|
||||
abstract class Food extends Item implements FoodSource{
|
||||
public function requiresHunger() : bool{
|
||||
@ -45,36 +41,7 @@ abstract class Food extends Item implements FoodSource{
|
||||
return [];
|
||||
}
|
||||
|
||||
public function getCompletedAction(){
|
||||
return CompletedUsingItemPacket::ACTION_EAT;
|
||||
}
|
||||
|
||||
public function onUse(Player $player) : bool{
|
||||
$slot = $player->getInventory()->getItemInHand();
|
||||
|
||||
$ev = new PlayerItemConsumeEvent($player, $slot);
|
||||
$ev->call();
|
||||
|
||||
/** @var $slot Consumable */
|
||||
if($ev->isCancelled() or !$player->consumeObject($slot)){
|
||||
$player->getInventory()->sendContents($player);
|
||||
return true;
|
||||
}
|
||||
|
||||
if($player->isSurvival()){
|
||||
$slot->pop();
|
||||
$player->getInventory()->setItemInHand($slot);
|
||||
$player->getInventory()->addItem($slot->getResidue());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function onConsume(Living $consumer){
|
||||
|
||||
}
|
||||
|
||||
public function onClickAir(Player $player, Vector3 $directionVector) : bool{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -41,7 +41,6 @@ use pocketmine\nbt\tag\ListTag;
|
||||
use pocketmine\nbt\tag\NamedTag;
|
||||
use pocketmine\nbt\tag\ShortTag;
|
||||
use pocketmine\nbt\tag\StringTag;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\Player;
|
||||
use pocketmine\utils\Binary;
|
||||
use function array_map;
|
||||
@ -849,14 +848,6 @@ class Item implements ItemIds, \JsonSerializable{
|
||||
return 0;
|
||||
}
|
||||
|
||||
public function getCompletedAction(){
|
||||
return CompletedUsingItemPacket::ACTION_UNKNOWN;
|
||||
}
|
||||
|
||||
public function onUse(Player $player) : bool{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares an Item to this Item and check if they match.
|
||||
*
|
||||
|
@ -26,9 +26,6 @@ namespace pocketmine\item;
|
||||
use pocketmine\entity\Effect;
|
||||
use pocketmine\entity\EffectInstance;
|
||||
use pocketmine\entity\Living;
|
||||
use pocketmine\event\player\PlayerItemConsumeEvent;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\Player;
|
||||
|
||||
class Potion extends Item implements Consumable{
|
||||
|
||||
@ -238,29 +235,4 @@ class Potion extends Item implements Consumable{
|
||||
public function getResidue(){
|
||||
return ItemFactory::get(Item::GLASS_BOTTLE);
|
||||
}
|
||||
|
||||
public function getCompletedAction(){
|
||||
return CompletedUsingItemPacket::ACTION_CONSUME;
|
||||
}
|
||||
|
||||
public function onUse(Player $player) : bool{
|
||||
$slot = $player->getInventory()->getItemInHand();
|
||||
|
||||
$ev = new PlayerItemConsumeEvent($player, $slot);
|
||||
$ev->call();
|
||||
|
||||
/** @var $slot Consumable */
|
||||
if($ev->isCancelled() or !$player->consumeObject($slot)){
|
||||
$player->getInventory()->sendContents($player);
|
||||
return true;
|
||||
}
|
||||
|
||||
if($player->isSurvival()){
|
||||
$slot->pop();
|
||||
$player->getInventory()->setItemInHand($slot);
|
||||
$player->getInventory()->addItem($slot->getResidue());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,6 @@ use pocketmine\entity\projectile\Projectile;
|
||||
use pocketmine\event\entity\ProjectileLaunchEvent;
|
||||
use pocketmine\math\Vector3;
|
||||
use pocketmine\nbt\tag\CompoundTag;
|
||||
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
|
||||
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
|
||||
use pocketmine\Player;
|
||||
|
||||
@ -48,10 +47,6 @@ abstract class ProjectileItem extends Item{
|
||||
|
||||
}
|
||||
|
||||
public function getCompletedAction(){
|
||||
return CompletedUsingItemPacket::ACTION_THROW;
|
||||
}
|
||||
|
||||
public function onClickAir(Player $player, Vector3 $directionVector) : bool{
|
||||
$nbt = Entity::createBaseNBT($player->add(0, $player->getEyeHeight(), 0), $directionVector, $player->yaw, $player->pitch);
|
||||
$this->addExtraTags($nbt);
|
||||
|
@ -253,7 +253,7 @@ class PlayerNetworkSessionAdapter extends NetworkSession{
|
||||
}
|
||||
|
||||
public function handlePlayerSkin(PlayerSkinPacket $packet) : bool{
|
||||
return $this->player->changeSkin($packet->skin);
|
||||
return $this->player->changeSkin($packet->skin, "", "");
|
||||
}
|
||||
|
||||
public function handleBookEdit(BookEditPacket $packet) : bool{
|
||||
|
Loading…
x
Reference in New Issue
Block a user