Fixed items, but I'm not so sure how well this'll work out, it'll need improved in the future

This commit is contained in:
Stephen 2019-11-05 22:25:11 -05:00
parent 75742b487f
commit 17a17c31f3
8 changed files with 134 additions and 26 deletions

View File

@ -80,6 +80,7 @@ use pocketmine\item\Consumable;
use pocketmine\item\Durable; 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\Food;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\WritableBook; use pocketmine\item\WritableBook;
use pocketmine\item\WrittenBook; use pocketmine\item\WrittenBook;
@ -98,6 +99,7 @@ use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\DoubleTag; use pocketmine\nbt\tag\DoubleTag;
use pocketmine\nbt\tag\ListTag; use pocketmine\nbt\tag\ListTag;
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
use pocketmine\network\mcpe\PlayerNetworkSessionAdapter; use pocketmine\network\mcpe\PlayerNetworkSessionAdapter;
use pocketmine\network\mcpe\protocol\ActorEventPacket; use pocketmine\network\mcpe\protocol\ActorEventPacket;
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket; use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
@ -2532,7 +2534,18 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
} }
} }
$this->setUsingItem(true); if($this->startAction === -1){
$this->setUsingItem(true);
return true;
}
$this->setUsingItem(false);
if($item->onUse($this)){
$pk = new CompletedUsingItemPacket();
$pk->itemId = $item->getId();
$pk->action = $item->getCompletedAction();
$this->sendDataPacket($pk);
}
return true; return true;
default: default:
@ -2650,6 +2663,11 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
if($item->onReleaseUsing($this)){ if($item->onReleaseUsing($this)){
$this->resetItemCooldown($item); $this->resetItemCooldown($item);
$this->inventory->setItemInHand($item); $this->inventory->setItemInHand($item);
$pk = new CompletedUsingItemPacket();
$pk->itemId = $item->getId();
$pk->action = $item->getCompletedAction();
$this->sendDataPacket($pk);
} }
}else{ }else{
break; break;
@ -2657,31 +2675,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return true; return true;
case InventoryTransactionPacket::RELEASE_ITEM_ACTION_CONSUME: case InventoryTransactionPacket::RELEASE_ITEM_ACTION_CONSUME:
$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());
}
return true;
}
break; break;
default: default:
break; break;

View File

@ -29,6 +29,7 @@ use pocketmine\entity\projectile\Projectile;
use pocketmine\event\entity\EntityShootBowEvent; use pocketmine\event\entity\EntityShootBowEvent;
use pocketmine\event\entity\ProjectileLaunchEvent; use pocketmine\event\entity\ProjectileLaunchEvent;
use pocketmine\item\enchantment\Enchantment; use pocketmine\item\enchantment\Enchantment;
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
use pocketmine\Player; use pocketmine\Player;
use function intdiv; use function intdiv;
@ -47,6 +48,10 @@ class Bow extends Tool{
return 385; return 385;
} }
public function getCompletedAction(){
return CompletedUsingItemPacket::ACTION_SHOOT;
}
public function onReleaseUsing(Player $player) : bool{ public function onReleaseUsing(Player $player) : bool{
if($player->isSurvival() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){ if($player->isSurvival() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){
$player->getInventory()->sendContents($player); $player->getInventory()->sendContents($player);

View File

@ -30,7 +30,9 @@ use pocketmine\block\Liquid;
use pocketmine\entity\Living; use pocketmine\entity\Living;
use pocketmine\event\player\PlayerBucketEmptyEvent; use pocketmine\event\player\PlayerBucketEmptyEvent;
use pocketmine\event\player\PlayerBucketFillEvent; use pocketmine\event\player\PlayerBucketFillEvent;
use pocketmine\event\player\PlayerItemConsumeEvent;
use pocketmine\math\Vector3; use pocketmine\math\Vector3;
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
use pocketmine\Player; use pocketmine\Player;
class Bucket extends Item implements Consumable{ class Bucket extends Item implements Consumable{
@ -114,4 +116,36 @@ class Bucket extends Item implements Consumable{
public function onConsume(Living $consumer){ public function onConsume(Living $consumer){
$consumer->removeAllEffects(); $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;
}
} }

View File

@ -26,6 +26,7 @@ namespace pocketmine\item;
use pocketmine\block\Block; use pocketmine\block\Block;
use pocketmine\entity\EffectInstance; use pocketmine\entity\EffectInstance;
use pocketmine\entity\Living; use pocketmine\entity\Living;
use pocketmine\Player;
/** /**
* Interface implemented by objects that can be consumed by mobs. * Interface implemented by objects that can be consumed by mobs.

View File

@ -24,6 +24,10 @@ declare(strict_types=1);
namespace pocketmine\item; namespace pocketmine\item;
use pocketmine\entity\Living; 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{ abstract class Food extends Item implements FoodSource{
public function requiresHunger() : bool{ public function requiresHunger() : bool{
@ -41,7 +45,36 @@ abstract class Food extends Item implements FoodSource{
return []; 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 onConsume(Living $consumer){
} }
public function onClickAir(Player $player, Vector3 $directionVector) : bool{
return true;
}
} }

View File

@ -41,6 +41,7 @@ use pocketmine\nbt\tag\ListTag;
use pocketmine\nbt\tag\NamedTag; use pocketmine\nbt\tag\NamedTag;
use pocketmine\nbt\tag\ShortTag; use pocketmine\nbt\tag\ShortTag;
use pocketmine\nbt\tag\StringTag; use pocketmine\nbt\tag\StringTag;
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
use pocketmine\Player; use pocketmine\Player;
use pocketmine\utils\Binary; use pocketmine\utils\Binary;
use function array_map; use function array_map;
@ -848,6 +849,14 @@ class Item implements ItemIds, \JsonSerializable{
return 0; 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. * Compares an Item to this Item and check if they match.
* *

View File

@ -26,6 +26,9 @@ namespace pocketmine\item;
use pocketmine\entity\Effect; use pocketmine\entity\Effect;
use pocketmine\entity\EffectInstance; use pocketmine\entity\EffectInstance;
use pocketmine\entity\Living; use pocketmine\entity\Living;
use pocketmine\event\player\PlayerItemConsumeEvent;
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
use pocketmine\Player;
class Potion extends Item implements Consumable{ class Potion extends Item implements Consumable{
@ -235,4 +238,29 @@ class Potion extends Item implements Consumable{
public function getResidue(){ public function getResidue(){
return ItemFactory::get(Item::GLASS_BOTTLE); 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;
}
} }

View File

@ -29,6 +29,7 @@ use pocketmine\entity\projectile\Projectile;
use pocketmine\event\entity\ProjectileLaunchEvent; use pocketmine\event\entity\ProjectileLaunchEvent;
use pocketmine\math\Vector3; use pocketmine\math\Vector3;
use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\CompoundTag;
use pocketmine\network\mcpe\protocol\CompletedUsingItemPacket;
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
use pocketmine\Player; use pocketmine\Player;
@ -47,6 +48,10 @@ abstract class ProjectileItem extends Item{
} }
public function getCompletedAction(){
return CompletedUsingItemPacket::ACTION_THROW;
}
public function onClickAir(Player $player, Vector3 $directionVector) : bool{ public function onClickAir(Player $player, Vector3 $directionVector) : bool{
$nbt = Entity::createBaseNBT($player->add(0, $player->getEyeHeight(), 0), $directionVector, $player->yaw, $player->pitch); $nbt = Entity::createBaseNBT($player->add(0, $player->getEyeHeight(), 0), $directionVector, $player->yaw, $player->pitch);
$this->addExtraTags($nbt); $this->addExtraTags($nbt);