Player: add hasFiniteResources()

This commit is contained in:
Dylan K. Taylor 2019-03-31 16:40:54 +01:00
parent 42a263a9df
commit f8ce7797db
6 changed files with 23 additions and 16 deletions

View File

@ -1513,6 +1513,15 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
return $this->gamemode === GameMode::SPECTATOR(); return $this->gamemode === GameMode::SPECTATOR();
} }
/**
* TODO: make this a dynamic ability instead of being hardcoded
*
* @return bool
*/
public function hasFiniteResources() : bool{
return $this->gamemode === GameMode::SURVIVAL() or $this->gamemode === GameMode::ADVENTURE();
}
public function isFireProof() : bool{ public function isFireProof() : bool{
return $this->isCreative(); return $this->isCreative();
} }
@ -1937,7 +1946,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$result = $item->onClickAir($this, $directionVector); $result = $item->onClickAir($this, $directionVector);
if($result === ItemUseResult::SUCCESS()){ if($result === ItemUseResult::SUCCESS()){
$this->resetItemCooldown($item); $this->resetItemCooldown($item);
if($this->isSurvival()){ if($this->hasFiniteResources()){
$this->inventory->setItemInHand($item); $this->inventory->setItemInHand($item);
} }
}elseif($result === ItemUseResult::FAIL()){ }elseif($result === ItemUseResult::FAIL()){
@ -1971,7 +1980,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$this->resetItemCooldown($slot); $this->resetItemCooldown($slot);
if($this->isSurvival()){ if($this->hasFiniteResources()){
$slot->pop(); $slot->pop();
$this->inventory->setItemInHand($slot); $this->inventory->setItemInHand($slot);
$this->inventory->addItem($slot->getResidue()); $this->inventory->addItem($slot->getResidue());
@ -2132,12 +2141,10 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$item = $this->inventory->getItemInHand(); $item = $this->inventory->getItemInHand();
$oldItem = clone $item; $oldItem = clone $item;
if($this->level->useBreakOn($pos, $item, $this, true)){ if($this->level->useBreakOn($pos, $item, $this, true)){
if($this->isSurvival()){ if($this->hasFiniteResources() and !$item->equalsExact($oldItem)){
if(!$item->equalsExact($oldItem)){ $this->inventory->setItemInHand($item);
$this->inventory->setItemInHand($item);
}
$this->exhaust(0.025, PlayerExhaustEvent::CAUSE_MINING);
} }
$this->exhaust(0.025, PlayerExhaustEvent::CAUSE_MINING);
return true; return true;
} }
} }
@ -2171,7 +2178,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
$item = $this->inventory->getItemInHand(); //this is a copy of the real item $item = $this->inventory->getItemInHand(); //this is a copy of the real item
$oldItem = clone $item; $oldItem = clone $item;
if($this->level->useItemOn($pos, $item, $face, $clickOffset, $this, true)){ if($this->level->useItemOn($pos, $item, $face, $clickOffset, $this, true)){
if($this->isSurvival() and !$item->equalsExact($oldItem)){ if($this->hasFiniteResources() and !$item->equalsExact($oldItem)){
$this->inventory->setItemInHand($item); $this->inventory->setItemInHand($item);
} }
return true; return true;
@ -2239,7 +2246,7 @@ 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->isSurvival()){ if($heldItem instanceof Durable and $this->hasFiniteResources()){
$this->inventory->sendContents($this); $this->inventory->sendContents($this);
} }
return false; return false;
@ -2258,7 +2265,7 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener,
if($this->isAlive()){ if($this->isAlive()){
//reactive damage like thorns might cause us to be killed by attacking another mob, which //reactive damage like thorns might cause us to be killed by attacking another mob, which
//would mean we'd already have dropped the inventory by the time we reached here //would mean we'd already have dropped the inventory by the time we reached here
if($heldItem->onAttackEntity($entity) and $this->isSurvival()){ //always fire the hook, even if we are survival if($heldItem->onAttackEntity($entity) and $this->hasFiniteResources()){ //always fire the hook, even if we are survival
$this->inventory->setItemInHand($heldItem); $this->inventory->setItemInHand($heldItem);
} }

View File

@ -252,7 +252,7 @@ class ItemEntity extends Entity{
$item = $this->getItem(); $item = $this->getItem();
$playerInventory = $player->getInventory(); $playerInventory = $player->getInventory();
if($player->isSurvival() and !$playerInventory->canAddItem($item)){ if($player->hasFiniteResources() and !$playerInventory->canAddItem($item)){
return; return;
} }

View File

@ -179,7 +179,7 @@ class Arrow extends Projectile{
$item = ItemFactory::get(Item::ARROW, 0, 1); $item = ItemFactory::get(Item::ARROW, 0, 1);
$playerInventory = $player->getInventory(); $playerInventory = $player->getInventory();
if($player->isSurvival() and !$playerInventory->canAddItem($item)){ if($player->hasFiniteResources() and !$playerInventory->canAddItem($item)){
return; return;
} }

View File

@ -48,7 +48,7 @@ class Bow extends Tool{
} }
public function onReleaseUsing(Player $player) : ItemUseResult{ public function onReleaseUsing(Player $player) : ItemUseResult{
if($player->isSurvival() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){ if($player->hasFiniteResources() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){
return ItemUseResult::FAIL(); return ItemUseResult::FAIL();
} }
@ -111,7 +111,7 @@ class Bow extends Tool{
$entity->spawnToAll(); $entity->spawnToAll();
} }
if($player->isSurvival()){ if($player->hasFiniteResources()){
if(!$infinity){ //TODO: tipped arrows are still consumed when Infinity is applied if(!$infinity){ //TODO: tipped arrows are still consumed when Infinity is applied
$player->getInventory()->removeItem(ItemFactory::get(Item::ARROW, 0, 1)); $player->getInventory()->removeItem(ItemFactory::get(Item::ARROW, 0, 1));
} }

View File

@ -49,7 +49,7 @@ class Bucket extends Item{
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$player->getLevel()->setBlock($blockClicked, BlockFactory::get(BlockLegacyIds::AIR)); $player->getLevel()->setBlock($blockClicked, BlockFactory::get(BlockLegacyIds::AIR));
$player->getLevel()->addSound($blockClicked->add(0.5, 0.5, 0.5), $blockClicked->getBucketFillSound()); $player->getLevel()->addSound($blockClicked->add(0.5, 0.5, 0.5), $blockClicked->getBucketFillSound());
if($player->isSurvival()){ if($player->hasFiniteResources()){
if($stack->getCount() === 0){ if($stack->getCount() === 0){
$player->getInventory()->setItemInHand($ev->getItem()); $player->getInventory()->setItemInHand($ev->getItem());
}else{ }else{

View File

@ -66,7 +66,7 @@ class LiquidBucket extends Item{
$player->getLevel()->setBlock($blockReplace, $resultBlock->getFlowingForm()); $player->getLevel()->setBlock($blockReplace, $resultBlock->getFlowingForm());
$player->getLevel()->addSound($blockClicked->add(0.5, 0.5, 0.5), $resultBlock->getBucketEmptySound()); $player->getLevel()->addSound($blockClicked->add(0.5, 0.5, 0.5), $resultBlock->getBucketEmptySound());
if($player->isSurvival()){ if($player->hasFiniteResources()){
$player->getInventory()->setItemInHand($ev->getItem()); $player->getInventory()->setItemInHand($ev->getItem());
} }
return ItemUseResult::SUCCESS(); return ItemUseResult::SUCCESS();