Update to Minecraft 1.20.3

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot
2023-12-06 03:40:00 +11:00
parent afdb1d9bc3
commit 8398e12b34
256 changed files with 2745 additions and 1911 deletions

View File

@@ -7,6 +7,7 @@ package com.mojang.brigadier;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.context.CommandContextBuilder;
import com.mojang.brigadier.context.ContextChain;
import com.mojang.brigadier.context.SuggestionContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions;
@@ -23,6 +24,7 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.function.Predicate;
@@ -215,76 +217,16 @@ public class CommandDispatcher<S> {
}
}
int result = 0;
int successfulForks = 0;
boolean forked = false;
boolean foundCommand = false;
final String command = parse.getReader().getString();
final CommandContext<S> original = parse.getContext().build(command);
List<CommandContext<S>> contexts = Collections.singletonList(original);
ArrayList<CommandContext<S>> next = null;
while (contexts != null) {
final int size = contexts.size();
for (int i = 0; i < size; i++) {
final CommandContext<S> context = contexts.get(i);
final CommandContext<S> child = context.getChild();
if (child != null) {
forked |= context.isForked();
if (child.hasNodes()) {
final RedirectModifier<S> modifier = context.getRedirectModifier();
if (modifier == null) {
if (next == null) {
next = new ArrayList<>(1);
}
next.add(child.copyFor(context.getSource()));
} else {
try {
final Collection<S> results = modifier.apply(context);
if (!results.isEmpty()) {
if (next == null) {
next = new ArrayList<>(results.size());
}
for (final S source : results) {
next.add(child.copyFor(source));
}
} else {
foundCommand = true;
}
} catch (final CommandSyntaxException ex) {
consumer.onCommandComplete(context, false, 0);
if (!forked) {
throw ex;
}
}
}
}
} else if (context.getCommand() != null) {
foundCommand = true;
try {
final int value = context.getCommand().run(context);
result += value;
consumer.onCommandComplete(context, true, value);
successfulForks++;
} catch (final CommandSyntaxException ex) {
consumer.onCommandComplete(context, false, 0);
if (!forked) {
throw ex;
}
}
}
}
contexts = next;
next = null;
}
if (!foundCommand) {
final Optional<ContextChain<S>> flatContext = ContextChain.tryFlatten(original);
if (!flatContext.isPresent()) {
consumer.onCommandComplete(original, false, 0);
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherUnknownCommand().createWithContext(parse.getReader());
}
return forked ? successfulForks : result;
return flatContext.get().executeAll(original.getSource(), consumer);
}
/**

View File

@@ -29,6 +29,7 @@ import net.minecraft.world.entity.decoration.EntityPainting;
import net.minecraft.world.entity.item.EntityFallingBlock;
import net.minecraft.world.entity.item.EntityTNTPrimed;
import net.minecraft.world.entity.monster.EntityZombie;
import net.minecraft.world.entity.monster.breeze.Breeze;
import net.minecraft.world.entity.projectile.EntityEgg;
import net.minecraft.world.entity.projectile.EntityEnderSignal;
import net.minecraft.world.entity.projectile.EntityEvokerFangs;
@@ -197,6 +198,7 @@ import org.bukkit.entity.Villager;
import org.bukkit.entity.Vindicator;
import org.bukkit.entity.WanderingTrader;
import org.bukkit.entity.Warden;
import org.bukkit.entity.WindCharge;
import org.bukkit.entity.Witch;
import org.bukkit.entity.Wither;
import org.bukkit.entity.WitherSkeleton;
@@ -676,6 +678,8 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
entity = EntityTypes.WITHER_SKULL.create(world);
} else if (DragonFireball.class.isAssignableFrom(clazz)) {
entity = EntityTypes.DRAGON_FIREBALL.create(world);
} else if (WindCharge.class.isAssignableFrom(clazz)) {
entity = EntityTypes.WIND_CHARGE.create(world);
} else {
entity = EntityTypes.FIREBALL.create(world);
}
@@ -912,6 +916,8 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
entity = EntityTypes.WARDEN.create(world);
} else if (Sniffer.class.isAssignableFrom(clazz)) {
entity = EntityTypes.SNIFFER.create(world);
} else if (Breeze.class.isAssignableFrom(clazz)) {
entity = EntityTypes.BREEZE.create(world);
}
if (entity != null) {

View File

@@ -13,6 +13,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.Lifecycle;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
@@ -56,6 +57,8 @@ import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.DynamicOpsNBT;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NbtException;
import net.minecraft.nbt.ReportedNbtException;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey;
@@ -113,6 +116,7 @@ import net.minecraft.world.level.material.FluidType;
import net.minecraft.world.level.saveddata.maps.MapIcon;
import net.minecraft.world.level.saveddata.maps.WorldMap;
import net.minecraft.world.level.storage.Convertable;
import net.minecraft.world.level.storage.LevelDataAndDimensions;
import net.minecraft.world.level.storage.SaveData;
import net.minecraft.world.level.storage.WorldDataServer;
import net.minecraft.world.level.storage.WorldNBTStorage;
@@ -1081,17 +1085,54 @@ public final class CraftServer implements Server {
throw new RuntimeException(ex);
}
Dynamic<?> dynamic;
if (worldSession.hasWorldData()) {
net.minecraft.world.level.storage.WorldInfo worldinfo;
try {
dynamic = worldSession.getDataTag();
worldinfo = worldSession.getSummary(dynamic);
} catch (NbtException | ReportedNbtException | IOException ioexception) {
Convertable.b convertable_b = worldSession.getLevelDirectory();
MinecraftServer.LOGGER.warn("Failed to load world data from {}", convertable_b.dataFile(), ioexception);
MinecraftServer.LOGGER.info("Attempting to use fallback");
try {
dynamic = worldSession.getDataTagFallback();
worldinfo = worldSession.getSummary(dynamic);
} catch (NbtException | ReportedNbtException | IOException ioexception1) {
MinecraftServer.LOGGER.error("Failed to load world data from {}", convertable_b.oldDataFile(), ioexception1);
MinecraftServer.LOGGER.error("Failed to load world data from {} and {}. World files may be corrupted. Shutting down.", convertable_b.dataFile(), convertable_b.oldDataFile());
return null;
}
worldSession.restoreLevelDataFromOld();
}
if (worldinfo.requiresManualConversion()) {
MinecraftServer.LOGGER.info("This world must be opened in an older version (like 1.6.4) to be safely converted");
return null;
}
if (!worldinfo.isCompatible()) {
MinecraftServer.LOGGER.info("This world was created by an incompatible version.");
return null;
}
} else {
dynamic = null;
}
boolean hardcore = creator.hardcore();
WorldDataServer worlddata;
WorldLoader.a worldloader_a = console.worldLoader;
IRegistry<WorldDimension> iregistry = worldloader_a.datapackDimensions().registryOrThrow(Registries.LEVEL_STEM);
DynamicOps<NBTBase> dynamicops = RegistryOps.create(DynamicOpsNBT.INSTANCE, (HolderLookup.b) worldloader_a.datapackWorldgen());
Pair<SaveData, WorldDimensions.b> pair = worldSession.getDataTag(dynamicops, worldloader_a.dataConfiguration(), iregistry, worldloader_a.datapackWorldgen().allRegistriesLifecycle());
if (dynamic != null) {
LevelDataAndDimensions leveldataanddimensions = Convertable.getLevelDataAndDimensions(dynamic, worldloader_a.dataConfiguration(), iregistry, worldloader_a.datapackWorldgen());
if (pair != null) {
worlddata = (WorldDataServer) pair.getFirst();
iregistry = pair.getSecond().dimensions();
worlddata = (WorldDataServer) leveldataanddimensions.worldData();
iregistry = leveldataanddimensions.dimensions().dimensions();
} else {
WorldSettings worldsettings;
WorldOptions worldoptions = new WorldOptions(creator.seed(), creator.generateStructures(), false);

View File

@@ -233,8 +233,8 @@ public enum CraftStatistic {
// Update scoreboards
if (player != null) {
player.level().getCraftServer().getScoreboardManager().getScoreboardScores(nmsStatistic, player.getScoreboardName(), score -> {
score.setScore(newValue);
player.level().getCraftServer().getScoreboardManager().forAllObjectives(nmsStatistic, player, score -> {
score.set(newValue);
});
}
}
@@ -277,8 +277,8 @@ public enum CraftStatistic {
// Update scoreboards
if (player != null) {
player.level().getCraftServer().getScoreboardManager().getScoreboardScores(nmsStatistic, player.getScoreboardName(), score -> {
score.setScore(newValue);
player.level().getCraftServer().getScoreboardManager().forAllObjectives(nmsStatistic, player, score -> {
score.set(newValue);
});
}
}
@@ -321,8 +321,8 @@ public enum CraftStatistic {
// Update scoreboards
if (player != null) {
player.level().getCraftServer().getScoreboardManager().getScoreboardScores(nmsStatistic, player.getScoreboardName(), score -> {
score.setScore(newValue);
player.level().getCraftServer().getScoreboardManager().forAllObjectives(nmsStatistic, player, score -> {
score.set(newValue);
});
}
}

View File

@@ -66,6 +66,7 @@ import net.minecraft.world.level.storage.SavedFile;
import net.minecraft.world.phys.AxisAlignedBB;
import net.minecraft.world.phys.MovingObjectPosition;
import net.minecraft.world.phys.Vec3D;
import net.minecraft.world.phys.shapes.VoxelShapeCollision;
import org.bukkit.BlockChangeDelegate;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@@ -950,7 +951,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
Vector dir = direction.clone().normalize().multiply(maxDistance);
Vec3D startPos = CraftLocation.toVec3D(start);
Vec3D endPos = startPos.add(dir.getX(), dir.getY(), dir.getZ());
MovingObjectPosition nmsHitResult = this.getHandle().clip(new RayTrace(startPos, endPos, ignorePassableBlocks ? RayTrace.BlockCollisionOption.COLLIDER : RayTrace.BlockCollisionOption.OUTLINE, CraftFluidCollisionMode.toNMS(fluidCollisionMode), null));
MovingObjectPosition nmsHitResult = this.getHandle().clip(new RayTrace(startPos, endPos, ignorePassableBlocks ? RayTrace.BlockCollisionOption.COLLIDER : RayTrace.BlockCollisionOption.OUTLINE, CraftFluidCollisionMode.toNMS(fluidCollisionMode), VoxelShapeCollision.empty()));
return CraftRayTraceResult.fromNMS(this, nmsHitResult);
}

View File

@@ -200,11 +200,11 @@ public class Main {
useConsole = false;
}
if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) {
if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) {
Date buildDate = new Date(Integer.parseInt(Main.class.getPackage().getImplementationVendor()) * 1000L);
Calendar deadline = Calendar.getInstance();
deadline.add(Calendar.DAY_OF_YEAR, -21);
deadline.add(Calendar.DAY_OF_YEAR, -3);
if (buildDate.before(deadline.getTime())) {
System.err.println("*** Error, this build is outdated ***");
System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***");

View File

@@ -60,6 +60,6 @@ public class CraftAdvancementDisplay implements org.bukkit.advancement.Advanceme
@Override
public AdvancementDisplayType getType() {
return AdvancementDisplayType.values()[handle.getFrame().ordinal()];
return AdvancementDisplayType.values()[handle.getType().ordinal()];
}
}

View File

@@ -71,10 +71,10 @@ public class CraftAttributeInstance implements AttributeInstance {
}
public static AttributeModifier convert(net.minecraft.world.entity.ai.attributes.AttributeModifier nms) {
return new AttributeModifier(nms.getId(), nms.getName(), nms.getAmount(), AttributeModifier.Operation.values()[nms.getOperation().ordinal()]);
return new AttributeModifier(nms.getId(), nms.name, nms.getAmount(), AttributeModifier.Operation.values()[nms.getOperation().ordinal()]);
}
public static AttributeModifier convert(net.minecraft.world.entity.ai.attributes.AttributeModifier nms, EquipmentSlot slot) {
return new AttributeModifier(nms.getId(), nms.getName(), nms.getAmount(), AttributeModifier.Operation.values()[nms.getOperation().ordinal()], slot);
return new AttributeModifier(nms.getId(), nms.name, nms.getAmount(), AttributeModifier.Operation.values()[nms.getOperation().ordinal()], slot);
}
}

View File

@@ -26,6 +26,7 @@ import net.minecraft.world.phys.MovingObjectPosition;
import net.minecraft.world.phys.MovingObjectPositionBlock;
import net.minecraft.world.phys.Vec3D;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.phys.shapes.VoxelShapeCollision;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.FluidCollisionMode;
@@ -580,7 +581,7 @@ public class CraftBlock implements Block {
Vec3D startPos = CraftLocation.toVec3D(start);
Vec3D endPos = startPos.add(dir.getX(), dir.getY(), dir.getZ());
MovingObjectPosition nmsHitResult = world.clip(new RayTrace(startPos, endPos, RayTrace.BlockCollisionOption.OUTLINE, CraftFluidCollisionMode.toNMS(fluidCollisionMode), null), position);
MovingObjectPosition nmsHitResult = world.clip(new RayTrace(startPos, endPos, RayTrace.BlockCollisionOption.OUTLINE, CraftFluidCollisionMode.toNMS(fluidCollisionMode), VoxelShapeCollision.empty()), position);
return CraftRayTraceResult.fromNMS(this.getWorld(), nmsHitResult);
}

View File

@@ -14,6 +14,7 @@ import net.minecraft.world.level.GeneratorAccess;
import net.minecraft.world.level.block.entity.BrushableBlockEntity;
import net.minecraft.world.level.block.entity.CalibratedSculkSensorBlockEntity;
import net.minecraft.world.level.block.entity.ChiseledBookShelfBlockEntity;
import net.minecraft.world.level.block.entity.CrafterBlockEntity;
import net.minecraft.world.level.block.entity.DecoratedPotBlockEntity;
import net.minecraft.world.level.block.entity.HangingSignBlockEntity;
import net.minecraft.world.level.block.entity.SculkCatalystBlockEntity;
@@ -52,6 +53,7 @@ import net.minecraft.world.level.block.entity.TileEntitySign;
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.piston.TileEntityPiston;
import net.minecraft.world.level.block.state.IBlockData;
import org.bukkit.Material;
@@ -333,6 +335,8 @@ public final class CraftBlockStates {
register(Material.SUSPICIOUS_SAND, CraftSuspiciousSand.class, CraftSuspiciousSand::new, BrushableBlockEntity::new);
register(Material.SUSPICIOUS_GRAVEL, CraftBrushableBlock.class, CraftBrushableBlock::new, BrushableBlockEntity::new);
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);
}
private static void register(Material blockType, BlockStateFactory<?> factory) {

View File

@@ -0,0 +1,72 @@
package org.bukkit.craftbukkit.block;
import com.google.common.base.Preconditions;
import net.minecraft.world.level.block.entity.CrafterBlockEntity;
import org.bukkit.World;
import org.bukkit.block.Crafter;
import org.bukkit.craftbukkit.inventory.CraftInventory;
import org.bukkit.inventory.Inventory;
public class CraftCrafter extends CraftLootable<CrafterBlockEntity> implements Crafter {
public CraftCrafter(World world, CrafterBlockEntity tileEntity) {
super(world, tileEntity);
}
protected CraftCrafter(CraftCrafter state) {
super(state);
}
@Override
public Inventory getSnapshotInventory() {
return new CraftInventory(this.getSnapshot());
}
@Override
public Inventory getInventory() {
if (!this.isPlaced()) {
return this.getSnapshotInventory();
}
return new CraftInventory(this.getTileEntity());
}
@Override
public CraftCrafter copy() {
return new CraftCrafter(this);
}
@Override
public int getCraftingTicks() {
return getSnapshot().craftingTicksRemaining;
}
@Override
public void setCraftingTicks(int ticks) {
getSnapshot().setCraftingTicksRemaining(ticks);
}
@Override
public boolean isSlotDisabled(int slot) {
Preconditions.checkArgument(slot >= 0 && slot < 9, "Invalid slot index %s for Crafter", slot);
return getSnapshot().isSlotDisabled(slot);
}
@Override
public void setSlotDisabled(int slot, boolean disabled) {
Preconditions.checkArgument(slot >= 0 && slot < 9, "Invalid slot index %s for Crafter", slot);
getSnapshot().setSlotState(slot, disabled);
}
@Override
public boolean isTriggered() {
return getSnapshot().isTriggered();
}
@Override
public void setTriggered(boolean triggered) {
getSnapshot().setTriggered(triggered);
}
}

View File

@@ -82,7 +82,7 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityJukeBox> imple
@Override
public org.bukkit.inventory.ItemStack getRecord() {
ItemStack record = this.getSnapshot().getFirstItem();
ItemStack record = this.getSnapshot().getTheItem();
return CraftItemStack.asBukkitCopy(record);
}
@@ -115,7 +115,7 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityJukeBox> imple
return false;
}
ItemStack record = jukebox.getFirstItem();
ItemStack record = jukebox.getTheItem();
if (record.isEmpty() || isPlaying()) {
return false;
}
@@ -147,7 +147,7 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityJukeBox> imple
if (!(tileEntity instanceof TileEntityJukeBox)) return false;
TileEntityJukeBox jukebox = (TileEntityJukeBox) tileEntity;
boolean result = !jukebox.getFirstItem().isEmpty();
boolean result = !jukebox.getTheItem().isEmpty();
jukebox.popOutRecord();
return result;
}

View File

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

View File

@@ -493,6 +493,8 @@ public class CraftBlockData implements BlockData {
register(net.minecraft.world.level.block.CeilingHangingSignBlock.class, org.bukkit.craftbukkit.block.impl.CraftCeilingHangingSign::new);
register(net.minecraft.world.level.block.CherryLeavesBlock.class, org.bukkit.craftbukkit.block.impl.CraftCherryLeaves::new);
register(net.minecraft.world.level.block.ChiseledBookShelfBlock.class, org.bukkit.craftbukkit.block.impl.CraftChiseledBookShelf::new);
register(net.minecraft.world.level.block.CopperBulbBlock.class, org.bukkit.craftbukkit.block.impl.CraftCopperBulb::new);
register(net.minecraft.world.level.block.CrafterBlock.class, org.bukkit.craftbukkit.block.impl.CraftCrafter::new);
register(net.minecraft.world.level.block.DecoratedPotBlock.class, org.bukkit.craftbukkit.block.impl.CraftDecoratedPot::new);
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);
@@ -508,7 +510,6 @@ public class CraftBlockData implements BlockData {
register(net.minecraft.world.level.block.PinkPetalsBlock.class, org.bukkit.craftbukkit.block.impl.CraftPinkPetals::new);
register(net.minecraft.world.level.block.PitcherCropBlock.class, org.bukkit.craftbukkit.block.impl.CraftPitcherCrop::new);
register(net.minecraft.world.level.block.PointedDripstoneBlock.class, org.bukkit.craftbukkit.block.impl.CraftPointedDripstone::new);
register(net.minecraft.world.level.block.PowderSnowCauldronBlock.class, org.bukkit.craftbukkit.block.impl.CraftPowderSnowCauldron::new);
register(net.minecraft.world.level.block.SculkCatalystBlock.class, org.bukkit.craftbukkit.block.impl.CraftSculkCatalyst::new);
register(net.minecraft.world.level.block.SculkSensorBlock.class, org.bukkit.craftbukkit.block.impl.CraftSculkSensor::new);
register(net.minecraft.world.level.block.SculkShriekerBlock.class, org.bukkit.craftbukkit.block.impl.CraftSculkShrieker::new);
@@ -517,9 +518,15 @@ public class CraftBlockData implements BlockData {
register(net.minecraft.world.level.block.SnifferEggBlock.class, org.bukkit.craftbukkit.block.impl.CraftSnifferEgg::new);
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.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);
register(net.minecraft.world.level.block.WeatheringCopperDoorBlock.class, org.bukkit.craftbukkit.block.impl.CraftWeatheringCopperDoor::new);
register(net.minecraft.world.level.block.WeatheringCopperGrateBlock.class, org.bukkit.craftbukkit.block.impl.CraftWeatheringCopperGrate::new);
register(net.minecraft.world.level.block.WeatheringCopperSlabBlock.class, org.bukkit.craftbukkit.block.impl.CraftWeatheringCopperSlab::new);
register(net.minecraft.world.level.block.WeatheringCopperStairBlock.class, org.bukkit.craftbukkit.block.impl.CraftWeatheringCopperStair::new);
register(net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock.class, org.bukkit.craftbukkit.block.impl.CraftWeatheringCopperTrapDoor::new);
register(net.minecraft.world.level.block.piston.BlockPiston.class, org.bukkit.craftbukkit.block.impl.CraftPiston::new);
register(net.minecraft.world.level.block.piston.BlockPistonExtension.class, org.bukkit.craftbukkit.block.impl.CraftPistonExtension::new);
register(net.minecraft.world.level.block.piston.BlockPistonMoving.class, org.bukkit.craftbukkit.block.impl.CraftPistonMoving::new);

View File

@@ -0,0 +1,41 @@
package org.bukkit.craftbukkit.block.data.type;
import org.bukkit.block.data.type.Crafter;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
public abstract class CraftCrafter extends CraftBlockData implements Crafter {
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean CRAFTING = getBoolean("crafting");
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean TRIGGERED = getBoolean("triggered");
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> ORIENTATION = getEnum("orientation");
@Override
public boolean isCrafting() {
return get(CRAFTING);
}
@Override
public void setCrafting(boolean crafting) {
set(CRAFTING, crafting);
}
@Override
public boolean isTriggered() {
return get(TRIGGERED);
}
@Override
public void setTriggered(boolean triggered) {
set(TRIGGERED, triggered);
}
@Override
public org.bukkit.block.data.type.Crafter.Orientation getOrientation() {
return get(ORIENTATION, org.bukkit.block.data.type.Crafter.Orientation.class);
}
@Override
public void setOrientation(org.bukkit.block.data.type.Crafter.Orientation orientation) {
set(ORIENTATION, orientation);
}
}

View File

@@ -0,0 +1,19 @@
package org.bukkit.craftbukkit.block.data.type;
import org.bukkit.block.data.type.TrialSpawner;
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");
@Override
public org.bukkit.block.data.type.TrialSpawner.State getTrialSpawnerState() {
return get(TRIAL_SPAWNER_STATE, org.bukkit.block.data.type.TrialSpawner.State.class);
}
@Override
public void setTrialSpawnerState(org.bukkit.block.data.type.TrialSpawner.State state) {
set(TRIAL_SPAWNER_STATE, state);
}
}

View File

@@ -0,0 +1,43 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftCopperBulb extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.CopperBulb, org.bukkit.block.data.Lightable, org.bukkit.block.data.Powerable {
public CraftCopperBulb() {
super();
}
public CraftCopperBulb(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.CraftLightable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean LIT = getBoolean(net.minecraft.world.level.block.CopperBulbBlock.class, "lit");
@Override
public boolean isLit() {
return get(LIT);
}
@Override
public void setLit(boolean lit) {
set(LIT, lit);
}
// org.bukkit.craftbukkit.block.data.CraftPowerable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean POWERED = getBoolean(net.minecraft.world.level.block.CopperBulbBlock.class, "powered");
@Override
public boolean isPowered() {
return get(POWERED);
}
@Override
public void setPowered(boolean powered) {
set(POWERED, powered);
}
}

View File

@@ -0,0 +1,51 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftCrafter extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Crafter {
public CraftCrafter() {
super();
}
public CraftCrafter(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.type.CraftCrafter
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean CRAFTING = getBoolean(net.minecraft.world.level.block.CrafterBlock.class, "crafting");
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean TRIGGERED = getBoolean(net.minecraft.world.level.block.CrafterBlock.class, "triggered");
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> ORIENTATION = getEnum(net.minecraft.world.level.block.CrafterBlock.class, "orientation");
@Override
public boolean isCrafting() {
return get(CRAFTING);
}
@Override
public void setCrafting(boolean crafting) {
set(CRAFTING, crafting);
}
@Override
public boolean isTriggered() {
return get(TRIGGERED);
}
@Override
public void setTriggered(boolean triggered) {
set(TRIGGERED, triggered);
}
@Override
public org.bukkit.block.data.type.Crafter.Orientation getOrientation() {
return get(ORIENTATION, org.bukkit.block.data.type.Crafter.Orientation.class);
}
@Override
public void setOrientation(org.bukkit.block.data.type.Crafter.Orientation orientation) {
set(ORIENTATION, orientation);
}
}

View File

@@ -1,34 +0,0 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftPowderSnowCauldron extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Levelled {
public CraftPowderSnowCauldron() {
super();
}
public CraftPowderSnowCauldron(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.CraftLevelled
private static final net.minecraft.world.level.block.state.properties.BlockStateInteger LEVEL = getInteger(net.minecraft.world.level.block.PowderSnowCauldronBlock.class, "level");
@Override
public int getLevel() {
return get(LEVEL);
}
@Override
public void setLevel(int level) {
set(LEVEL, level);
}
@Override
public int getMaximumLevel() {
return getMax(LEVEL);
}
}

View File

@@ -0,0 +1,29 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftTrialSpawner extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TrialSpawner {
public CraftTrialSpawner() {
super();
}
public CraftTrialSpawner(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// 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");
@Override
public org.bukkit.block.data.type.TrialSpawner.State getTrialSpawnerState() {
return get(TRIAL_SPAWNER_STATE, org.bukkit.block.data.type.TrialSpawner.State.class);
}
@Override
public void setTrialSpawnerState(org.bukkit.block.data.type.TrialSpawner.State state) {
set(TRIAL_SPAWNER_STATE, state);
}
}

View File

@@ -0,0 +1,29 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftWaterloggedTransparent extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Waterlogged {
public CraftWaterloggedTransparent() {
super();
}
public CraftWaterloggedTransparent(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.WaterloggedTransparentBlock.class, "waterlogged");
@Override
public boolean isWaterlogged() {
return get(WATERLOGGED);
}
@Override
public void setWaterlogged(boolean waterlogged) {
set(WATERLOGGED, waterlogged);
}
}

View File

@@ -0,0 +1,43 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftWeatheringCopperBulb extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.CopperBulb, org.bukkit.block.data.Lightable, org.bukkit.block.data.Powerable {
public CraftWeatheringCopperBulb() {
super();
}
public CraftWeatheringCopperBulb(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.CraftLightable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean LIT = getBoolean(net.minecraft.world.level.block.WeatheringCopperBulbBlock.class, "lit");
@Override
public boolean isLit() {
return get(LIT);
}
@Override
public void setLit(boolean lit) {
set(LIT, lit);
}
// org.bukkit.craftbukkit.block.data.CraftPowerable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean POWERED = getBoolean(net.minecraft.world.level.block.WeatheringCopperBulbBlock.class, "powered");
@Override
public boolean isPowered() {
return get(POWERED);
}
@Override
public void setPowered(boolean powered) {
set(POWERED, powered);
}
}

View File

@@ -0,0 +1,90 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftWeatheringCopperDoor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Door, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable {
public CraftWeatheringCopperDoor() {
super();
}
public CraftWeatheringCopperDoor(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.type.CraftDoor
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> HINGE = getEnum(net.minecraft.world.level.block.WeatheringCopperDoorBlock.class, "hinge");
@Override
public org.bukkit.block.data.type.Door.Hinge getHinge() {
return get(HINGE, org.bukkit.block.data.type.Door.Hinge.class);
}
@Override
public void setHinge(org.bukkit.block.data.type.Door.Hinge hinge) {
set(HINGE, hinge);
}
// org.bukkit.craftbukkit.block.data.CraftBisected
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> HALF = getEnum(net.minecraft.world.level.block.WeatheringCopperDoorBlock.class, "half");
@Override
public org.bukkit.block.data.Bisected.Half getHalf() {
return get(HALF, org.bukkit.block.data.Bisected.Half.class);
}
@Override
public void setHalf(org.bukkit.block.data.Bisected.Half half) {
set(HALF, half);
}
// org.bukkit.craftbukkit.block.data.CraftDirectional
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> FACING = getEnum(net.minecraft.world.level.block.WeatheringCopperDoorBlock.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);
}
// org.bukkit.craftbukkit.block.data.CraftOpenable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean OPEN = getBoolean(net.minecraft.world.level.block.WeatheringCopperDoorBlock.class, "open");
@Override
public boolean isOpen() {
return get(OPEN);
}
@Override
public void setOpen(boolean open) {
set(OPEN, open);
}
// org.bukkit.craftbukkit.block.data.CraftPowerable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean POWERED = getBoolean(net.minecraft.world.level.block.WeatheringCopperDoorBlock.class, "powered");
@Override
public boolean isPowered() {
return get(POWERED);
}
@Override
public void setPowered(boolean powered) {
set(POWERED, powered);
}
}

View File

@@ -0,0 +1,29 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftWeatheringCopperGrate extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Waterlogged {
public CraftWeatheringCopperGrate() {
super();
}
public CraftWeatheringCopperGrate(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.WeatheringCopperGrateBlock.class, "waterlogged");
@Override
public boolean isWaterlogged() {
return get(WATERLOGGED);
}
@Override
public void setWaterlogged(boolean waterlogged) {
set(WATERLOGGED, waterlogged);
}
}

View File

@@ -0,0 +1,90 @@
/**
* Automatically generated file, changes will be lost.
*/
package org.bukkit.craftbukkit.block.impl;
public final class CraftWeatheringCopperTrapDoor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TrapDoor, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable, org.bukkit.block.data.Waterlogged {
public CraftWeatheringCopperTrapDoor() {
super();
}
public CraftWeatheringCopperTrapDoor(net.minecraft.world.level.block.state.IBlockData state) {
super(state);
}
// org.bukkit.craftbukkit.block.data.CraftBisected
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> HALF = getEnum(net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock.class, "half");
@Override
public org.bukkit.block.data.Bisected.Half getHalf() {
return get(HALF, org.bukkit.block.data.Bisected.Half.class);
}
@Override
public void setHalf(org.bukkit.block.data.Bisected.Half half) {
set(HALF, half);
}
// org.bukkit.craftbukkit.block.data.CraftDirectional
private static final net.minecraft.world.level.block.state.properties.BlockStateEnum<?> FACING = getEnum(net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock.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);
}
// org.bukkit.craftbukkit.block.data.CraftOpenable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean OPEN = getBoolean(net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock.class, "open");
@Override
public boolean isOpen() {
return get(OPEN);
}
@Override
public void setOpen(boolean open) {
set(OPEN, open);
}
// org.bukkit.craftbukkit.block.data.CraftPowerable
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean POWERED = getBoolean(net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock.class, "powered");
@Override
public boolean isPowered() {
return get(POWERED);
}
@Override
public void setPowered(boolean powered) {
set(POWERED, powered);
}
// org.bukkit.craftbukkit.block.data.CraftWaterlogged
private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.world.level.block.WeatheringCopperTrapDoorBlock.class, "waterlogged");
@Override
public boolean isWaterlogged() {
return get(WATERLOGGED);
}
@Override
public void setWaterlogged(boolean waterlogged) {
set(WATERLOGGED, waterlogged);
}
}

View File

@@ -0,0 +1,21 @@
package org.bukkit.craftbukkit.entity;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.Breeze;
public class CraftBreeze extends CraftMonster implements Breeze {
public CraftBreeze(CraftServer server, net.minecraft.world.entity.monster.breeze.Breeze entity) {
super(server, entity);
}
@Override
public net.minecraft.world.entity.monster.breeze.Breeze getHandle() {
return (net.minecraft.world.entity.monster.breeze.Breeze) entity;
}
@Override
public String toString() {
return "CraftBreeze";
}
}

View File

@@ -122,6 +122,7 @@ import net.minecraft.world.entity.monster.EntityZoglin;
import net.minecraft.world.entity.monster.EntityZombie;
import net.minecraft.world.entity.monster.EntityZombieHusk;
import net.minecraft.world.entity.monster.EntityZombieVillager;
import net.minecraft.world.entity.monster.breeze.Breeze;
import net.minecraft.world.entity.monster.hoglin.EntityHoglin;
import net.minecraft.world.entity.monster.piglin.EntityPiglin;
import net.minecraft.world.entity.monster.piglin.EntityPiglinAbstract;
@@ -152,6 +153,7 @@ import net.minecraft.world.entity.projectile.EntityThrownExpBottle;
import net.minecraft.world.entity.projectile.EntityThrownTrident;
import net.minecraft.world.entity.projectile.EntityTippedArrow;
import net.minecraft.world.entity.projectile.EntityWitherSkull;
import net.minecraft.world.entity.projectile.WindCharge;
import net.minecraft.world.entity.vehicle.ChestBoat;
import net.minecraft.world.entity.vehicle.EntityBoat;
import net.minecraft.world.entity.vehicle.EntityMinecartAbstract;
@@ -334,6 +336,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
}
else if (entity instanceof EntityZoglin) { return new CraftZoglin(server, (EntityZoglin) entity); }
else if (entity instanceof Warden) { return new CraftWarden(server, (Warden) entity); }
else if (entity instanceof Breeze) { return new CraftBreeze(server, (Breeze) entity); }
else { return new CraftMonster(server, (EntityMonster) entity); }
}
@@ -401,6 +404,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
else if (entity instanceof EntityLargeFireball) { return new CraftLargeFireball(server, (EntityLargeFireball) entity); }
else if (entity instanceof EntityWitherSkull) { return new CraftWitherSkull(server, (EntityWitherSkull) entity); }
else if (entity instanceof EntityDragonFireball) { return new CraftDragonFireball(server, (EntityDragonFireball) entity); }
else if (entity instanceof WindCharge) { return new CraftWindCharge(server, (WindCharge) entity); }
else { return new CraftFireball(server, (EntityFireball) entity); }
}
else if (entity instanceof EntityEnderSignal) { return new CraftEnderSignal(server, (EntityEnderSignal) entity); }

View File

@@ -75,7 +75,7 @@ public class CraftItem extends CraftEntity implements Item {
@Override
public void setThrower(UUID uuid) {
getHandle().setThrower(uuid);
getHandle().thrower = uuid;
}
@Override

View File

@@ -82,6 +82,7 @@ import org.bukkit.entity.ThrownExpBottle;
import org.bukkit.entity.ThrownPotion;
import org.bukkit.entity.TippedArrow;
import org.bukkit.entity.Trident;
import org.bukkit.entity.WindCharge;
import org.bukkit.entity.WitherSkull;
import org.bukkit.entity.memory.MemoryKey;
import org.bukkit.event.entity.EntityPotionEffectEvent;
@@ -436,14 +437,14 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
((EntityProjectile) launch).shootFromRotation(getHandle(), getHandle().getXRot(), getHandle().getYRot(), 0.0F, 1.5F, 1.0F); // ItemEnderPearl
} else if (AbstractArrow.class.isAssignableFrom(projectile)) {
if (TippedArrow.class.isAssignableFrom(projectile)) {
launch = new EntityTippedArrow(world, getHandle());
launch = new EntityTippedArrow(world, getHandle(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.ARROW));
((Arrow) launch.getBukkitEntity()).setBasePotionData(new PotionData(PotionType.WATER, false, false));
} else if (SpectralArrow.class.isAssignableFrom(projectile)) {
launch = new EntitySpectralArrow(world, getHandle());
launch = new EntitySpectralArrow(world, getHandle(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.SPECTRAL_ARROW));
} else if (Trident.class.isAssignableFrom(projectile)) {
launch = new EntityThrownTrident(world, getHandle(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.TRIDENT));
} else {
launch = new EntityTippedArrow(world, getHandle());
launch = new EntityTippedArrow(world, getHandle(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.ARROW));
}
((EntityArrow) launch).shootFromRotation(getHandle(), getHandle().getXRot(), getHandle().getYRot(), 0.0F, 3.0F, 1.0F); // ItemBow
} else if (ThrownPotion.class.isAssignableFrom(projectile)) {
@@ -470,6 +471,10 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
launch = new EntityWitherSkull(world, getHandle(), direction.getX(), direction.getY(), direction.getZ());
} else if (DragonFireball.class.isAssignableFrom(projectile)) {
launch = new EntityDragonFireball(world, getHandle(), direction.getX(), direction.getY(), direction.getZ());
} else if (WindCharge.class.isAssignableFrom(projectile)) {
launch = EntityTypes.WIND_CHARGE.create(world);
((net.minecraft.world.entity.projectile.WindCharge) launch).setOwner(getHandle());
((net.minecraft.world.entity.projectile.WindCharge) launch).setDirection(direction.getX(), direction.getY(), direction.getZ());
} else {
launch = new EntityLargeFireball(world, getHandle(), direction.getX(), direction.getY(), direction.getZ(), 1);
}

View File

@@ -14,6 +14,7 @@ import java.lang.ref.WeakReference;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
@@ -42,7 +43,7 @@ import net.minecraft.network.chat.IChatBaseComponent;
import net.minecraft.network.chat.PlayerChatMessage;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
import net.minecraft.network.protocol.common.ClientboundResourcePackPacket;
import net.minecraft.network.protocol.common.ClientboundResourcePackPushPacket;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.network.protocol.game.ClientboundClearTitlesPacket;
import net.minecraft.network.protocol.game.ClientboundCustomChatCompletionsPacket;
@@ -1718,12 +1719,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
public void setResourcePack(String url, byte[] hash, String prompt, boolean force) {
Preconditions.checkArgument(url != null, "Resource pack URL cannot be null");
setResourcePack(UUID.nameUUIDFromBytes(url.getBytes(StandardCharsets.UTF_8)), url, hash, prompt, force);
}
@Override
public void setResourcePack(UUID id, String url, byte[] hash, String prompt, boolean force) {
Preconditions.checkArgument(url != null, "Resource pack URL cannot be null");
if (hash != null) {
Preconditions.checkArgument(hash.length == 20, "Resource pack hash should be 20 bytes long but was %s", hash.length);
getHandle().connection.send(new ClientboundResourcePackPacket(url, BaseEncoding.base16().lowerCase().encode(hash), force, CraftChatMessage.fromStringOrNull(prompt, true)));
getHandle().connection.send(new ClientboundResourcePackPushPacket(id, url, BaseEncoding.base16().lowerCase().encode(hash), force, CraftChatMessage.fromStringOrNull(prompt, true)));
} else {
getHandle().connection.send(new ClientboundResourcePackPacket(url, "", force, CraftChatMessage.fromStringOrNull(prompt, true)));
getHandle().connection.send(new ClientboundResourcePackPushPacket(id, url, "", force, CraftChatMessage.fromStringOrNull(prompt, true)));
}
}

View File

@@ -19,12 +19,12 @@ public class CraftTrident extends CraftArrow implements Trident {
@Override
public ItemStack getItem() {
return CraftItemStack.asBukkitCopy(getHandle().tridentItem);
return CraftItemStack.asBukkitCopy(getHandle().pickupItemStack);
}
@Override
public void setItem(ItemStack itemStack) {
getHandle().tridentItem = CraftItemStack.asNMSCopy(itemStack);
getHandle().pickupItemStack = CraftItemStack.asNMSCopy(itemStack);
}
@Override

View File

@@ -0,0 +1,15 @@
package org.bukkit.craftbukkit.entity;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.WindCharge;
public class CraftWindCharge extends CraftFireball implements WindCharge {
public CraftWindCharge(CraftServer server, net.minecraft.world.entity.projectile.WindCharge entity) {
super(server, entity);
}
@Override
public String toString() {
return "CraftWindCharge";
}
}

View File

@@ -1466,11 +1466,10 @@ public class CraftEventFactory {
return event;
}
public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, Explosion explosion) {
org.bukkit.World bukkitWorld = world.getWorld();
public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition blockposition, Explosion explosion) {
org.bukkit.entity.Entity igniter = explosion.source == null ? null : explosion.source.getBukkitEntity();
BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(x, y, z), IgniteCause.EXPLOSION, igniter);
BlockIgniteEvent event = new BlockIgniteEvent(CraftBlock.at(world, blockposition), IgniteCause.EXPLOSION, igniter);
world.getCraftServer().getPluginManager().callEvent(event);
return event;
}

View File

@@ -24,6 +24,7 @@ import net.minecraft.world.inventory.ContainerSmoker;
import net.minecraft.world.inventory.ContainerStonecutter;
import net.minecraft.world.inventory.ContainerWorkbench;
import net.minecraft.world.inventory.Containers;
import net.minecraft.world.inventory.CrafterMenu;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import org.bukkit.entity.HumanEntity;
@@ -161,6 +162,8 @@ public class CraftContainer extends Container {
case CRAFTING:
case MERCHANT:
throw new IllegalArgumentException("Can't open a " + inventory.getType() + " inventory!");
case CRAFTER:
return Containers.CRAFTER_3x3;
default:
// TODO: If it reaches the default case, should we throw an error?
return Containers.GENERIC_9x3;
@@ -235,6 +238,9 @@ public class CraftContainer extends Container {
case SMITHING_NEW:
setupSmithing(top, bottom); // SPIGOT-6783 - manually set up slots so we can use the delegated inventory and not the automatically created one
break;
case CRAFTER:
delegate = new CrafterMenu(windowId, bottom);
break;
}
if (delegate != null) {

View File

@@ -11,6 +11,7 @@ import net.minecraft.world.inventory.InventoryEnderChest;
import net.minecraft.world.inventory.InventoryMerchant;
import net.minecraft.world.level.block.BlockComposter;
import net.minecraft.world.level.block.entity.ChiseledBookShelfBlockEntity;
import net.minecraft.world.level.block.entity.CrafterBlockEntity;
import net.minecraft.world.level.block.entity.IHopper;
import net.minecraft.world.level.block.entity.TileEntityBarrel;
import net.minecraft.world.level.block.entity.TileEntityBlastFurnace;
@@ -454,7 +455,11 @@ public class CraftInventory implements Inventory {
public InventoryType getType() {
// Thanks to Droppers extending Dispensers, Blast Furnaces & Smokers extending Furnace, order is important.
if (inventory instanceof InventoryCrafting) {
return inventory.getContainerSize() >= 9 ? InventoryType.WORKBENCH : InventoryType.CRAFTING;
if (inventory instanceof CrafterBlockEntity) {
return InventoryType.CRAFTER;
} else {
return inventory.getContainerSize() >= 9 ? InventoryType.WORKBENCH : InventoryType.CRAFTING;
}
} else if (inventory instanceof PlayerInventory) {
return InventoryType.PLAYER;
} else if (inventory instanceof TileEntityDropper) {

View File

@@ -0,0 +1,11 @@
package org.bukkit.craftbukkit.inventory;
import net.minecraft.world.IInventory;
import org.bukkit.inventory.CrafterInventory;
public class CraftInventoryCrafter extends CraftResultInventory implements CrafterInventory {
public CraftInventoryCrafter(IInventory inventory, IInventory resultInventory) {
super(inventory, resultInventory);
}
}

View File

@@ -169,6 +169,7 @@ public final class CraftItemFactory implements ItemFactory {
case BAT_SPAWN_EGG:
case BEE_SPAWN_EGG:
case BLAZE_SPAWN_EGG:
case BREEZE_SPAWN_EGG:
case CAT_SPAWN_EGG:
case CAMEL_SPAWN_EGG:
case CAVE_SPIDER_SPAWN_EGG:
@@ -344,6 +345,8 @@ public final class CraftItemFactory implements ItemFactory {
case DECORATED_POT:
case SUSPICIOUS_SAND:
case SUSPICIOUS_GRAVEL:
case CRAFTER:
case TRIAL_SPAWNER:
return new CraftMetaBlockState(meta, material);
case TROPICAL_FISH_BUCKET:
return meta instanceof CraftMetaTropicalFishBucket ? meta : new CraftMetaTropicalFishBucket(meta);

View File

@@ -422,6 +422,7 @@ public final class CraftItemStack extends ItemStack {
case BAT_SPAWN_EGG:
case BEE_SPAWN_EGG:
case BLAZE_SPAWN_EGG:
case BREEZE_SPAWN_EGG:
case CAT_SPAWN_EGG:
case CAMEL_SPAWN_EGG:
case CAVE_SPIDER_SPAWN_EGG:
@@ -597,6 +598,8 @@ public final class CraftItemStack extends ItemStack {
case DECORATED_POT:
case SUSPICIOUS_SAND:
case SUSPICIOUS_GRAVEL:
case CRAFTER:
case TRIAL_SPAWNER:
return new CraftMetaBlockState(item.getTag(), CraftMagicNumbers.getMaterial(item.getItem()));
case TROPICAL_FISH_BUCKET:
return new CraftMetaTropicalFishBucket(item.getTag());

View File

@@ -121,7 +121,9 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
Material.CHISELED_BOOKSHELF,
Material.DECORATED_POT,
Material.SUSPICIOUS_SAND,
Material.SUSPICIOUS_GRAVEL
Material.SUSPICIOUS_GRAVEL,
Material.TRIAL_SPAWNER,
Material.CRAFTER
);
static {

View File

@@ -39,6 +39,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTCompressedStreamTools;
import net.minecraft.nbt.NBTReadLimiter;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
@@ -521,7 +522,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
if (internal != null) {
ByteArrayInputStream buf = new ByteArrayInputStream(Base64.getDecoder().decode(internal));
try {
internalTag = NBTCompressedStreamTools.readCompressed(buf);
internalTag = NBTCompressedStreamTools.readCompressed(buf, NBTReadLimiter.unlimitedHeap());
deserializeInternal(internalTag, map);
Set<String> keys = internalTag.getAllKeys();
for (String key : keys) {

View File

@@ -26,6 +26,7 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
Material.BAT_SPAWN_EGG,
Material.BEE_SPAWN_EGG,
Material.BLAZE_SPAWN_EGG,
Material.BREEZE_SPAWN_EGG,
Material.CAT_SPAWN_EGG,
Material.CAMEL_SPAWN_EGG,
Material.CAVE_SPIDER_SPAWN_EGG,

View File

@@ -1,10 +1,12 @@
package org.bukkit.craftbukkit.inventory;
import com.google.common.collect.Maps;
import java.util.Map;
import net.minecraft.core.NonNullList;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.item.crafting.RecipeHolder;
import net.minecraft.world.item.crafting.RecipeItemStack;
import net.minecraft.world.item.crafting.ShapedRecipePattern;
import net.minecraft.world.item.crafting.ShapedRecipes;
import org.bukkit.NamespacedKey;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
@@ -48,15 +50,8 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe {
public void addToCraftingManager() {
String[] shape = this.getShape();
Map<Character, org.bukkit.inventory.RecipeChoice> ingred = this.getChoiceMap();
int width = shape[0].length();
NonNullList<RecipeItemStack> data = NonNullList.withSize(shape.length * width, RecipeItemStack.EMPTY);
Map<Character, RecipeItemStack> data = Maps.transformValues(ingred, (bukkit) -> toNMS(bukkit, false));
for (int i = 0; i < shape.length; i++) {
String row = shape[i];
for (int j = 0; j < row.length(); j++) {
data.set(i * width + j, toNMS(ingred.get(row.charAt(j)), false));
}
}
MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapedRecipes(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult()))));
MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapedRecipes(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), ShapedRecipePattern.of(data, shape), CraftItemStack.asNMSCopy(this.getResult()))));
}
}

View File

@@ -38,6 +38,7 @@ public final class CraftInventoryCreator {
converterMap.put(InventoryType.GRINDSTONE, DEFAULT_CONVERTER);
converterMap.put(InventoryType.STONECUTTER, DEFAULT_CONVERTER);
converterMap.put(InventoryType.SMITHING_NEW, DEFAULT_CONVERTER);
converterMap.put(InventoryType.CRAFTER, new CraftTileInventoryConverter.Crafter());
}
public Inventory createInventory(InventoryHolder holder, InventoryType type) {

View File

@@ -5,6 +5,7 @@ import net.minecraft.server.MinecraftServer;
import net.minecraft.world.IInventory;
import net.minecraft.world.level.World;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.CrafterBlockEntity;
import net.minecraft.world.level.block.entity.TileEntityBlastFurnace;
import net.minecraft.world.level.block.entity.TileEntityBrewingStand;
import net.minecraft.world.level.block.entity.TileEntityDispenser;
@@ -137,4 +138,12 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat
return new TileEntitySmoker(BlockPosition.ZERO, Blocks.SMOKER.defaultBlockState());
}
}
public static class Crafter extends CraftTileInventoryConverter {
@Override
public IInventory getTileEntity() {
return new CrafterBlockEntity(BlockPosition.ZERO, Blocks.CRAFTER.defaultBlockState());
}
}
}

View File

@@ -5,6 +5,7 @@ import com.google.common.collect.Iterables;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap;
import com.mojang.authlib.yggdrasil.ProfileResult;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -13,15 +14,11 @@ import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.SystemUtils;
import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.world.level.block.entity.TileEntitySkull;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.configuration.serialization.SerializableAs;
@@ -139,14 +136,9 @@ public final class CraftPlayerProfile implements PlayerProfile {
// Look up properties such as the textures:
if (!profile.getId().equals(SystemUtils.NIL_UUID)) {
GameProfile newProfile;
try {
newProfile = TileEntitySkull.fillProfileTextures(profile).get().orElse(null); // TODO: replace with CompletableFuture
} catch (InterruptedException | ExecutionException ex) {
throw new RuntimeException("Exception filling profile textures", ex);
}
ProfileResult newProfile = server.getSessionService().fetchProfile(profile.getId(), true);
if (newProfile != null) {
profile = newProfile;
profile = newProfile.profile();
}
}

View File

@@ -91,12 +91,12 @@ public class CraftBlockProjectileSource implements BlockProjectileSource {
}
} else if (AbstractArrow.class.isAssignableFrom(projectile)) {
if (TippedArrow.class.isAssignableFrom(projectile)) {
launch = new EntityTippedArrow(world, iposition.x(), iposition.y(), iposition.z());
launch = new EntityTippedArrow(world, iposition.x(), iposition.y(), iposition.z(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.ARROW));
((Arrow) launch.getBukkitEntity()).setBasePotionData(new PotionData(PotionType.WATER, false, false));
} else if (SpectralArrow.class.isAssignableFrom(projectile)) {
launch = new EntitySpectralArrow(world, iposition.x(), iposition.y(), iposition.z());
launch = new EntitySpectralArrow(world, iposition.x(), iposition.y(), iposition.z(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.SPECTRAL_ARROW));
} else {
launch = new EntityTippedArrow(world, iposition.x(), iposition.y(), iposition.z());
launch = new EntityTippedArrow(world, iposition.x(), iposition.y(), iposition.z(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.ARROW));
}
((EntityArrow) launch).pickup = EntityArrow.PickupStatus.ALLOWED;
((EntityArrow) launch).projectileSource = this;

View File

@@ -116,10 +116,9 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective
@Override
public Score getScore(OfflinePlayer player) {
Preconditions.checkArgument(player != null, "Player cannot be null");
checkState();
return new CraftScore(this, player.getName());
return new CraftScore(this, CraftScoreboard.getScoreHolder(player));
}
@Override
@@ -128,7 +127,7 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective
Preconditions.checkArgument(entry.length() <= Short.MAX_VALUE, "Score '" + entry + "' is longer than the limit of 32767 characters");
checkState();
return new CraftScore(this, entry);
return new CraftScore(this, CraftScoreboard.getScoreHolder(entry));
}
@Override

View File

@@ -1,9 +1,8 @@
package org.bukkit.craftbukkit.scoreboard;
import java.util.Map;
import net.minecraft.world.scores.ReadOnlyScoreInfo;
import net.minecraft.world.scores.ScoreHolder;
import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.scores.ScoreboardObjective;
import net.minecraft.world.scores.ScoreboardScore;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.scoreboard.Objective;
@@ -16,22 +15,22 @@ import org.bukkit.scoreboard.Score;
* Also, as an added perk, a CraftScore will (intentionally) stay a valid reference so long as objective is valid.
*/
final class CraftScore implements Score {
private final String entry;
private final ScoreHolder entry;
private final CraftObjective objective;
CraftScore(CraftObjective objective, String entry) {
CraftScore(CraftObjective objective, ScoreHolder entry) {
this.objective = objective;
this.entry = entry;
}
@Override
public OfflinePlayer getPlayer() {
return Bukkit.getOfflinePlayer(entry);
return Bukkit.getOfflinePlayer(entry.getScoreboardName());
}
@Override
public String getEntry() {
return entry;
return entry.getScoreboardName();
}
@Override
@@ -44,10 +43,9 @@ final class CraftScore implements Score {
Scoreboard board = objective.checkState().board;
if (board.getTrackedPlayers().contains(entry)) { // Lazy
Map<ScoreboardObjective, ScoreboardScore> scores = board.getPlayerScores(entry);
ScoreboardScore score = scores.get(objective.getHandle());
ReadOnlyScoreInfo score = board.getPlayerScoreInfo(entry, objective.getHandle());
if (score != null) { // Lazy
return score.getScore();
return score.value();
}
}
@@ -56,14 +54,14 @@ final class CraftScore implements Score {
@Override
public void setScore(int score) {
objective.checkState().board.getOrCreatePlayerScore(entry, objective.getHandle()).setScore(score);
objective.checkState().board.getOrCreatePlayerScore(entry, objective.getHandle()).set(score);
}
@Override
public boolean isScoreSet() {
Scoreboard board = objective.checkState().board;
return board.getTrackedPlayers().contains(entry) && board.getPlayerScores(entry).containsKey(objective.getHandle());
return board.getTrackedPlayers().contains(entry) && board.getPlayerScoreInfo(entry, objective.getHandle()) != null;
}
@Override

View File

@@ -4,11 +4,13 @@ import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import net.minecraft.world.scores.ScoreHolder;
import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.scores.ScoreboardObjective;
import net.minecraft.world.scores.ScoreboardTeam;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.scoreboard.Criteria;
import org.bukkit.scoreboard.DisplaySlot;
@@ -53,7 +55,7 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
Preconditions.checkArgument(name.length() <= Short.MAX_VALUE, "The name '%s' is longer than the limit of 32767 characters (%s)", name, name.length());
Preconditions.checkArgument(board.getObjective(name) == null, "An objective of name '%s' already exists", name);
ScoreboardObjective objective = board.addObjective(name, ((CraftCriteria) criteria).criteria, CraftChatMessage.fromStringOrNull(displayName), CraftScoreboardTranslations.fromBukkitRender(renderType));
ScoreboardObjective objective = board.addObjective(name, ((CraftCriteria) criteria).criteria, CraftChatMessage.fromStringOrNull(displayName), CraftScoreboardTranslations.fromBukkitRender(renderType), true, null);
return new CraftObjective(this, objective);
}
@@ -110,13 +112,15 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
@Override
public ImmutableSet<Score> getScores(OfflinePlayer player) {
Preconditions.checkArgument(player != null, "OfflinePlayer cannot be null");
return getScores(player.getName());
return getScores(getScoreHolder(player));
}
@Override
public ImmutableSet<Score> getScores(String entry) {
return getScores(getScoreHolder(entry));
}
private ImmutableSet<Score> getScores(ScoreHolder entry) {
Preconditions.checkArgument(entry != null, "Entry cannot be null");
ImmutableSet.Builder<Score> scores = ImmutableSet.builder();
@@ -128,17 +132,19 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
@Override
public void resetScores(OfflinePlayer player) {
Preconditions.checkArgument(player != null, "OfflinePlayer cannot be null");
resetScores(player.getName());
resetScores(getScoreHolder(player));
}
@Override
public void resetScores(String entry) {
resetScores(getScoreHolder(entry));
}
private void resetScores(ScoreHolder entry) {
Preconditions.checkArgument(entry != null, "Entry cannot be null");
for (ScoreboardObjective objective : this.board.getObjectives()) {
board.resetPlayerScore(entry, objective);
board.resetSinglePlayerScore(entry, objective);
}
}
@@ -208,4 +214,18 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
public Scoreboard getHandle() {
return board;
}
static ScoreHolder getScoreHolder(String entry) {
return () -> entry;
}
static ScoreHolder getScoreHolder(OfflinePlayer player) {
Preconditions.checkArgument(player != null, "OfflinePlayer cannot be null");
if (player instanceof CraftPlayer craft) {
return craft.getHandle();
} else {
return getScoreHolder(player.getName());
}
}
}

View File

@@ -12,14 +12,14 @@ import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.ScoreboardServer;
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.world.scores.ScoreAccess;
import net.minecraft.world.scores.ScoreHolder;
import net.minecraft.world.scores.Scoreboard;
import net.minecraft.world.scores.ScoreboardObjective;
import net.minecraft.world.scores.ScoreboardScore;
import net.minecraft.world.scores.ScoreboardTeam;
import net.minecraft.world.scores.criteria.IScoreboardCriteria;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.craftbukkit.util.WeakCollection;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.ScoreboardManager;
public final class CraftScoreboardManager implements ScoreboardManager {
@@ -93,15 +93,15 @@ public final class CraftScoreboardManager implements ScoreboardManager {
}
// CraftBukkit method
public void removePlayer(Player player) {
public void removePlayer(CraftPlayer player) {
playerBoards.remove(player);
}
// CraftBukkit method
public void getScoreboardScores(IScoreboardCriteria criteria, String name, Consumer<ScoreboardScore> consumer) {
public void forAllObjectives(IScoreboardCriteria criteria, ScoreHolder holder, Consumer<ScoreAccess> consumer) {
for (CraftScoreboard scoreboard : scoreboards) {
Scoreboard board = scoreboard.board;
board.forAllObjectives(criteria, name, (score) -> consumer.accept(score));
board.forAllObjectives(criteria, holder, (score) -> consumer.accept(score));
}
}
}

View File

@@ -239,6 +239,9 @@ public class Commodore
case "GRASS_PATH":
name = "DIRT_PATH";
break;
case "GRASS":
name = "SHORT_GRASS";
break;
}
}

View File

@@ -14,7 +14,6 @@ import net.minecraft.network.chat.ChatClickable;
import net.minecraft.network.chat.ChatClickable.EnumClickAction;
import net.minecraft.network.chat.ChatHexColor;
import net.minecraft.network.chat.ChatModifier;
import net.minecraft.network.chat.ComponentContents;
import net.minecraft.network.chat.IChatBaseComponent;
import net.minecraft.network.chat.IChatMutableComponent;
import net.minecraft.network.chat.contents.LiteralContents;
@@ -89,7 +88,7 @@ public final class CraftChatMessage {
hex.append(c);
if (hex.length() == 7) {
modifier = RESET.withColor(ChatHexColor.parseColor(hex.toString()));
modifier = RESET.withColor(ChatHexColor.parseColor(hex.toString()).result().get());
hex = null;
}
} else if (format.isFormat() && format != EnumChatFormat.RESET) {
@@ -297,7 +296,7 @@ public final class CraftChatMessage {
for (IChatBaseComponent c : component) {
ChatModifier modi = c.getStyle();
ChatHexColor color = modi.getColor();
if (c.getContents() != ComponentContents.EMPTY || color != null) {
if (c.getContents() != LiteralContents.EMPTY || color != null) {
if (color != null) {
if (color.format != null) {
out.append(color.format);

View File

@@ -3,17 +3,16 @@ package org.bukkit.craftbukkit.util;
import com.google.common.base.Charsets;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.io.Files;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.JsonOps;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -22,8 +21,8 @@ import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.minecraft.SharedConstants;
import net.minecraft.SystemUtils;
import net.minecraft.advancements.AdvancementHolder;
import net.minecraft.advancements.critereon.LootDeserializationContext;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.DynamicOpsNBT;
@@ -34,7 +33,6 @@ import net.minecraft.nbt.NBTTagString;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.server.AdvancementDataWorld;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatDeserializer;
import net.minecraft.util.datafix.DataConverterRegistry;
import net.minecraft.util.datafix.fixes.DataConverterTypes;
import net.minecraft.world.entity.EntityTypes;
@@ -225,7 +223,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
* @return string
*/
public String getMappingsVersion() {
return "3478a65bfd04b15b431fe107b3617dfc";
return "60a2bb6bf2684dc61c56b90d7c41bddc";
}
@Override
@@ -258,8 +256,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
MinecraftKey minecraftkey = CraftNamespacedKey.toMinecraft(key);
JsonElement jsonelement = AdvancementDataWorld.GSON.fromJson(advancement, JsonElement.class);
JsonObject jsonobject = ChatDeserializer.convertToJsonObject(jsonelement, "advancement");
net.minecraft.advancements.Advancement nms = net.minecraft.advancements.Advancement.fromJson(jsonobject, new LootDeserializationContext(minecraftkey, MinecraftServer.getServer().getLootData()));
net.minecraft.advancements.Advancement nms = SystemUtils.getOrThrow(net.minecraft.advancements.Advancement.CODEC.parse(JsonOps.INSTANCE, jsonelement), JsonParseException::new);
if (nms != null) {
MinecraftServer.getServer().getAdvancements().advancements.put(minecraftkey, new AdvancementHolder(minecraftkey, nms));
Advancement bukkit = Bukkit.getAdvancement(key);

View File

@@ -4,9 +4,10 @@ import static org.junit.jupiter.api.Assertions.*;
import net.minecraft.EnumChatFormat;
import net.minecraft.network.chat.IChatBaseComponent;
import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.support.AbstractTestingBase;
import org.junit.jupiter.api.Test;
public class ChatTest {
public class ChatTest extends AbstractTestingBase {
@Test
public void testColors() {
@@ -25,15 +26,15 @@ public class ChatTest {
public void testURLJsonConversion() {
IChatBaseComponent[] components;
components = CraftChatMessage.fromString("https://spigotmc.org/test Test Message");
assertEquals("{\"extra\":[{\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://spigotmc.org/test\"},\"text\":\"https://spigotmc.org/test\"},{\"text\":\" Test Message\"}],\"text\":\"\"}",
assertEquals("{\"text\":\"\",\"extra\":[{\"text\":\"https://spigotmc.org/test\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://spigotmc.org/test\"}},\" Test Message\"]}",
CraftChatMessage.toJSON(components[0]));
components = CraftChatMessage.fromString("123 " + ChatColor.GOLD + "https://spigotmc.org " + ChatColor.BOLD + "test");
assertEquals("{\"extra\":[{\"text\":\"123 \"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gold\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://spigotmc.org\"},\"text\":\"https://spigotmc.org\"},{\"bold\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gold\",\"text\":\" \"},{\"bold\":true,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"obfuscated\":false,\"color\":\"gold\",\"text\":\"test\"}],\"text\":\"\"}",
assertEquals("{\"text\":\"\",\"extra\":[\"123 \",{\"text\":\"https://spigotmc.org\",\"obfuscated\":false,\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://spigotmc.org\"},\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"color\":\"gold\",\"bold\":false},{\"text\":\" \",\"obfuscated\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"color\":\"gold\",\"bold\":false},{\"text\":\"test\",\"obfuscated\":false,\"italic\":false,\"underlined\":false,\"strikethrough\":false,\"color\":\"gold\",\"bold\":true}]}",
CraftChatMessage.toJSON(components[0]));
components = CraftChatMessage.fromString("multiCase http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE");
assertEquals("{\"extra\":[{\"text\":\"multiCase \"},{\"clickEvent\":{\"action\":\"open_url\",\"value\":\"http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE\"},\"text\":\"http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE\"}],\"text\":\"\"}",
assertEquals("{\"text\":\"\",\"extra\":[\"multiCase \",{\"text\":\"http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"http://SpigotMC.ORg/SpOngeBobMeEMeGoESHeRE\"}}]}",
CraftChatMessage.toJSON(components[0]));
}
}

View File

@@ -27,7 +27,7 @@ public class CompositeSerialization extends AbstractTestingBase {
List<ItemStack> stacks = new ArrayList<ItemStack>();
stacks.add(new ItemStack(Material.STONE));
stacks.add(new ItemStack(Material.GRASS));
stacks.add(new ItemStack(Material.SHORT_GRASS));
stacks.add(new ItemStack(Material.DIRT));
stacks.add(new ItemStack(Material.COBBLESTONE, 17));
stacks.add(new ItemStack(Material.OAK_PLANKS, 63));

View File

@@ -111,6 +111,15 @@ public class LegacyTest extends AbstractTestingBase {
Material.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, Material.RAISER_ARMOR_TRIM_SMITHING_TEMPLATE, Material.HOST_ARMOR_TRIM_SMITHING_TEMPLATE, Material.ANGLER_POTTERY_SHERD, Material.ARCHER_POTTERY_SHERD, Material.ARMS_UP_POTTERY_SHERD, Material.BLADE_POTTERY_SHERD,
Material.BREWER_POTTERY_SHERD, Material.BURN_POTTERY_SHERD, Material.DANGER_POTTERY_SHERD, Material.EXPLORER_POTTERY_SHERD, Material.FRIEND_POTTERY_SHERD, Material.HEART_POTTERY_SHERD, Material.HEARTBREAK_POTTERY_SHERD, Material.HOWL_POTTERY_SHERD,
Material.MINER_POTTERY_SHERD, Material.MOURNER_POTTERY_SHERD, Material.PLENTY_POTTERY_SHERD, Material.PRIZE_POTTERY_SHERD, Material.SHEAF_POTTERY_SHERD, Material.SHELTER_POTTERY_SHERD, Material.SKULL_POTTERY_SHERD, Material.SNORT_POTTERY_SHERD, Material.PITCHER_CROP,
// 1.20.3
Material.CRAFTER, Material.TUFF_SLAB, Material.TUFF_STAIRS, Material.TUFF_WALL, Material.CHISELED_TUFF, Material.POLISHED_TUFF, Material.POLISHED_TUFF_SLAB, Material.POLISHED_TUFF_STAIRS, Material.POLISHED_TUFF_WALL, Material.TUFF_BRICKS,
Material.TUFF_BRICK_SLAB, Material.TUFF_BRICK_STAIRS, Material.TUFF_BRICK_WALL, Material.CHISELED_TUFF_BRICKS, Material.CHISELED_COPPER, Material.EXPOSED_CHISELED_COPPER, Material.WEATHERED_CHISELED_COPPER, Material.OXIDIZED_CHISELED_COPPER,
Material.WAXED_CHISELED_COPPER, Material.WAXED_EXPOSED_CHISELED_COPPER, Material.WAXED_WEATHERED_CHISELED_COPPER, Material.WAXED_OXIDIZED_CHISELED_COPPER, Material.COPPER_DOOR, Material.EXPOSED_COPPER_DOOR, Material.WEATHERED_COPPER_DOOR,
Material.OXIDIZED_COPPER_DOOR, Material.WAXED_COPPER_DOOR, Material.WAXED_EXPOSED_COPPER_DOOR, Material.WAXED_WEATHERED_COPPER_DOOR, Material.WAXED_OXIDIZED_COPPER_DOOR, Material.COPPER_TRAPDOOR, Material.EXPOSED_COPPER_TRAPDOOR,
Material.WEATHERED_COPPER_TRAPDOOR, Material.OXIDIZED_COPPER_TRAPDOOR, Material.WAXED_COPPER_TRAPDOOR, Material.WAXED_EXPOSED_COPPER_TRAPDOOR, Material.WAXED_WEATHERED_COPPER_TRAPDOOR, Material.WAXED_OXIDIZED_COPPER_TRAPDOOR, Material.COPPER_GRATE,
Material.EXPOSED_COPPER_GRATE, Material.WEATHERED_COPPER_GRATE, Material.OXIDIZED_COPPER_GRATE, Material.WAXED_COPPER_GRATE, Material.WAXED_EXPOSED_COPPER_GRATE, Material.WAXED_WEATHERED_COPPER_GRATE, Material.WAXED_OXIDIZED_COPPER_GRATE,
Material.COPPER_BULB, Material.EXPOSED_COPPER_BULB, Material.WEATHERED_COPPER_BULB, Material.OXIDIZED_COPPER_BULB, Material.WAXED_COPPER_BULB, Material.WAXED_EXPOSED_COPPER_BULB, Material.WAXED_WEATHERED_COPPER_BULB, Material.WAXED_OXIDIZED_COPPER_BULB,
Material.BREEZE_SPAWN_EGG, Material.TRIAL_KEY, Material.TRIAL_SPAWNER,
//
Material.LEGACY_AIR, Material.LEGACY_DEAD_BUSH, Material.LEGACY_BURNING_FURNACE, Material.LEGACY_WALL_SIGN, Material.LEGACY_REDSTONE_TORCH_OFF, Material.LEGACY_SKULL, Material.LEGACY_REDSTONE_COMPARATOR_ON, Material.LEGACY_WALL_BANNER, Material.LEGACY_MONSTER_EGG));

View File

@@ -1,7 +1,6 @@
package org.bukkit.craftbukkit.util;
import static org.junit.jupiter.api.Assertions.*;
import net.minecraft.network.chat.ComponentContents;
import net.minecraft.network.chat.IChatBaseComponent;
import net.minecraft.network.chat.IChatMutableComponent;
import net.minecraft.network.chat.contents.LiteralContents;
@@ -97,7 +96,7 @@ public class CraftChatMessageTest {
private boolean containsNonPlainComponent(IChatBaseComponent component) {
for (IChatBaseComponent c : component) {
if (c.getContents() != ComponentContents.EMPTY && !(c.getContents() instanceof LiteralContents)) {
if (c.getContents() != LiteralContents.EMPTY && !(c.getContents() instanceof LiteralContents)) {
return true;
}
}