mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-22 19:34:02 +00:00
Enchantment: more static getters, firehose magic numbers
This is similar in nature to 646fea5a4ecbbdf3f0cbfc590d874dedc1a7bfc0. On a side note: Migrating this way is a pain in the ass due to lack of types. What the heck is int supposed to mean?!?!?!?! At least if we wanted to go _back_ to magic numbers, it would be easy to locate everything with an Enchantment typehint...
This commit is contained in:
parent
646fea5a4e
commit
7170d9009d
@ -526,7 +526,7 @@ class Block extends Position implements BlockIds, Metadatable{
|
|||||||
*/
|
*/
|
||||||
public function getDrops(Item $item) : array{
|
public function getDrops(Item $item) : array{
|
||||||
if($this->isCompatibleWithTool($item)){
|
if($this->isCompatibleWithTool($item)){
|
||||||
if($this->isAffectedBySilkTouch() and $item->hasEnchantment(Enchantment::SILK_TOUCH)){
|
if($this->isAffectedBySilkTouch() and $item->hasEnchantment(Enchantment::SILK_TOUCH())){
|
||||||
return $this->getSilkTouchDrops($item);
|
return $this->getSilkTouchDrops($item);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,7 +566,7 @@ class Block extends Position implements BlockIds, Metadatable{
|
|||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function getXpDropForTool(Item $item) : int{
|
public function getXpDropForTool(Item $item) : int{
|
||||||
if($item->hasEnchantment(Enchantment::SILK_TOUCH) or !$this->isCompatibleWithTool($item)){
|
if($item->hasEnchantment(Enchantment::SILK_TOUCH()) or !$this->isCompatibleWithTool($item)){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ class Ice extends Transparent{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function onBreak(Item $item, Player $player = null) : bool{
|
public function onBreak(Item $item, Player $player = null) : bool{
|
||||||
if(($player === null or $player->isSurvival()) and !$item->hasEnchantment(Enchantment::SILK_TOUCH)){
|
if(($player === null or $player->isSurvival()) and !$item->hasEnchantment(Enchantment::SILK_TOUCH())){
|
||||||
return $this->getLevel()->setBlock($this, BlockFactory::get(Block::WATER));
|
return $this->getLevel()->setBlock($this, BlockFactory::get(Block::WATER));
|
||||||
}
|
}
|
||||||
return parent::onBreak($item, $player);
|
return parent::onBreak($item, $player);
|
||||||
|
@ -55,7 +55,7 @@ class TNT extends Solid{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function onActivate(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
public function onActivate(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
||||||
if($item instanceof FlintSteel or $item->hasEnchantment(Enchantment::FIRE_ASPECT)){
|
if($item instanceof FlintSteel or $item->hasEnchantment(Enchantment::FIRE_ASPECT())){
|
||||||
if($item instanceof Durable){
|
if($item instanceof Durable){
|
||||||
$item->applyDamage(1);
|
$item->applyDamage(1);
|
||||||
}
|
}
|
||||||
|
@ -537,12 +537,12 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
|||||||
/** @var Durable[] $equipment */
|
/** @var Durable[] $equipment */
|
||||||
$equipment = [];
|
$equipment = [];
|
||||||
|
|
||||||
if(($item = $this->inventory->getItemInHand()) instanceof Durable and $item->hasEnchantment(Enchantment::MENDING)){
|
if(($item = $this->inventory->getItemInHand()) instanceof Durable and $item->hasEnchantment(Enchantment::MENDING())){
|
||||||
$equipment[$mainHandIndex] = $item;
|
$equipment[$mainHandIndex] = $item;
|
||||||
}
|
}
|
||||||
//TODO: check offhand
|
//TODO: check offhand
|
||||||
foreach($this->armorInventory->getContents() as $k => $item){
|
foreach($this->armorInventory->getContents() as $k => $item){
|
||||||
if($item instanceof Durable and $item->hasEnchantment(Enchantment::MENDING)){
|
if($item instanceof Durable and $item->hasEnchantment(Enchantment::MENDING())){
|
||||||
$equipment[$k] = $item;
|
$equipment[$k] = $item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -784,7 +784,7 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{
|
|||||||
return array_filter(array_merge(
|
return array_filter(array_merge(
|
||||||
$this->inventory !== null ? array_values($this->inventory->getContents()) : [],
|
$this->inventory !== null ? array_values($this->inventory->getContents()) : [],
|
||||||
$this->armorInventory !== null ? array_values($this->armorInventory->getContents()) : []
|
$this->armorInventory !== null ? array_values($this->armorInventory->getContents()) : []
|
||||||
), function(Item $item) : bool{ return !$item->hasEnchantment(Enchantment::VANISHING); });
|
), function(Item $item) : bool{ return !$item->hasEnchantment(Enchantment::VANISHING()); });
|
||||||
}
|
}
|
||||||
|
|
||||||
public function saveNBT() : CompoundTag{
|
public function saveNBT() : CompoundTag{
|
||||||
|
@ -441,14 +441,14 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
/**
|
/**
|
||||||
* Returns the highest level of the specified enchantment on any armour piece that the entity is currently wearing.
|
* Returns the highest level of the specified enchantment on any armour piece that the entity is currently wearing.
|
||||||
*
|
*
|
||||||
* @param int $enchantmentId
|
* @param Enchantment $enchantment
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function getHighestArmorEnchantmentLevel(int $enchantmentId) : int{
|
public function getHighestArmorEnchantmentLevel(Enchantment $enchantment) : int{
|
||||||
$result = 0;
|
$result = 0;
|
||||||
foreach($this->armorInventory->getContents() as $item){
|
foreach($this->armorInventory->getContents() as $item){
|
||||||
$result = max($result, $item->getEnchantmentLevel($enchantmentId));
|
$result = max($result, $item->getEnchantmentLevel($enchantment));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
@ -462,7 +462,7 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function setOnFire(int $seconds) : void{
|
public function setOnFire(int $seconds) : void{
|
||||||
parent::setOnFire($seconds - (int) min($seconds, $seconds * $this->getHighestArmorEnchantmentLevel(Enchantment::FIRE_PROTECTION) * 0.15));
|
parent::setOnFire($seconds - (int) min($seconds, $seconds * $this->getHighestArmorEnchantmentLevel(Enchantment::FIRE_PROTECTION()) * 0.15));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -507,7 +507,7 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
if($source instanceof EntityDamageByEntityEvent){
|
if($source instanceof EntityDamageByEntityEvent){
|
||||||
$damage = 0;
|
$damage = 0;
|
||||||
foreach($this->armorInventory->getContents() as $k => $item){
|
foreach($this->armorInventory->getContents() as $k => $item){
|
||||||
if($item instanceof Armor and ($thornsLevel = $item->getEnchantmentLevel(Enchantment::THORNS)) > 0){
|
if($item instanceof Armor and ($thornsLevel = $item->getEnchantmentLevel(Enchantment::THORNS())) > 0){
|
||||||
if(mt_rand(0, 99) < $thornsLevel * 15){
|
if(mt_rand(0, 99) < $thornsLevel * 15){
|
||||||
$this->damageItem($item, 3);
|
$this->damageItem($item, 3);
|
||||||
$damage += ($thornsLevel > 10 ? $thornsLevel - 10 : 1 + mt_rand(0, 3));
|
$damage += ($thornsLevel > 10 ? $thornsLevel - 10 : 1 + mt_rand(0, 3));
|
||||||
@ -577,7 +577,7 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
//TODO: knockback should not just apply for entity damage sources
|
//TODO: knockback should not just apply for entity damage sources
|
||||||
//this doesn't matter for TNT right now because the PrimedTNT entity is considered the source, not the block.
|
//this doesn't matter for TNT right now because the PrimedTNT entity is considered the source, not the block.
|
||||||
$base = $source->getKnockBack();
|
$base = $source->getKnockBack();
|
||||||
$source->setKnockBack($base - min($base, $base * $this->getHighestArmorEnchantmentLevel(Enchantment::BLAST_PROTECTION) * 0.15));
|
$source->setKnockBack($base - min($base, $base * $this->getHighestArmorEnchantmentLevel(Enchantment::BLAST_PROTECTION()) * 0.15));
|
||||||
}
|
}
|
||||||
|
|
||||||
parent::attack($source);
|
parent::attack($source);
|
||||||
@ -738,7 +738,7 @@ abstract class Living extends Entity implements Damageable{
|
|||||||
if(!$this->canBreathe()){
|
if(!$this->canBreathe()){
|
||||||
$this->setBreathing(false);
|
$this->setBreathing(false);
|
||||||
|
|
||||||
if(($respirationLevel = $this->armorInventory->getHelmet()->getEnchantmentLevel(Enchantment::RESPIRATION)) <= 0 or
|
if(($respirationLevel = $this->armorInventory->getHelmet()->getEnchantmentLevel(Enchantment::RESPIRATION())) <= 0 or
|
||||||
lcg_value() <= (1 / ($respirationLevel + 1))
|
lcg_value() <= (1 / ($respirationLevel + 1))
|
||||||
){
|
){
|
||||||
$ticks -= $tickDiff;
|
$ticks -= $tickDiff;
|
||||||
|
@ -84,7 +84,7 @@ abstract class Armor extends Durable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function getUnbreakingDamageReduction(int $amount) : int{
|
protected function getUnbreakingDamageReduction(int $amount) : int{
|
||||||
if(($unbreakingLevel = $this->getEnchantmentLevel(Enchantment::UNBREAKING)) > 0){
|
if(($unbreakingLevel = $this->getEnchantmentLevel(Enchantment::UNBREAKING())) > 0){
|
||||||
$negated = 0;
|
$negated = 0;
|
||||||
|
|
||||||
$chance = 1 / ($unbreakingLevel + 1);
|
$chance = 1 / ($unbreakingLevel + 1);
|
||||||
|
@ -67,17 +67,17 @@ class Bow extends Tool{
|
|||||||
/** @var ArrowEntity $entity */
|
/** @var ArrowEntity $entity */
|
||||||
$entity = EntityFactory::create(ArrowEntity::class, $player->getLevel(), $nbt, $player, $baseForce >= 1);
|
$entity = EntityFactory::create(ArrowEntity::class, $player->getLevel(), $nbt, $player, $baseForce >= 1);
|
||||||
|
|
||||||
$infinity = $this->hasEnchantment(Enchantment::INFINITY);
|
$infinity = $this->hasEnchantment(Enchantment::INFINITY());
|
||||||
if($infinity){
|
if($infinity){
|
||||||
$entity->setPickupMode(ArrowEntity::PICKUP_CREATIVE);
|
$entity->setPickupMode(ArrowEntity::PICKUP_CREATIVE);
|
||||||
}
|
}
|
||||||
if(($punchLevel = $this->getEnchantmentLevel(Enchantment::PUNCH)) > 0){
|
if(($punchLevel = $this->getEnchantmentLevel(Enchantment::PUNCH())) > 0){
|
||||||
$entity->setPunchKnockback($punchLevel);
|
$entity->setPunchKnockback($punchLevel);
|
||||||
}
|
}
|
||||||
if(($powerLevel = $this->getEnchantmentLevel(Enchantment::POWER)) > 0){
|
if(($powerLevel = $this->getEnchantmentLevel(Enchantment::POWER())) > 0){
|
||||||
$entity->setBaseDamage($entity->getBaseDamage() + (($powerLevel + 1) / 2));
|
$entity->setBaseDamage($entity->getBaseDamage() + (($powerLevel + 1) / 2));
|
||||||
}
|
}
|
||||||
if($this->hasEnchantment(Enchantment::FLAME)){
|
if($this->hasEnchantment(Enchantment::FLAME())){
|
||||||
$entity->setOnFire(intdiv($entity->getFireTicks(), 20) + 100);
|
$entity->setOnFire(intdiv($entity->getFireTicks(), 20) + 100);
|
||||||
}
|
}
|
||||||
$ev = new EntityShootBowEvent($player, $this, $entity, $baseForce * 3);
|
$ev = new EntityShootBowEvent($player, $this, $entity, $baseForce * 3);
|
||||||
|
@ -85,7 +85,7 @@ abstract class Durable extends Item{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function getUnbreakingDamageReduction(int $amount) : int{
|
protected function getUnbreakingDamageReduction(int $amount) : int{
|
||||||
if(($unbreakingLevel = $this->getEnchantmentLevel(Enchantment::UNBREAKING)) > 0){
|
if(($unbreakingLevel = $this->getEnchantmentLevel(Enchantment::UNBREAKING())) > 0){
|
||||||
$negated = 0;
|
$negated = 0;
|
||||||
|
|
||||||
$chance = 1 / ($unbreakingLevel + 1);
|
$chance = 1 / ($unbreakingLevel + 1);
|
||||||
|
@ -249,16 +249,17 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $id
|
* @param Enchantment $enchantment
|
||||||
* @param int $level
|
* @param int $level
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function hasEnchantment(int $id, int $level = -1) : bool{
|
public function hasEnchantment(Enchantment $enchantment, int $level = -1) : bool{
|
||||||
$ench = $this->getNamedTagEntry(self::TAG_ENCH);
|
$ench = $this->getNamedTagEntry(self::TAG_ENCH);
|
||||||
if(!($ench instanceof ListTag)){
|
if(!($ench instanceof ListTag)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
$id = $enchantment->getId();
|
||||||
|
|
||||||
/** @var CompoundTag $entry */
|
/** @var CompoundTag $entry */
|
||||||
foreach($ench as $entry){
|
foreach($ench as $entry){
|
||||||
@ -271,16 +272,17 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $id
|
* @param Enchantment $enchantment
|
||||||
*
|
*
|
||||||
* @return EnchantmentInstance|null
|
* @return EnchantmentInstance|null
|
||||||
*/
|
*/
|
||||||
public function getEnchantment(int $id) : ?EnchantmentInstance{
|
public function getEnchantment(Enchantment $enchantment) : ?EnchantmentInstance{
|
||||||
$ench = $this->getNamedTagEntry(self::TAG_ENCH);
|
$ench = $this->getNamedTagEntry(self::TAG_ENCH);
|
||||||
if(!($ench instanceof ListTag)){
|
if(!($ench instanceof ListTag)){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = $enchantment->getId();
|
||||||
/** @var CompoundTag $entry */
|
/** @var CompoundTag $entry */
|
||||||
foreach($ench as $entry){
|
foreach($ench as $entry){
|
||||||
if($entry->getShort("id") === $id){
|
if($entry->getShort("id") === $id){
|
||||||
@ -295,17 +297,18 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $id
|
* @param Enchantment $enchantment
|
||||||
* @param int $level
|
* @param int $level
|
||||||
*
|
*
|
||||||
* @return Item
|
* @return Item
|
||||||
*/
|
*/
|
||||||
public function removeEnchantment(int $id, int $level = -1) : Item{
|
public function removeEnchantment(Enchantment $enchantment, int $level = -1) : Item{
|
||||||
$ench = $this->getNamedTagEntry(self::TAG_ENCH);
|
$ench = $this->getNamedTagEntry(self::TAG_ENCH);
|
||||||
if(!($ench instanceof ListTag)){
|
if(!($ench instanceof ListTag)){
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = $enchantment->getId();
|
||||||
/** @var CompoundTag $entry */
|
/** @var CompoundTag $entry */
|
||||||
foreach($ench as $k => $entry){
|
foreach($ench as $k => $entry){
|
||||||
if($entry->getShort("id") === $id and ($level === -1 or $entry->getShort("lvl") === $level)){
|
if($entry->getShort("id") === $id and ($level === -1 or $entry->getShort("lvl") === $level)){
|
||||||
@ -390,14 +393,15 @@ class Item implements ItemIds, \JsonSerializable{
|
|||||||
* Returns the level of the enchantment on this item with the specified ID, or 0 if the item does not have the
|
* Returns the level of the enchantment on this item with the specified ID, or 0 if the item does not have the
|
||||||
* enchantment.
|
* enchantment.
|
||||||
*
|
*
|
||||||
* @param int $enchantmentId
|
* @param Enchantment $enchantment
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function getEnchantmentLevel(int $enchantmentId) : int{
|
public function getEnchantmentLevel(Enchantment $enchantment) : int{
|
||||||
$ench = $this->getNamedTag()->getListTag(self::TAG_ENCH);
|
$ench = $this->getNamedTag()->getListTag(self::TAG_ENCH);
|
||||||
if($ench !== null){
|
if($ench !== null){
|
||||||
/** @var CompoundTag $entry */
|
/** @var CompoundTag $entry */
|
||||||
|
$enchantmentId = $enchantment->getId();
|
||||||
foreach($ench as $entry){
|
foreach($ench as $entry){
|
||||||
if($entry->getShort("id") === $enchantmentId){
|
if($entry->getShort("id") === $enchantmentId){
|
||||||
return $entry->getShort("lvl");
|
return $entry->getShort("lvl");
|
||||||
|
@ -36,7 +36,7 @@ abstract class Tool extends Durable{
|
|||||||
$efficiency = 1;
|
$efficiency = 1;
|
||||||
if(($block->getToolType() & $this->getBlockToolType()) !== 0){
|
if(($block->getToolType() & $this->getBlockToolType()) !== 0){
|
||||||
$efficiency = $this->getBaseMiningEfficiency();
|
$efficiency = $this->getBaseMiningEfficiency();
|
||||||
if(($enchantmentLevel = $this->getEnchantmentLevel(Enchantment::EFFICIENCY)) > 0){
|
if(($enchantmentLevel = $this->getEnchantmentLevel(Enchantment::EFFICIENCY())) > 0){
|
||||||
$efficiency += ($enchantmentLevel ** 2 + 1);
|
$efficiency += ($enchantmentLevel ** 2 + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -140,6 +140,82 @@ class Enchantment{
|
|||||||
self::registerEnchantment(new Enchantment(self::VANISHING, "%enchantment.curse.vanishing", self::RARITY_MYTHIC, self::SLOT_NONE, self::SLOT_ALL, 1));
|
self::registerEnchantment(new Enchantment(self::VANISHING, "%enchantment.curse.vanishing", self::RARITY_MYTHIC, self::SLOT_NONE, self::SLOT_ALL, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function BLAST_PROTECTION() : Enchantment{
|
||||||
|
return self::getEnchantment(self::BLAST_PROTECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function EFFICIENCY() : Enchantment{
|
||||||
|
return self::getEnchantment(self::EFFICIENCY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function FEATHER_FALLING() : Enchantment{
|
||||||
|
return self::getEnchantment(self::FEATHER_FALLING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function FIRE_ASPECT() : Enchantment{
|
||||||
|
return self::getEnchantment(self::FIRE_ASPECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function FIRE_PROTECTION() : Enchantment{
|
||||||
|
return self::getEnchantment(self::FIRE_PROTECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function FLAME() : Enchantment{
|
||||||
|
return self::getEnchantment(self::FLAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function INFINITY() : Enchantment{
|
||||||
|
return self::getEnchantment(self::INFINITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function KNOCKBACK() : Enchantment{
|
||||||
|
return self::getEnchantment(self::KNOCKBACK);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function MENDING() : Enchantment{
|
||||||
|
return self::getEnchantment(self::MENDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function POWER() : Enchantment{
|
||||||
|
return self::getEnchantment(self::POWER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function PROJECTILE_PROTECTION() : Enchantment{
|
||||||
|
return self::getEnchantment(self::PROJECTILE_PROTECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function PROTECTION() : Enchantment{
|
||||||
|
return self::getEnchantment(self::PROTECTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function PUNCH() : Enchantment{
|
||||||
|
return self::getEnchantment(self::PUNCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function RESPIRATION() : Enchantment{
|
||||||
|
return self::getEnchantment(self::RESPIRATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function SHARPNESS() : Enchantment{
|
||||||
|
return self::getEnchantment(self::SHARPNESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function SILK_TOUCH() : Enchantment{
|
||||||
|
return self::getEnchantment(self::SILK_TOUCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function THORNS() : Enchantment{
|
||||||
|
return self::getEnchantment(self::THORNS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function UNBREAKING() : Enchantment{
|
||||||
|
return self::getEnchantment(self::UNBREAKING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function VANISHING() : Enchantment{
|
||||||
|
return self::getEnchantment(self::VANISHING);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an enchantment type.
|
* Registers an enchantment type.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user