Update to Minecraft 1.20.5

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot
2024-04-24 01:15:00 +10:00
parent 4deda9501f
commit 65bc2541a3
524 changed files with 7788 additions and 6181 deletions

View File

@@ -2,8 +2,6 @@ package org.bukkit.craftbukkit.block;
import net.minecraft.core.BlockPosition;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.EntityTypes;
import net.minecraft.world.entity.animal.EntityBee;
import net.minecraft.world.level.GeneratorAccessSeed;
import net.minecraft.world.level.World;
import net.minecraft.world.level.block.entity.TileEntity;
@@ -63,9 +61,7 @@ public final class CapturedBlockState extends CraftBlockState {
int j = 2 + random.nextInt(2);
for (int k = 0; k < j; ++k) {
EntityBee entitybee = new EntityBee(EntityTypes.BEE, generatoraccessseed.getMinecraftWorld());
tileentitybeehive.addOccupantWithPresetTicks(entitybee, false, random.nextInt(599));
tileentitybeehive.storeBee(TileEntityBeehive.c.create(random.nextInt(599)));
}
}
// End copied block

View File

@@ -3,17 +3,16 @@ package org.bukkit.craftbukkit.block;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.item.EnumColor;
import net.minecraft.world.level.block.BlockBannerAbstract;
import net.minecraft.world.level.block.entity.BannerPatternLayers;
import net.minecraft.world.level.block.entity.TileEntityBanner;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Banner;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.bukkit.craftbukkit.block.banner.CraftPatternType;
public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> implements Banner {
@@ -35,10 +34,10 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme
base = DyeColor.getByWoolData((byte) ((BlockBannerAbstract) this.data.getBlock()).getColor().getId());
patterns = new ArrayList<Pattern>();
if (banner.itemPatterns != null) {
for (int i = 0; i < banner.itemPatterns.size(); i++) {
NBTTagCompound p = (NBTTagCompound) banner.itemPatterns.get(i);
patterns.add(new Pattern(DyeColor.getByWoolData((byte) p.getInt("Color")), PatternType.getByIdentifier(p.getString("Pattern"))));
if (banner.getPatterns() != null) {
for (int i = 0; i < banner.getPatterns().layers().size(); i++) {
BannerPatternLayers.b p = banner.getPatterns().layers().get(i);
patterns.add(new Pattern(DyeColor.getByWoolData((byte) p.color().getId()), CraftPatternType.minecraftHolderToBukkit(p.pattern())));
}
}
}
@@ -95,15 +94,12 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme
banner.baseColor = EnumColor.byId(base.getWoolData());
NBTTagList newPatterns = new NBTTagList();
List<BannerPatternLayers.b> newPatterns = new ArrayList<>();
for (Pattern p : patterns) {
NBTTagCompound compound = new NBTTagCompound();
compound.putInt("Color", p.getColor().getWoolData());
compound.putString("Pattern", p.getPattern().getIdentifier());
newPatterns.add(compound);
newPatterns.add(new net.minecraft.world.level.block.entity.BannerPatternLayers.b(CraftPatternType.bukkitToMinecraftHolder(p.getPattern()), EnumColor.byId(p.getColor().getWoolData())));
}
banner.itemPatterns = newPatterns;
banner.setPatterns(new BannerPatternLayers(newPatterns));
}
@Override

View File

@@ -59,7 +59,7 @@ public class CraftBeacon extends CraftBlockEntityState<TileEntityBeacon> impleme
@Override
public void setPrimaryEffect(PotionEffectType effect) {
this.getSnapshot().primaryPower = (effect != null) ? CraftPotionEffectType.bukkitToMinecraft(effect) : null;
this.getSnapshot().primaryPower = (effect != null) ? CraftPotionEffectType.bukkitToMinecraftHolder(effect) : null;
}
@Override
@@ -69,7 +69,7 @@ public class CraftBeacon extends CraftBlockEntityState<TileEntityBeacon> impleme
@Override
public void setSecondaryEffect(PotionEffectType effect) {
this.getSnapshot().secondaryPower = (effect != null) ? CraftPotionEffectType.bukkitToMinecraft(effect) : null;
this.getSnapshot().secondaryPower = (effect != null) ? CraftPotionEffectType.bukkitToMinecraftHolder(effect) : null;
}
@Override
@@ -85,12 +85,12 @@ public class CraftBeacon extends CraftBlockEntityState<TileEntityBeacon> impleme
@Override
public boolean isLocked() {
return !this.getSnapshot().lockKey.key.isEmpty();
return !this.getSnapshot().lockKey.key().isEmpty();
}
@Override
public String getLock() {
return this.getSnapshot().lockKey.key;
return this.getSnapshot().lockKey.key();
}
@Override

View File

@@ -83,7 +83,7 @@ public class CraftBeehive extends CraftBlockEntityState<TileEntityBeehive> imple
public void addEntity(Bee entity) {
Preconditions.checkArgument(entity != null, "Entity must not be null");
getSnapshot().addOccupant(((CraftBee) entity).getHandle(), false);
getSnapshot().addOccupant(((CraftBee) entity).getHandle());
}
@Override

View File

@@ -1,9 +1,14 @@
package org.bukkit.craftbukkit.block;
import net.minecraft.core.IRegistryCustom;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponentPatch;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.PacketListenerPlayOut;
import net.minecraft.network.protocol.game.PacketPlayOutTileEntityData;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.level.GeneratorAccess;
import net.minecraft.world.level.block.entity.TileEntity;
import org.bukkit.Location;
import org.bukkit.World;
@@ -39,27 +44,40 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
this.load(tileEntity);
}
private IRegistryCustom getRegistryAccess() {
GeneratorAccess worldHandle = getWorldHandle();
return (worldHandle != null) ? worldHandle.registryAccess() : MinecraftServer.getDefaultRegistryAccess();
}
private T createSnapshot(T tileEntity) {
if (tileEntity == null) {
return null;
}
NBTTagCompound nbtTagCompound = tileEntity.saveWithFullMetadata();
T snapshot = (T) TileEntity.loadStatic(getPosition(), getHandle(), nbtTagCompound);
NBTTagCompound nbtTagCompound = tileEntity.saveWithFullMetadata(getRegistryAccess());
T snapshot = (T) TileEntity.loadStatic(getPosition(), getHandle(), nbtTagCompound, getRegistryAccess());
return snapshot;
}
public void applyComponents(DataComponentMap datacomponentmap, DataComponentPatch datacomponentpatch) {
snapshot.applyComponents(datacomponentmap, datacomponentpatch);
}
public DataComponentMap collectComponents() {
return snapshot.collectComponents();
}
// Loads the specified data into the snapshot TileEntity.
public void loadData(NBTTagCompound nbtTagCompound) {
snapshot.load(nbtTagCompound);
snapshot.loadWithComponents(nbtTagCompound, getRegistryAccess());
load(snapshot);
}
// copies the TileEntity-specific data, retains the position
private void copyData(T from, T to) {
NBTTagCompound nbtTagCompound = from.saveWithFullMetadata();
to.load(nbtTagCompound);
NBTTagCompound nbtTagCompound = from.saveWithFullMetadata(getRegistryAccess());
to.loadWithComponents(nbtTagCompound, getRegistryAccess());
}
// gets the wrapped TileEntity
@@ -84,7 +102,13 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
// update snapshot
applyTo(snapshot);
return snapshot.saveWithFullMetadata();
return snapshot.saveWithFullMetadata(getRegistryAccess());
}
public NBTTagCompound getSnapshotNBTWithoutComponents() {
NBTTagCompound nbt = getSnapshotNBT();
snapshot.removeComponentsFromTag(nbt);
return nbt;
}
// copies the data of the given tile entity to this block state
@@ -128,7 +152,7 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
@Nullable
public Packet<PacketListenerPlayOut> getUpdatePacket(@NotNull Location location) {
T vanillaTileEntitiy = (T) TileEntity.loadStatic(CraftLocation.toBlockPosition(location), getHandle(), getSnapshotNBT());
T vanillaTileEntitiy = (T) TileEntity.loadStatic(CraftLocation.toBlockPosition(location), getHandle(), getSnapshotNBT(), getRegistryAccess());
return PacketPlayOutTileEntityData.create(vanillaTileEntitiy);
}

View File

@@ -9,8 +9,11 @@ import java.util.Map;
import java.util.function.BiFunction;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPosition;
import net.minecraft.core.IRegistryCustom;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.level.GeneratorAccess;
import net.minecraft.world.level.IWorldReader;
import net.minecraft.world.level.block.entity.BrushableBlockEntity;
import net.minecraft.world.level.block.entity.CalibratedSculkSensorBlockEntity;
import net.minecraft.world.level.block.entity.ChiseledBookShelfBlockEntity;
@@ -54,6 +57,7 @@ import net.minecraft.world.level.block.entity.TileEntitySkull;
import net.minecraft.world.level.block.entity.TileEntitySmoker;
import net.minecraft.world.level.block.entity.TileEntityStructure;
import net.minecraft.world.level.block.entity.TrialSpawnerBlockEntity;
import net.minecraft.world.level.block.entity.vault.VaultBlockEntity;
import net.minecraft.world.level.block.piston.TileEntityPiston;
import net.minecraft.world.level.block.state.IBlockData;
import org.bukkit.Material;
@@ -336,6 +340,7 @@ public final class CraftBlockStates {
register(Material.TRAPPED_CHEST, CraftChest.class, CraftChest::new, TileEntityChestTrapped::new);
register(Material.CRAFTER, CraftCrafter.class, CraftCrafter::new, CrafterBlockEntity::new);
register(Material.TRIAL_SPAWNER, CraftTrialSpawner.class, CraftTrialSpawner::new, TrialSpawnerBlockEntity::new);
register(Material.VAULT, CraftVault.class, CraftVault::new, VaultBlockEntity::new);
}
private static void register(Material blockType, BlockStateFactory<?> factory) {
@@ -394,24 +399,34 @@ public final class CraftBlockStates {
return blockState;
}
@Deprecated
public static BlockState getBlockState(Material material, @Nullable NBTTagCompound blockEntityTag) {
return getBlockState(BlockPosition.ZERO, material, blockEntityTag);
return getBlockState(MinecraftServer.getDefaultRegistryAccess(), BlockPosition.ZERO, material, blockEntityTag);
}
public static BlockState getBlockState(BlockPosition blockPosition, Material material, @Nullable NBTTagCompound blockEntityTag) {
public static BlockState getBlockState(IWorldReader world, BlockPosition blockPosition, Material material, @Nullable NBTTagCompound blockEntityTag) {
return getBlockState(world.registryAccess(), blockPosition, material, blockEntityTag);
}
public static BlockState getBlockState(IRegistryCustom registry, BlockPosition blockPosition, Material material, @Nullable NBTTagCompound blockEntityTag) {
Preconditions.checkNotNull(material, "material is null");
IBlockData blockData = CraftBlockType.bukkitToMinecraft(material).defaultBlockState();
return getBlockState(blockPosition, blockData, blockEntityTag);
return getBlockState(registry, blockPosition, blockData, blockEntityTag);
}
@Deprecated
public static BlockState getBlockState(IBlockData blockData, @Nullable NBTTagCompound blockEntityTag) {
return getBlockState(BlockPosition.ZERO, blockData, blockEntityTag);
return getBlockState(MinecraftServer.getDefaultRegistryAccess(), BlockPosition.ZERO, blockData, blockEntityTag);
}
public static BlockState getBlockState(BlockPosition blockPosition, IBlockData blockData, @Nullable NBTTagCompound blockEntityTag) {
public static BlockState getBlockState(IWorldReader world, BlockPosition blockPosition, IBlockData blockData, @Nullable NBTTagCompound blockEntityTag) {
return getBlockState(world.registryAccess(), blockPosition, blockData, blockEntityTag);
}
public static BlockState getBlockState(IRegistryCustom registry, BlockPosition blockPosition, IBlockData blockData, @Nullable NBTTagCompound blockEntityTag) {
Preconditions.checkNotNull(blockPosition, "blockPosition is null");
Preconditions.checkNotNull(blockData, "blockData is null");
TileEntity tileEntity = (blockEntityTag == null) ? null : TileEntity.loadStatic(blockPosition, blockData, blockEntityTag);
TileEntity tileEntity = (blockEntityTag == null) ? null : TileEntity.loadStatic(blockPosition, blockData, blockEntityTag, registry);
return getBlockState(null, blockPosition, blockData, tileEntity);
}

View File

@@ -1,13 +1,11 @@
package org.bukkit.craftbukkit.block;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.world.level.block.entity.BrushableBlockEntity;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.BrushableBlock;
import org.bukkit.craftbukkit.CraftLootTable;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.loot.LootTable;
@@ -36,18 +34,13 @@ public class CraftBrushableBlock extends CraftBlockEntityState<BrushableBlockEnt
super.applyTo(lootable);
if (this.getSnapshot().lootTable == null) {
lootable.setLootTable((MinecraftKey) null, 0L);
lootable.setLootTable(null, 0L);
}
}
@Override
public LootTable getLootTable() {
if (getSnapshot().lootTable == null) {
return null;
}
MinecraftKey key = getSnapshot().lootTable;
return Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(key));
return CraftLootTable.minecraftToBukkit(getSnapshot().lootTable);
}
@Override
@@ -66,8 +59,7 @@ public class CraftBrushableBlock extends CraftBlockEntityState<BrushableBlockEnt
}
private void setLootTable(LootTable table, long seed) {
MinecraftKey key = (table == null) ? null : CraftNamespacedKey.toMinecraft(table.getKey());
getSnapshot().setLootTable(key, seed);
getSnapshot().setLootTable(CraftLootTable.bukkitToMinecraft(table), seed);
}
@Override

View File

@@ -70,7 +70,14 @@ public class CraftChiseledBookshelf extends CraftBlockEntityState<ChiseledBookSh
return -1;
}
return ChiseledBookShelfBlock.getHitSlot(faceVector);
return getHitSlot(faceVector);
}
private static int getHitSlot(Vec2F vec2f) {
int i = vec2f.y >= 0.5F ? 0 : 1;
int j = ChiseledBookShelfBlock.getSection(vec2f.x);
return j + i * 3;
}
@Override

View File

@@ -33,7 +33,7 @@ public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand>
@Override
public void setName(String name) {
getSnapshot().getCommandBlock().setName(CraftChatMessage.fromStringOrNull(name != null ? name : "@"));
getSnapshot().getCommandBlock().setCustomName(CraftChatMessage.fromStringOrNull(name != null ? name : "@"));
}
@Override

View File

@@ -19,12 +19,12 @@ public abstract class CraftContainer<T extends TileEntityContainer> extends Craf
@Override
public boolean isLocked() {
return !this.getSnapshot().lockKey.key.isEmpty();
return !this.getSnapshot().lockKey.key().isEmpty();
}
@Override
public String getLock() {
return this.getSnapshot().lockKey.key;
return this.getSnapshot().lockKey.key();
}
@Override
@@ -40,7 +40,7 @@ public abstract class CraftContainer<T extends TileEntityContainer> extends Craf
@Override
public void setCustomName(String name) {
this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name));
this.getSnapshot().name = CraftChatMessage.fromStringOrNull(name);
}
@Override
@@ -48,7 +48,7 @@ public abstract class CraftContainer<T extends TileEntityContainer> extends Craf
super.applyTo(container);
if (this.getSnapshot().name == null) {
container.setCustomName(null);
container.name = null;
}
}

View File

@@ -3,14 +3,18 @@ package org.bukkit.craftbukkit.block;
import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.InclusiveRange;
import net.minecraft.util.RandomSource;
import net.minecraft.util.random.SimpleWeightedRandomList;
import net.minecraft.util.random.WeightedEntry.b;
import net.minecraft.world.entity.EntityTypes;
import net.minecraft.world.entity.EquipmentTable;
import net.minecraft.world.level.MobSpawnerData;
import net.minecraft.world.level.block.entity.TileEntityMobSpawner;
import org.bukkit.Location;
@@ -18,6 +22,8 @@ import org.bukkit.World;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.block.spawner.SpawnRule;
import org.bukkit.block.spawner.SpawnerEntry;
import org.bukkit.craftbukkit.CraftEquipmentSlot;
import org.bukkit.craftbukkit.CraftLootTable;
import org.bukkit.craftbukkit.entity.CraftEntitySnapshot;
import org.bukkit.craftbukkit.entity.CraftEntityType;
import org.bukkit.entity.EntitySnapshot;
@@ -72,7 +78,7 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
NBTTagCompound compoundTag = ((CraftEntitySnapshot) snapshot).getData();
this.getSnapshot().getSpawner().spawnPotentials = SimpleWeightedRandomList.empty();
this.getSnapshot().getSpawner().nextSpawnData = new MobSpawnerData(compoundTag, Optional.empty());
this.getSnapshot().getSpawner().nextSpawnData = new MobSpawnerData(compoundTag, Optional.empty(), Optional.empty());
}
@Override
@@ -80,8 +86,8 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
NBTTagCompound compoundTag = ((CraftEntitySnapshot) snapshot).getData();
SimpleWeightedRandomList.a<MobSpawnerData> builder = SimpleWeightedRandomList.builder(); // PAIL rename Builder
this.getSnapshot().getSpawner().spawnPotentials.unwrap().forEach(entry -> builder.add(entry.getData(), entry.getWeight().asInt()));
builder.add(new MobSpawnerData(compoundTag, Optional.ofNullable(toMinecraftRule(spawnRule))), weight);
this.getSnapshot().getSpawner().spawnPotentials.unwrap().forEach(entry -> builder.add(entry.data(), entry.getWeight().asInt()));
builder.add(new MobSpawnerData(compoundTag, Optional.ofNullable(toMinecraftRule(spawnRule)), Optional.empty()), weight);
this.getSnapshot().getSpawner().spawnPotentials = builder.build();
}
@@ -95,7 +101,7 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
SimpleWeightedRandomList.a<MobSpawnerData> builder = SimpleWeightedRandomList.builder();
for (SpawnerEntry spawnerEntry : entries) {
NBTTagCompound compoundTag = ((CraftEntitySnapshot) spawnerEntry.getSnapshot()).getData();
builder.add(new MobSpawnerData(compoundTag, Optional.ofNullable(toMinecraftRule(spawnerEntry.getSpawnRule()))), spawnerEntry.getSpawnWeight());
builder.add(new MobSpawnerData(compoundTag, Optional.ofNullable(toMinecraftRule(spawnerEntry.getSpawnRule())), getEquipment(spawnerEntry.getEquipment())), spawnerEntry.getSpawnWeight());
}
this.getSnapshot().getSpawner().spawnPotentials = builder.build();
}
@@ -105,11 +111,11 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
List<SpawnerEntry> entries = new ArrayList<>();
for (b<MobSpawnerData> entry : this.getSnapshot().getSpawner().spawnPotentials.unwrap()) { // PAIL rename Wrapper
CraftEntitySnapshot snapshot = CraftEntitySnapshot.create(entry.getData().getEntityToSpawn());
CraftEntitySnapshot snapshot = CraftEntitySnapshot.create(entry.data().getEntityToSpawn());
if (snapshot != null) {
SpawnRule rule = entry.getData().customSpawnRules().map(this::fromMinecraftRule).orElse(null);
entries.add(new SpawnerEntry(snapshot, entry.getWeight().asInt(), rule));
SpawnRule rule = entry.data().customSpawnRules().map(this::fromMinecraftRule).orElse(null);
entries.add(new SpawnerEntry(snapshot, entry.getWeight().asInt(), rule, getEquipment(entry.data().equipment())));
}
}
return entries;
@@ -123,10 +129,10 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
}
private SpawnRule fromMinecraftRule(MobSpawnerData.a rule) {
InclusiveRange<Integer> blockLight = rule.blockLightLimit();
InclusiveRange<Integer> skyLight = rule.skyLightLimit();
InclusiveRange<Integer> blockLight = rule.blockLightLimit();
InclusiveRange<Integer> skyLight = rule.skyLightLimit();
return new SpawnRule(blockLight.maxInclusive(), blockLight.maxInclusive(), skyLight.minInclusive(), skyLight.maxInclusive());
return new SpawnRule(blockLight.maxInclusive(), blockLight.maxInclusive(), skyLight.minInclusive(), skyLight.maxInclusive());
}
@Override
@@ -233,4 +239,22 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
public CraftCreatureSpawner copy(Location location) {
return new CraftCreatureSpawner(this, location);
}
private static Optional<EquipmentTable> getEquipment(SpawnerEntry.Equipment bukkit) {
if (bukkit == null) {
return Optional.empty();
}
return Optional.of(new EquipmentTable(
CraftLootTable.bukkitToMinecraft(bukkit.getEquipmentLootTable()),
bukkit.getDropChances().entrySet().stream().collect(Collectors.toMap((entry) -> CraftEquipmentSlot.getNMS(entry.getKey()), Map.Entry::getValue)))
);
}
private static SpawnerEntry.Equipment getEquipment(Optional<EquipmentTable> optional) {
return optional.map((nms) -> new SpawnerEntry.Equipment(
CraftLootTable.minecraftToBukkit(nms.lootTable()),
new HashMap<>(nms.slotDropChances().entrySet().stream().collect(Collectors.toMap((entry) -> CraftEquipmentSlot.getSlot(entry.getKey()), Map.Entry::getValue)))
)).orElse(null);
}
}

View File

@@ -4,10 +4,12 @@ import com.google.common.base.Preconditions;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.entity.DecoratedPotBlockEntity;
import net.minecraft.world.level.block.entity.PotDecorations;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
@@ -46,14 +48,14 @@ public class CraftDecoratedPot extends CraftBlockEntityState<DecoratedPotBlockEn
Preconditions.checkArgument(face != null, "face must not be null");
Preconditions.checkArgument(sherd == null || sherd == Material.BRICK || Tag.ITEMS_DECORATED_POT_SHERDS.isTagged(sherd), "sherd is not a valid sherd material: %s", sherd);
Item sherdItem = (sherd != null) ? CraftItemType.bukkitToMinecraft(sherd) : Items.BRICK;
DecoratedPotBlockEntity.Decoration decorations = getSnapshot().getDecorations();
Optional<Item> sherdItem = (sherd != null) ? Optional.of(CraftItemType.bukkitToMinecraft(sherd)) : Optional.of(Items.BRICK);
PotDecorations decorations = getSnapshot().getDecorations();
switch (face) {
case BACK -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(sherdItem, decorations.left(), decorations.right(), decorations.front());
case LEFT -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(decorations.back(), sherdItem, decorations.right(), decorations.front());
case RIGHT -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(decorations.back(), decorations.left(), sherdItem, decorations.front());
case FRONT -> getSnapshot().decorations = new DecoratedPotBlockEntity.Decoration(decorations.back(), decorations.left(), decorations.right(), sherdItem);
case BACK -> getSnapshot().decorations = new PotDecorations(sherdItem, decorations.left(), decorations.right(), decorations.front());
case LEFT -> getSnapshot().decorations = new PotDecorations(decorations.back(), sherdItem, decorations.right(), decorations.front());
case RIGHT -> getSnapshot().decorations = new PotDecorations(decorations.back(), decorations.left(), sherdItem, decorations.front());
case FRONT -> getSnapshot().decorations = new PotDecorations(decorations.back(), decorations.left(), decorations.right(), sherdItem);
default -> throw new IllegalArgumentException("Unexpected value: " + face);
}
}
@@ -62,8 +64,8 @@ public class CraftDecoratedPot extends CraftBlockEntityState<DecoratedPotBlockEn
public Material getSherd(Side face) {
Preconditions.checkArgument(face != null, "face must not be null");
DecoratedPotBlockEntity.Decoration decorations = getSnapshot().getDecorations();
Item sherdItem = switch (face) {
PotDecorations decorations = getSnapshot().getDecorations();
Optional<Item> sherdItem = switch (face) {
case BACK -> decorations.back();
case LEFT -> decorations.left();
case RIGHT -> decorations.right();
@@ -71,24 +73,24 @@ public class CraftDecoratedPot extends CraftBlockEntityState<DecoratedPotBlockEn
default -> throw new IllegalArgumentException("Unexpected value: " + face);
};
return CraftItemType.minecraftToBukkit(sherdItem);
return CraftItemType.minecraftToBukkit(sherdItem.orElse(Items.BRICK));
}
@Override
public Map<Side, Material> getSherds() {
DecoratedPotBlockEntity.Decoration decorations = getSnapshot().getDecorations();
PotDecorations decorations = getSnapshot().getDecorations();
Map<Side, Material> sherds = new EnumMap<>(Side.class);
sherds.put(Side.BACK, CraftItemType.minecraftToBukkit(decorations.back()));
sherds.put(Side.LEFT, CraftItemType.minecraftToBukkit(decorations.left()));
sherds.put(Side.RIGHT, CraftItemType.minecraftToBukkit(decorations.right()));
sherds.put(Side.FRONT, CraftItemType.minecraftToBukkit(decorations.front()));
sherds.put(Side.BACK, CraftItemType.minecraftToBukkit(decorations.back().orElse(Items.BRICK)));
sherds.put(Side.LEFT, CraftItemType.minecraftToBukkit(decorations.left().orElse(Items.BRICK)));
sherds.put(Side.RIGHT, CraftItemType.minecraftToBukkit(decorations.right().orElse(Items.BRICK)));
sherds.put(Side.FRONT, CraftItemType.minecraftToBukkit(decorations.front().orElse(Items.BRICK)));
return sherds;
}
@Override
public List<Material> getShards() {
return getSnapshot().getDecorations().sorted().map(CraftItemType::minecraftToBukkit).collect(Collectors.toUnmodifiableList());
return getSnapshot().getDecorations().ordered().stream().map(CraftItemType::minecraftToBukkit).collect(Collectors.toUnmodifiableList());
}
@Override

View File

@@ -1,12 +1,10 @@
package org.bukkit.craftbukkit.block;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.world.level.block.entity.TileEntityLootable;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Nameable;
import org.bukkit.World;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.craftbukkit.CraftLootTable;
import org.bukkit.loot.LootTable;
import org.bukkit.loot.Lootable;
@@ -25,18 +23,13 @@ public abstract class CraftLootable<T extends TileEntityLootable> extends CraftC
super.applyTo(lootable);
if (this.getSnapshot().lootTable == null) {
lootable.setLootTable((MinecraftKey) null, 0L);
lootable.setLootTable(null, 0L);
}
}
@Override
public LootTable getLootTable() {
if (getSnapshot().lootTable == null) {
return null;
}
MinecraftKey key = getSnapshot().lootTable;
return Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(key));
return CraftLootTable.minecraftToBukkit(getSnapshot().lootTable);
}
@Override
@@ -55,8 +48,7 @@ public abstract class CraftLootable<T extends TileEntityLootable> extends CraftC
}
private void setLootTable(LootTable table, long seed) {
MinecraftKey key = (table == null) ? null : CraftNamespacedKey.toMinecraft(table.getKey());
getSnapshot().setLootTable(key, seed);
getSnapshot().setLootTable(CraftLootTable.bukkitToMinecraft(table), seed);
}
@Override

View File

@@ -5,6 +5,7 @@ import com.mojang.authlib.GameProfile;
import net.minecraft.SystemUtils;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.item.component.ResolvableProfile;
import net.minecraft.world.level.block.entity.TileEntitySkull;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -40,24 +41,9 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement
public void load(TileEntitySkull skull) {
super.load(skull);
profile = skull.owner;
}
static int getSkullType(SkullType type) {
switch (type) {
default:
case SKELETON:
return 0;
case WITHER:
return 1;
case ZOMBIE:
return 2;
case PLAYER:
return 3;
case CREEPER:
return 4;
case DRAGON:
return 5;
ResolvableProfile owner = skull.getOwnerProfile();
if (owner != null) {
profile = owner.gameProfile();
}
}
@@ -201,7 +187,7 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement
super.applyTo(skull);
if (getSkullType() == SkullType.PLAYER) {
skull.setOwner(profile);
skull.setOwner(new ResolvableProfile(profile));
}
}

View File

@@ -0,0 +1,27 @@
package org.bukkit.craftbukkit.block;
import net.minecraft.world.level.block.entity.vault.VaultBlockEntity;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.TrialSpawner;
public class CraftVault extends CraftBlockEntityState<VaultBlockEntity> implements TrialSpawner {
public CraftVault(World world, VaultBlockEntity tileEntity) {
super(world, tileEntity);
}
protected CraftVault(CraftVault state, Location location) {
super(state, location);
}
@Override
public CraftVault copy() {
return new CraftVault(this, null);
}
@Override
public CraftVault copy(Location location) {
return new CraftVault(this, location);
}
}

View File

@@ -0,0 +1,49 @@
package org.bukkit.craftbukkit.block.banner;
import com.google.common.base.Preconditions;
import net.minecraft.core.Holder;
import net.minecraft.core.IRegistry;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.level.block.entity.EnumBannerPatternType;
import org.bukkit.Registry;
import org.bukkit.block.banner.PatternType;
import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
public class CraftPatternType {
public static PatternType minecraftToBukkit(EnumBannerPatternType minecraft) {
Preconditions.checkArgument(minecraft != null);
IRegistry<EnumBannerPatternType> registry = CraftRegistry.getMinecraftRegistry(Registries.BANNER_PATTERN);
PatternType bukkit = Registry.BANNER_PATTERN.get(CraftNamespacedKey.fromMinecraft(registry.getResourceKey(minecraft).orElseThrow().location()));
Preconditions.checkArgument(bukkit != null);
return bukkit;
}
public static PatternType minecraftHolderToBukkit(Holder<EnumBannerPatternType> minecraft) {
return minecraftToBukkit(minecraft.value());
}
public static EnumBannerPatternType bukkitToMinecraft(PatternType bukkit) {
Preconditions.checkArgument(bukkit != null);
return CraftRegistry.getMinecraftRegistry(Registries.BANNER_PATTERN)
.getOptional(CraftNamespacedKey.toMinecraft(bukkit.getKey())).orElseThrow();
}
public static Holder<EnumBannerPatternType> bukkitToMinecraftHolder(PatternType bukkit) {
Preconditions.checkArgument(bukkit != null);
IRegistry<EnumBannerPatternType> registry = CraftRegistry.getMinecraftRegistry(Registries.BANNER_PATTERN);
if (registry.wrapAsHolder(bukkitToMinecraft(bukkit)) instanceof Holder.c<EnumBannerPatternType> holder) {
return holder;
}
throw new IllegalArgumentException("No Reference holder found for " + bukkit
+ ", this can happen if a plugin creates its own banner pattern without properly registering it.");
}
}

View File

@@ -13,7 +13,6 @@ import net.minecraft.commands.arguments.blocks.ArgumentBlock;
import net.minecraft.core.BlockPosition;
import net.minecraft.core.EnumDirection;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.INamable;
import net.minecraft.world.level.BlockAccessAir;
import net.minecraft.world.level.block.Block;
@@ -251,13 +250,13 @@ public class CraftBlockData implements BlockData {
return stateString.toString();
}
public NBTTagCompound toStates() {
NBTTagCompound compound = new NBTTagCompound();
public Map<String, String> toStates() {
Map<String, String> compound = new HashMap<>();
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : state.getValues().entrySet()) {
IBlockState iblockstate = (IBlockState) entry.getKey();
compound.putString(iblockstate.getName(), iblockstate.getName(entry.getValue()));
compound.put(iblockstate.getName(), iblockstate.getName(entry.getValue()));
}
return compound;
@@ -501,6 +500,7 @@ public class CraftBlockData implements BlockData {
register(net.minecraft.world.level.block.EquipableCarvedPumpkinBlock.class, org.bukkit.craftbukkit.block.impl.CraftEquipableCarvedPumpkin::new);
register(net.minecraft.world.level.block.GlowLichenBlock.class, org.bukkit.craftbukkit.block.impl.CraftGlowLichen::new);
register(net.minecraft.world.level.block.HangingRootsBlock.class, org.bukkit.craftbukkit.block.impl.CraftHangingRoots::new);
register(net.minecraft.world.level.block.HeavyCoreBlock.class, org.bukkit.craftbukkit.block.impl.CraftHeavyCore::new);
register(net.minecraft.world.level.block.InfestedRotatedPillarBlock.class, org.bukkit.craftbukkit.block.impl.CraftInfestedRotatedPillar::new);
register(net.minecraft.world.level.block.LayeredCauldronBlock.class, org.bukkit.craftbukkit.block.impl.CraftLayeredCauldron::new);
register(net.minecraft.world.level.block.LightBlock.class, org.bukkit.craftbukkit.block.impl.CraftLight::new);
@@ -521,6 +521,7 @@ public class CraftBlockData implements BlockData {
register(net.minecraft.world.level.block.TallSeagrassBlock.class, org.bukkit.craftbukkit.block.impl.CraftTallSeagrass::new);
register(net.minecraft.world.level.block.TorchflowerCropBlock.class, org.bukkit.craftbukkit.block.impl.CraftTorchflowerCrop::new);
register(net.minecraft.world.level.block.TrialSpawnerBlock.class, org.bukkit.craftbukkit.block.impl.CraftTrialSpawner::new);
register(net.minecraft.world.level.block.VaultBlock.class, org.bukkit.craftbukkit.block.impl.CraftVault::new);
register(net.minecraft.world.level.block.WallHangingSignBlock.class, org.bukkit.craftbukkit.block.impl.CraftWallHangingSign::new);
register(net.minecraft.world.level.block.WaterloggedTransparentBlock.class, org.bukkit.craftbukkit.block.impl.CraftWaterloggedTransparent::new);
register(net.minecraft.world.level.block.WeatheringCopperBulbBlock.class, org.bukkit.craftbukkit.block.impl.CraftWeatheringCopperBulb::new);

View File

@@ -6,6 +6,7 @@ import org.bukkit.craftbukkit.block.data.CraftBlockData;
public abstract class CraftTrialSpawner extends CraftBlockData implements TrialSpawner {
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> TRIAL_SPAWNER_STATE = getEnum("trial_spawner_state");
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean OMINOUS = getBoolean("ominous");
@Override
public org.bukkit.block.data.type.TrialSpawner.State getTrialSpawnerState() {
@@ -16,4 +17,14 @@ public abstract class CraftTrialSpawner extends CraftBlockData implements TrialS
public void setTrialSpawnerState(org.bukkit.block.data.type.TrialSpawner.State state) {
set(TRIAL_SPAWNER_STATE, state);
}
@Override
public boolean isOminous() {
return get(OMINOUS);
}
@Override
public void setOminous(boolean ominous) {
set(OMINOUS, ominous);
}
}

View File

@@ -0,0 +1,30 @@
package org.bukkit.craftbukkit.block.data.type;
import org.bukkit.block.data.type.Vault;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
public abstract class CraftVault extends CraftBlockData implements Vault {
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> VAULT_STATE = getEnum("vault_state");
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean OMINOUS = getBoolean("ominous");
@Override
public org.bukkit.block.data.type.Vault.State getTrialSpawnerState() {
return get(VAULT_STATE, org.bukkit.block.data.type.Vault.State.class);
}
@Override
public void setTrialSpawnerState(org.bukkit.block.data.type.Vault.State state) {
set(VAULT_STATE, state);
}
@Override
public boolean isOminous() {
return get(OMINOUS);
}
@Override
public void setOminous(boolean ominous) {
set(OMINOUS, ominous);
}
}

View File

@@ -0,0 +1,29 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftHeavyCore extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Waterlogged {
public CraftHeavyCore() {
super();
}
public CraftHeavyCore(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.CraftWaterlogged
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.world.level.block.HeavyCoreBlock.class, "waterlogged");
@Override
public boolean isWaterlogged() {
return get(WATERLOGGED);
}
@Override
public void setWaterlogged(boolean waterlogged) {
set(WATERLOGGED, waterlogged);
}
}

View File

@@ -16,6 +16,7 @@ public final class CraftTrialSpawner extends org.bukkit.craftbukkit.block.data.C
// org.bukkit.craftbukkit.block.data.type.CraftTrialSpawner
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> TRIAL_SPAWNER_STATE = getEnum(net.minecraft.world.level.block.TrialSpawnerBlock.class, "trial_spawner_state");
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean OMINOUS = getBoolean(net.minecraft.world.level.block.TrialSpawnerBlock.class, "ominous");
@Override
public org.bukkit.block.data.type.TrialSpawner.State getTrialSpawnerState() {
@@ -26,4 +27,14 @@ public final class CraftTrialSpawner extends org.bukkit.craftbukkit.block.data.C
public void setTrialSpawnerState(org.bukkit.block.data.type.TrialSpawner.State state) {
set(TRIAL_SPAWNER_STATE, state);
}
@Override
public boolean isOminous() {
return get(OMINOUS);
}
@Override
public void setOminous(boolean ominous) {
set(OMINOUS, ominous);
}
}

View File

@@ -0,0 +1,59 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftVault extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Vault, org.bukkit.block.data.Directional {
public CraftVault() {
super();
}
public CraftVault(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.type.CraftVault
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> VAULT_STATE = getEnum(net.minecraft.world.level.block.VaultBlock.class, "vault_state");
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean OMINOUS = getBoolean(net.minecraft.world.level.block.VaultBlock.class, "ominous");
@Override
public org.bukkit.block.data.type.Vault.State getTrialSpawnerState() {
return get(VAULT_STATE, org.bukkit.block.data.type.Vault.State.class);
}
@Override
public void setTrialSpawnerState(org.bukkit.block.data.type.Vault.State state) {
set(VAULT_STATE, state);
}
@Override
public boolean isOminous() {
return get(OMINOUS);
}
@Override
public void setOminous(boolean ominous) {
set(OMINOUS, ominous);
}
// org.bukkit.craftbukkit.block.data.CraftDirectional
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> FACING = getEnum(net.minecraft.world.level.block.VaultBlock.class, "facing");
@Override
public org.bukkit.block.BlockFace getFacing() {
return get(FACING, org.bukkit.block.BlockFace.class);
}
@Override
public void setFacing(org.bukkit.block.BlockFace facing) {
set(FACING, facing);
}
@Override
public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
return getValues(FACING, org.bukkit.block.BlockFace.class);
}
}