cn.nukkit.item.Item Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of powernukkit Show documentation
Show all versions of powernukkit Show documentation
A Minecraft Bedrock Edition server software implementation made in Java from scratch which supports all new features.
package cn.nukkit.item;
import cn.nukkit.Player;
import cn.nukkit.Server;
import cn.nukkit.api.*;
import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.blockproperty.UnknownRuntimeIdException;
import cn.nukkit.blockproperty.exception.InvalidBlockPropertyMetaException;
import cn.nukkit.blockstate.BlockState;
import cn.nukkit.blockstate.BlockStateRegistry;
import cn.nukkit.blockstate.exception.InvalidBlockStateException;
import cn.nukkit.entity.Entity;
import cn.nukkit.inventory.Fuel;
import cn.nukkit.item.enchantment.Enchantment;
import cn.nukkit.level.Level;
import cn.nukkit.math.BlockFace;
import cn.nukkit.math.Vector3;
import cn.nukkit.nbt.NBTIO;
import cn.nukkit.nbt.tag.*;
import cn.nukkit.utils.Binary;
import cn.nukkit.utils.Config;
import cn.nukkit.utils.Utils;
import io.netty.util.internal.EmptyArrays;
import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import lombok.extern.log4j.Log4j2;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.reflect.Modifier;
import java.nio.ByteOrder;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author MagicDroidX (Nukkit Project)
*/
@Log4j2
public class Item implements Cloneable, BlockID, ItemID {
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public static final Item[] EMPTY_ARRAY = new Item[0];
/**
* Groups:
*
* - namespace (optional)
* - item name (choice)
* - damage (optional, for item name)
* - numeric id (choice)
* - damage (optional, for numeric id)
*
*/
private static final Pattern ITEM_STRING_PATTERN = Pattern.compile(
// 1:namespace 2:name 3:damage 4:num-id 5:damage
"^(?:(?:([a-z_]\\w*):)?([a-z._]\\w*)(?::(-?\\d+))?|(-?\\d+)(?::(-?\\d+))?)$");
protected static String UNKNOWN_STR = "Unknown";
public static Class[] list = null;
private static Map itemIds = Arrays.stream(ItemID.class.getDeclaredFields())
.filter(field-> field.getModifiers() == (Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL))
.filter(field -> field.getType().equals(int.class))
.collect(Collectors.toMap(
field -> field.getName().toLowerCase(),
field -> {
try {
return field.getInt(null);
} catch (IllegalAccessException e) {
throw new InternalError(e);
}
},
(e1, e2) -> e1, LinkedHashMap::new
));
private static Map blockIds = Arrays.stream(BlockID.class.getDeclaredFields())
.filter(field-> field.getModifiers() == (Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL))
.filter(field -> field.getType().equals(int.class))
.collect(Collectors.toMap(
field -> field.getName().toLowerCase(),
field -> {
try {
int blockId = field.getInt(null);
if (blockId > 255) {
return 255 - blockId;
}
return blockId;
} catch (IllegalAccessException e) {
throw new InternalError(e);
}
},
(e1, e2) -> e1, LinkedHashMap::new
));
protected Block block = null;
protected final int id;
protected int meta;
protected boolean hasMeta = true;
private byte[] tags = EmptyArrays.EMPTY_BYTES;
private transient CompoundTag cachedNBT = null;
public int count;
@Deprecated
@DeprecationDetails(since = "1.4.0.0-PN", by = "PowerNukkit", reason = "Unused", replaceWith = "meta or getDamage()")
protected int durability = 0;
protected String name;
public Item(int id) {
this(id, 0, 1, UNKNOWN_STR);
}
public Item(int id, Integer meta) {
this(id, meta, 1, UNKNOWN_STR);
}
public Item(int id, Integer meta, int count) {
this(id, meta, count, UNKNOWN_STR);
}
public Item(int id, Integer meta, int count, String name) {
//this.id = id & 0xffff;
this.id = id;
if (meta != null && meta >= 0) {
this.meta = meta & 0xffff;
} else {
this.hasMeta = false;
}
this.count = count;
this.name = name != null? name.intern() : null;
/*f (this.block != null && this.id <= 0xff && Block.list[id] != null) { //probably useless
this.block = Block.get(this.id, this.meta);
this.name = this.block.getName();
}*/
}
public boolean hasMeta() {
return hasMeta;
}
public boolean canBeActivated() {
return false;
}
public static void init() {
if (list == null) {
list = new Class[65535];
list[IRON_SHOVEL] = ItemShovelIron.class; //256
list[IRON_PICKAXE] = ItemPickaxeIron.class; //257
list[IRON_AXE] = ItemAxeIron.class; //258
list[FLINT_AND_STEEL] = ItemFlintSteel.class; //259
list[APPLE] = ItemApple.class; //260
list[BOW] = ItemBow.class; //261
list[ARROW] = ItemArrow.class; //262
list[COAL] = ItemCoal.class; //263
list[DIAMOND] = ItemDiamond.class; //264
list[IRON_INGOT] = ItemIngotIron.class; //265
list[GOLD_INGOT] = ItemIngotGold.class; //266
list[IRON_SWORD] = ItemSwordIron.class; //267
list[WOODEN_SWORD] = ItemSwordWood.class; //268
list[WOODEN_SHOVEL] = ItemShovelWood.class; //269
list[WOODEN_PICKAXE] = ItemPickaxeWood.class; //270
list[WOODEN_AXE] = ItemAxeWood.class; //271
list[STONE_SWORD] = ItemSwordStone.class; //272
list[STONE_SHOVEL] = ItemShovelStone.class; //273
list[STONE_PICKAXE] = ItemPickaxeStone.class; //274
list[STONE_AXE] = ItemAxeStone.class; //275
list[DIAMOND_SWORD] = ItemSwordDiamond.class; //276
list[DIAMOND_SHOVEL] = ItemShovelDiamond.class; //277
list[DIAMOND_PICKAXE] = ItemPickaxeDiamond.class; //278
list[DIAMOND_AXE] = ItemAxeDiamond.class; //279
list[STICK] = ItemStick.class; //280
list[BOWL] = ItemBowl.class; //281
list[MUSHROOM_STEW] = ItemMushroomStew.class; //282
list[GOLD_SWORD] = ItemSwordGold.class; //283
list[GOLD_SHOVEL] = ItemShovelGold.class; //284
list[GOLD_PICKAXE] = ItemPickaxeGold.class; //285
list[GOLD_AXE] = ItemAxeGold.class; //286
list[STRING] = ItemString.class; //287
list[FEATHER] = ItemFeather.class; //288
list[GUNPOWDER] = ItemGunpowder.class; //289
list[WOODEN_HOE] = ItemHoeWood.class; //290
list[STONE_HOE] = ItemHoeStone.class; //291
list[IRON_HOE] = ItemHoeIron.class; //292
list[DIAMOND_HOE] = ItemHoeDiamond.class; //293
list[GOLD_HOE] = ItemHoeGold.class; //294
list[WHEAT_SEEDS] = ItemSeedsWheat.class; //295
list[WHEAT] = ItemWheat.class; //296
list[BREAD] = ItemBread.class; //297
list[LEATHER_CAP] = ItemHelmetLeather.class; //298
list[LEATHER_TUNIC] = ItemChestplateLeather.class; //299
list[LEATHER_PANTS] = ItemLeggingsLeather.class; //300
list[LEATHER_BOOTS] = ItemBootsLeather.class; //301
list[CHAIN_HELMET] = ItemHelmetChain.class; //302
list[CHAIN_CHESTPLATE] = ItemChestplateChain.class; //303
list[CHAIN_LEGGINGS] = ItemLeggingsChain.class; //304
list[CHAIN_BOOTS] = ItemBootsChain.class; //305
list[IRON_HELMET] = ItemHelmetIron.class; //306
list[IRON_CHESTPLATE] = ItemChestplateIron.class; //307
list[IRON_LEGGINGS] = ItemLeggingsIron.class; //308
list[IRON_BOOTS] = ItemBootsIron.class; //309
list[DIAMOND_HELMET] = ItemHelmetDiamond.class; //310
list[DIAMOND_CHESTPLATE] = ItemChestplateDiamond.class; //311
list[DIAMOND_LEGGINGS] = ItemLeggingsDiamond.class; //312
list[DIAMOND_BOOTS] = ItemBootsDiamond.class; //313
list[GOLD_HELMET] = ItemHelmetGold.class; //314
list[GOLD_CHESTPLATE] = ItemChestplateGold.class; //315
list[GOLD_LEGGINGS] = ItemLeggingsGold.class; //316
list[GOLD_BOOTS] = ItemBootsGold.class; //317
list[FLINT] = ItemFlint.class; //318
list[RAW_PORKCHOP] = ItemPorkchopRaw.class; //319
list[COOKED_PORKCHOP] = ItemPorkchopCooked.class; //320
list[PAINTING] = ItemPainting.class; //321
list[GOLDEN_APPLE] = ItemAppleGold.class; //322
list[SIGN] = ItemSign.class; //323
list[WOODEN_DOOR] = ItemDoorWood.class; //324
list[BUCKET] = ItemBucket.class; //325
list[MINECART] = ItemMinecart.class; //328
list[SADDLE] = ItemSaddle.class; //329
list[IRON_DOOR] = ItemDoorIron.class; //330
list[REDSTONE] = ItemRedstone.class; //331
list[SNOWBALL] = ItemSnowball.class; //332
list[BOAT] = ItemBoat.class; //333
list[LEATHER] = ItemLeather.class; //334
list[KELP] = ItemKelp.class; //335
list[BRICK] = ItemBrick.class; //336
list[CLAY] = ItemClay.class; //337
list[SUGARCANE] = ItemSugarcane.class; //338
list[PAPER] = ItemPaper.class; //339
list[BOOK] = ItemBook.class; //340
list[SLIMEBALL] = ItemSlimeball.class; //341
list[MINECART_WITH_CHEST] = ItemMinecartChest.class; //342
list[EGG] = ItemEgg.class; //344
list[COMPASS] = ItemCompass.class; //345
list[FISHING_ROD] = ItemFishingRod.class; //346
list[CLOCK] = ItemClock.class; //347
list[GLOWSTONE_DUST] = ItemGlowstoneDust.class; //348
list[RAW_FISH] = ItemFish.class; //349
list[COOKED_FISH] = ItemFishCooked.class; //350
list[DYE] = ItemDye.class; //351
list[BONE] = ItemBone.class; //352
list[SUGAR] = ItemSugar.class; //353
list[CAKE] = ItemCake.class; //354
list[BED] = ItemBed.class; //355
list[REPEATER] = ItemRedstoneRepeater.class; //356
list[COOKIE] = ItemCookie.class; //357
list[MAP] = ItemMap.class; //358
list[SHEARS] = ItemShears.class; //359
list[MELON] = ItemMelon.class; //360
list[PUMPKIN_SEEDS] = ItemSeedsPumpkin.class; //361
list[MELON_SEEDS] = ItemSeedsMelon.class; //362
list[RAW_BEEF] = ItemBeefRaw.class; //363
list[STEAK] = ItemSteak.class; //364
list[RAW_CHICKEN] = ItemChickenRaw.class; //365
list[COOKED_CHICKEN] = ItemChickenCooked.class; //366
list[ROTTEN_FLESH] = ItemRottenFlesh.class; //367
list[ENDER_PEARL] = ItemEnderPearl.class; //368
list[BLAZE_ROD] = ItemBlazeRod.class; //369
list[GHAST_TEAR] = ItemGhastTear.class; //370
list[GOLD_NUGGET] = ItemNuggetGold.class; //371
list[NETHER_WART] = ItemNetherWart.class; //372
list[POTION] = ItemPotion.class; //373
list[GLASS_BOTTLE] = ItemGlassBottle.class; //374
list[SPIDER_EYE] = ItemSpiderEye.class; //375
list[FERMENTED_SPIDER_EYE] = ItemSpiderEyeFermented.class; //376
list[BLAZE_POWDER] = ItemBlazePowder.class; //377
list[MAGMA_CREAM] = ItemMagmaCream.class; //378
list[BREWING_STAND] = ItemBrewingStand.class; //379
list[CAULDRON] = ItemCauldron.class; //380
list[ENDER_EYE] = ItemEnderEye.class; //381
list[GLISTERING_MELON] = ItemMelonGlistering.class; //382
list[SPAWN_EGG] = ItemSpawnEgg.class; //383
list[EXPERIENCE_BOTTLE] = ItemExpBottle.class; //384
list[FIRE_CHARGE] = ItemFireCharge.class; //385
list[BOOK_AND_QUILL] = ItemBookAndQuill.class; //386
list[WRITTEN_BOOK] = ItemBookWritten.class; //387
list[EMERALD] = ItemEmerald.class; //388
list[ITEM_FRAME] = ItemItemFrame.class; //389
list[FLOWER_POT] = ItemFlowerPot.class; //390
list[CARROT] = ItemCarrot.class; //391
list[POTATO] = ItemPotato.class; //392
list[BAKED_POTATO] = ItemPotatoBaked.class; //393
list[POISONOUS_POTATO] = ItemPotatoPoisonous.class; //394
list[EMPTY_MAP] = ItemEmptyMap.class; //395
list[GOLDEN_CARROT] = ItemCarrotGolden.class; //396
list[SKULL] = ItemSkull.class; //397
list[CARROT_ON_A_STICK] = ItemCarrotOnAStick.class; //398
list[NETHER_STAR] = ItemNetherStar.class; //399
list[PUMPKIN_PIE] = ItemPumpkinPie.class; //400
list[FIREWORKS] = ItemFirework.class; //401
list[ENCHANTED_BOOK] = ItemBookEnchanted.class; //403
list[COMPARATOR] = ItemRedstoneComparator.class; //404
list[NETHER_BRICK] = ItemNetherBrick.class; //405
list[QUARTZ] = ItemQuartz.class; //406
list[MINECART_WITH_TNT] = ItemMinecartTNT.class; //407
list[MINECART_WITH_HOPPER] = ItemMinecartHopper.class; //408
list[PRISMARINE_SHARD] = ItemPrismarineShard.class; //409
list[HOPPER] = ItemHopper.class;
list[RAW_RABBIT] = ItemRabbitRaw.class; //411
list[COOKED_RABBIT] = ItemRabbitCooked.class; //412
list[RABBIT_STEW] = ItemRabbitStew.class; //413
list[RABBIT_FOOT] = ItemRabbitFoot.class; //414
list[RABBIT_HIDE] = ItemRabbitHide.class; //415
list[LEATHER_HORSE_ARMOR] = ItemHorseArmorLeather.class; //416
list[IRON_HORSE_ARMOR] = ItemHorseArmorIron.class; //417
list[GOLD_HORSE_ARMOR] = ItemHorseArmorGold.class; //418
list[DIAMOND_HORSE_ARMOR] = ItemHorseArmorDiamond.class; //419
list[LEAD] = ItemLead.class; //420
list[NAME_TAG] = ItemNameTag.class; //421
list[PRISMARINE_CRYSTALS] = ItemPrismarineCrystals.class; //422
list[RAW_MUTTON] = ItemMuttonRaw.class; //423
list[COOKED_MUTTON] = ItemMuttonCooked.class; //424
list[ARMOR_STAND] = ItemArmorStand.class; //425
list[END_CRYSTAL] = ItemEndCrystal.class; //426
list[SPRUCE_DOOR] = ItemDoorSpruce.class; //427
list[BIRCH_DOOR] = ItemDoorBirch.class; //428
list[JUNGLE_DOOR] = ItemDoorJungle.class; //429
list[ACACIA_DOOR] = ItemDoorAcacia.class; //430
list[DARK_OAK_DOOR] = ItemDoorDarkOak.class; //431
list[CHORUS_FRUIT] = ItemChorusFruit.class; //432
list[POPPED_CHORUS_FRUIT] = ItemChorusFruitPopped.class; //433
list[BANNER_PATTERN] = ItemBannerPattern.class; //434
list[DRAGON_BREATH] = ItemDragonBreath.class; //437
list[SPLASH_POTION] = ItemPotionSplash.class; //438
list[LINGERING_POTION] = ItemPotionLingering.class; //441
list[ELYTRA] = ItemElytra.class; //444
list[SHULKER_SHELL] = ItemShulkerShell.class; //445
list[BANNER] = ItemBanner.class; //446
list[TOTEM] = ItemTotem.class; //450
list[IRON_NUGGET] = ItemNuggetIron.class; //452
list[TRIDENT] = ItemTrident.class; //455
list[BEETROOT] = ItemBeetroot.class; //457
list[BEETROOT_SEEDS] = ItemSeedsBeetroot.class; //458
list[BEETROOT_SOUP] = ItemBeetrootSoup.class; //459
list[RAW_SALMON] = ItemSalmon.class; //460
list[CLOWNFISH] = ItemClownfish.class; //461
list[PUFFERFISH] = ItemPufferfish.class; //462
list[COOKED_SALMON] = ItemSalmonCooked.class; //463
list[DRIED_KELP] = ItemDriedKelp.class; //464
list[GOLDEN_APPLE_ENCHANTED] = ItemAppleGoldEnchanted.class; //466
list[TURTLE_SHELL] = ItemTurtleShell.class; //469
list[CROSSBOW] = ItemCrossbow.class; //471
list[SPRUCE_SIGN] = ItemSpruceSign.class; //472
list[BIRCH_SIGN] = ItemBirchSign.class; //473
list[JUNGLE_SIGN] = ItemJungleSign.class; //474
list[ACACIA_SIGN] = ItemAcaciaSign.class; //475
list[DARKOAK_SIGN] = ItemDarkOakSign.class; //476
list[SWEET_BERRIES] = ItemSweetBerries.class; //477
list[RECORD_13] = ItemRecord13.class; //500
list[RECORD_CAT] = ItemRecordCat.class; //501
list[RECORD_BLOCKS] = ItemRecordBlocks.class; //502
list[RECORD_CHIRP] = ItemRecordChirp.class; //503
list[RECORD_FAR] = ItemRecordFar.class; //504
list[RECORD_MALL] = ItemRecordMall.class; //505
list[RECORD_MELLOHI] = ItemRecordMellohi.class; //506
list[RECORD_STAL] = ItemRecordStal.class; //507
list[RECORD_STRAD] = ItemRecordStrad.class; //508
list[RECORD_WARD] = ItemRecordWard.class; //509
list[RECORD_11] = ItemRecord11.class; //510
list[RECORD_WAIT] = ItemRecordWait.class; //511
list[SHIELD] = ItemShield.class; //513
list[CAMPFIRE] = ItemCampfire.class; //720
list[SUSPICIOUS_STEW] = ItemSuspiciousStew.class; //734
list[HONEYCOMB] = ItemHoneycomb.class; //736
list[HONEY_BOTTLE] = ItemHoneyBottle.class; //737
list[LODESTONECOMPASS] = ItemCompassLodestone.class; //741;
list[NETHERITE_INGOT] = ItemIngotNetherite.class; //742
list[NETHERITE_SWORD] = ItemSwordNetherite.class; //743
list[NETHERITE_SHOVEL] = ItemShovelNetherite.class; //744
list[NETHERITE_PICKAXE] = ItemPickaxeNetherite.class; //745
list[NETHERITE_AXE] = ItemAxeNetherite.class; //746
list[NETHERITE_HOE] = ItemHoeNetherite.class; //747
list[NETHERITE_HELMET] = ItemHelmetNetherite.class; //748
list[NETHERITE_CHESTPLATE] = ItemChestplateNetherite.class; //749
list[NETHERITE_LEGGINGS] = ItemLeggingsNetherite.class; //750
list[NETHERITE_BOOTS] = ItemBootsNetherite.class; //751
list[NETHERITE_SCRAP] = ItemScrapNetherite.class; //752
list[CRIMSON_SIGN] = ItemCrimsonSign.class; //753
list[WARPED_SIGN] = ItemWarpedSign.class; //754
list[CRIMSON_DOOR] = ItemDoorCrimson.class; //755
list[WARPED_DOOR] = ItemDoorWarped.class; //756
list[WARPED_FUNGUS_ON_A_STICK] = ItemWarpedFungusOnAStick.class; //757
list[CHAIN] = ItemChain.class; //758
list[RECORD_PIGSTEP] = ItemRecordPigstep.class; //759
list[NETHER_SPROUTS] = ItemNetherSprouts.class; //760
list[SOUL_CAMPFIRE] = ItemCampfireSoul.class; //801
for (int i = 0; i < 256; ++i) {
if (Block.list[i] != null) {
list[i] = Block.list[i];
}
}
}
initCreativeItems();
}
private static List itemList;
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public static List rebuildItemList() {
return itemList = Collections.unmodifiableList(Stream.of(
BlockStateRegistry.getPersistenceNames().stream()
.map(name-> name.substring(name.indexOf(':') + 1)),
itemIds.keySet().stream()
).flatMap(Function.identity()).distinct().collect(Collectors.toList()));
}
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public static List getItemList() {
List itemList = Item.itemList;
if (itemList == null) {
return rebuildItemList();
}
return itemList;
}
private static final ArrayList- creative = new ArrayList<>();
@SuppressWarnings("unchecked")
private static void initCreativeItems() {
clearCreativeItems();
Config config = new Config(Config.JSON);
config.load(Server.class.getClassLoader().getResourceAsStream("creativeitems.json"));
List