mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-24 06:24:41 +00:00
some work on anvil
This commit is contained in:
parent
b9df798796
commit
c77a72f15a
@ -26,6 +26,7 @@ namespace pocketmine\block\anvil;
|
|||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
|
|
||||||
abstract class AnvilAction{
|
abstract class AnvilAction{
|
||||||
|
/** @phpstan-var int<0, max> */
|
||||||
protected int $xpCost = 0;
|
protected int $xpCost = 0;
|
||||||
|
|
||||||
final public function __construct(
|
final public function __construct(
|
||||||
@ -34,6 +35,12 @@ abstract class AnvilAction{
|
|||||||
protected ?string $customName
|
protected ?string $customName
|
||||||
){ }
|
){ }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the XP cost requested for this action.
|
||||||
|
* This XP cost will be summed up to the total XP cost of the anvil operation.
|
||||||
|
*
|
||||||
|
* @phpstan-return int<0, max>
|
||||||
|
*/
|
||||||
final public function getXpCost() : int{
|
final public function getXpCost() : int{
|
||||||
return $this->xpCost;
|
return $this->xpCost;
|
||||||
}
|
}
|
||||||
@ -46,7 +53,14 @@ abstract class AnvilAction{
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processing an action means applying the changes to the result item
|
||||||
|
* and updating the XP cost property of the action.
|
||||||
|
*/
|
||||||
abstract public function process(Item $resultItem) : void;
|
abstract public function process(Item $resultItem) : void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this action is valid and can be applied.
|
||||||
|
*/
|
||||||
abstract public function canBeApplied() : bool;
|
abstract public function canBeApplied() : bool;
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ use pocketmine\item\enchantment\AvailableEnchantmentRegistry;
|
|||||||
use pocketmine\item\enchantment\EnchantmentInstance;
|
use pocketmine\item\enchantment\EnchantmentInstance;
|
||||||
use pocketmine\item\enchantment\Rarity;
|
use pocketmine\item\enchantment\Rarity;
|
||||||
use pocketmine\item\Item;
|
use pocketmine\item\Item;
|
||||||
|
use function floor;
|
||||||
use function max;
|
use function max;
|
||||||
use function min;
|
use function min;
|
||||||
|
|
||||||
@ -74,7 +75,7 @@ final class CombineEnchantmentsAction extends AnvilAction{
|
|||||||
$costAddition = max(1, $costAddition / 2);
|
$costAddition = max(1, $costAddition / 2);
|
||||||
}
|
}
|
||||||
$levelDifference = $instance->getLevel() - $this->base->getEnchantmentLevel($instance->getType());
|
$levelDifference = $instance->getLevel() - $this->base->getEnchantmentLevel($instance->getType());
|
||||||
$this->xpCost += $costAddition * $levelDifference;
|
$this->xpCost += (int) floor($costAddition * $levelDifference);
|
||||||
$resultItem->addEnchantment($instance);
|
$resultItem->addEnchantment($instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,6 @@ final class RepairWithMaterialAction extends AnvilAction{
|
|||||||
}
|
}
|
||||||
$resultItem->setDamage(max(0, $damage));
|
$resultItem->setDamage(max(0, $damage));
|
||||||
|
|
||||||
$this->xpCost = $numberRepair * self::COST;
|
$this->xpCost = (int) floor($numberRepair * self::COST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,10 +51,10 @@ final class AnvilHelper{
|
|||||||
$xpCost += $action->getXpCost();
|
$xpCost += $action->getXpCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
$xpCost += 2 ** $resultItem->getRepairCost() - 1;
|
$xpCost += 2 ** $resultItem->getAnvilRepairCost() - 1;
|
||||||
$xpCost += 2 ** $material->getRepairCost() - 1;
|
$xpCost += 2 ** $material->getAnvilRepairCost() - 1;
|
||||||
$resultItem->setRepairCost(
|
$resultItem->setAnvilRepairCost(
|
||||||
max($resultItem->getRepairCost(), $material->getRepairCost()) + $additionnalRepairCost
|
max($resultItem->getAnvilRepairCost(), $material->getAnvilRepairCost()) + $additionnalRepairCost
|
||||||
);
|
);
|
||||||
|
|
||||||
if($xpCost <= 0 || ($xpCost > self::COST_LIMIT && !$player->isCreative())){
|
if($xpCost <= 0 || ($xpCost > self::COST_LIMIT && !$player->isCreative())){
|
||||||
|
@ -85,7 +85,7 @@ class Item implements \JsonSerializable{
|
|||||||
protected string $customName = "";
|
protected string $customName = "";
|
||||||
/** @var string[] */
|
/** @var string[] */
|
||||||
protected array $lore = [];
|
protected array $lore = [];
|
||||||
protected int $repairCost = 0;
|
protected int $anvilRepairCost = 0;
|
||||||
/** TODO: this needs to die in a fire */
|
/** TODO: this needs to die in a fire */
|
||||||
protected ?CompoundTag $blockEntityTag = null;
|
protected ?CompoundTag $blockEntityTag = null;
|
||||||
|
|
||||||
@ -285,19 +285,26 @@ class Item implements \JsonSerializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the repair cost of the item.
|
* Returns the anvil repair cost of the item.
|
||||||
|
* This value is used in anvil to determine the XP cost of repairing the item.
|
||||||
|
*
|
||||||
|
* In vanilla, this value is stored in the "RepairCost" tag.
|
||||||
*/
|
*/
|
||||||
public function getRepairCost() : int{
|
public function getAnvilRepairCost() : int{
|
||||||
return $this->repairCost;
|
return $this->anvilRepairCost;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the repair cost of the item.
|
* Sets the anvil repair cost value of the item.
|
||||||
|
* This value is used in anvil to determine the XP cost of repairing the item.
|
||||||
|
* Higher cost means more XP is required to repair the item.
|
||||||
|
*
|
||||||
|
* In vanilla, this value is stored in the "RepairCost" tag.
|
||||||
*
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setRepairCost(int $cost) : self{
|
public function setAnvilRepairCost(int $cost) : self{
|
||||||
$this->repairCost = $cost;
|
$this->anvilRepairCost = $cost;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +364,7 @@ class Item implements \JsonSerializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->keepOnDeath = $tag->getByte(self::TAG_KEEP_ON_DEATH, 0) !== 0;
|
$this->keepOnDeath = $tag->getByte(self::TAG_KEEP_ON_DEATH, 0) !== 0;
|
||||||
$this->repairCost = $tag->getInt(self::TAG_REPAIR_COST, 0);
|
$this->anvilRepairCost = $tag->getInt(self::TAG_REPAIR_COST, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function serializeCompoundTag(CompoundTag $tag) : void{
|
protected function serializeCompoundTag(CompoundTag $tag) : void{
|
||||||
@ -427,8 +434,8 @@ class Item implements \JsonSerializable{
|
|||||||
$tag->removeTag(self::TAG_KEEP_ON_DEATH);
|
$tag->removeTag(self::TAG_KEEP_ON_DEATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->repairCost > 0){
|
if($this->anvilRepairCost > 0){
|
||||||
$tag->setInt(self::TAG_REPAIR_COST, $this->repairCost);
|
$tag->setInt(self::TAG_REPAIR_COST, $this->anvilRepairCost);
|
||||||
}else{
|
}else{
|
||||||
$tag->removeTag(self::TAG_REPAIR_COST);
|
$tag->removeTag(self::TAG_REPAIR_COST);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user