Fix compile issues:

- Changes:
Turtle now included in the experience orb dropped
- Todo: See what spigot does for CraftEquippableComponent serialization
This commit is contained in:
Owen1212055
2025-05-31 13:16:26 -04:00
parent 19a36413c7
commit e49b5e88fa
29 changed files with 187 additions and 70 deletions

View File

@@ -474,6 +474,7 @@ public net.minecraft.world.entity.projectile.LargeFireball explosionPower
public net.minecraft.world.entity.projectile.Projectile cachedOwner public net.minecraft.world.entity.projectile.Projectile cachedOwner
public net.minecraft.world.entity.projectile.Projectile hasBeenShot public net.minecraft.world.entity.projectile.Projectile hasBeenShot
public net.minecraft.world.entity.projectile.Projectile leftOwner public net.minecraft.world.entity.projectile.Projectile leftOwner
public net.minecraft.world.entity.projectile.Projectile owner
public net.minecraft.world.entity.projectile.Projectile ownerUUID public net.minecraft.world.entity.projectile.Projectile ownerUUID
public net.minecraft.world.entity.projectile.ShulkerBullet currentMoveDirection public net.minecraft.world.entity.projectile.ShulkerBullet currentMoveDirection
public net.minecraft.world.entity.projectile.ShulkerBullet flightSteps public net.minecraft.world.entity.projectile.ShulkerBullet flightSteps

View File

@@ -630,8 +630,8 @@
+ org.bukkit.Location exit = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(absolutePosition.position(), level.getWorld(), absolutePosition.yRot(), absolutePosition.xRot()); + org.bukkit.Location exit = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(absolutePosition.position(), level.getWorld(), absolutePosition.yRot(), absolutePosition.xRot());
+ org.bukkit.event.player.PlayerTeleportEvent tpEvent = new org.bukkit.event.player.PlayerTeleportEvent(this.getBukkitEntity(), enter, exit.clone(), teleportTransition.cause()); + org.bukkit.event.player.PlayerTeleportEvent tpEvent = new org.bukkit.event.player.PlayerTeleportEvent(this.getBukkitEntity(), enter, exit.clone(), teleportTransition.cause());
+ // Paper start - gateway-specific teleport event + // Paper start - gateway-specific teleport event
+ if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.serverLevel().getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) { + if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.level().getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) {
+ tpEvent = new com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent(this.getBukkitEntity(), enter, exit.clone(), new org.bukkit.craftbukkit.block.CraftEndGateway(this.serverLevel().getWorld(), theEndGatewayBlockEntity)); + tpEvent = new com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent(this.getBukkitEntity(), enter, exit.clone(), new org.bukkit.craftbukkit.block.CraftEndGateway(this.level().getWorld(), theEndGatewayBlockEntity));
+ } + }
+ // Paper end - gateway-specific teleport event + // Paper end - gateway-specific teleport event
+ org.bukkit.Bukkit.getServer().getPluginManager().callEvent(tpEvent); + org.bukkit.Bukkit.getServer().getPluginManager().callEvent(tpEvent);

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -208,6 +_,39 @@ @@ -208,6 +_,38 @@
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -33,7 +33,6 @@
+import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent;
+import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.player.PlayerToggleFlightEvent; +import org.bukkit.event.player.PlayerToggleFlightEvent;
+import org.bukkit.event.player.PlayerToggleSneakEvent;
+import org.bukkit.event.player.PlayerToggleSprintEvent; +import org.bukkit.event.player.PlayerToggleSprintEvent;
+// CraftBukkit end +// CraftBukkit end
+ +
@@ -141,7 +140,7 @@
} }
private int getMaximumFlyingTicks(Entity entity) { private int getMaximumFlyingTicks(Entity entity) {
@@ -388,11 +_,22 @@ @@ -388,11 +_,37 @@
@Override @Override
public void handlePlayerInput(ServerboundPlayerInputPacket packet) { public void handlePlayerInput(ServerboundPlayerInputPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
@@ -151,16 +150,33 @@
+ this.cserver.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event);
+ } + }
+ // CraftBukkit end + // CraftBukkit end
+ // Paper
+ net.minecraft.world.entity.player.Input lastInput = this.player.getLastClientInput();
+ boolean shiftKeyDown =packet.input().shift();
+ if (lastInput.shift() != packet.input().shift()) {
+ // Has sneak changed
+ org.bukkit.event.player.PlayerToggleSneakEvent event = new org.bukkit.event.player.PlayerToggleSneakEvent(this.getCraftPlayer(), packet.input().shift());
+ this.cserver.getPluginManager().callEvent(event);
+
+ // Technically the player input and the flag is desynced, but this is previous behavior.. so should be fine?
+ if (event.isCancelled()) {
+ shiftKeyDown = this.player.isShiftKeyDown();
+ }
+ }
+ // Paper end
this.player.setLastClientInput(packet.input()); this.player.setLastClientInput(packet.input());
if (this.player.hasClientLoaded()) { if (this.player.hasClientLoaded()) {
this.player.resetLastActionTime(); this.player.resetLastActionTime();
this.player.setShiftKeyDown(packet.input().shift()); - this.player.setShiftKeyDown(packet.input().shift());
} - }
+ this.player.setShiftKeyDown(shiftKeyDown); // Paper
+ }
+ // Paper start - Add option to make parrots stay + // Paper start - Add option to make parrots stay
+ if (packet.input().shift() && this.player.level().paperConfig().entities.behavior.parrotsAreUnaffectedByPlayerMovement) { + if (packet.input().shift() && this.player.level().paperConfig().entities.behavior.parrotsAreUnaffectedByPlayerMovement) {
+ this.player.removeEntitiesOnShoulder(); + this.player.removeEntitiesOnShoulder();
+ } + }
+ // Paper end - Add option to make parrots stay + // Paper end - Add option to make parrots stay
+
} }
private static boolean containsInvalidValues(double x, double y, double z, float yRot, float xRot) { private static boolean containsInvalidValues(double x, double y, double z, float yRot, float xRot) {
@@ -351,7 +367,7 @@
this.lastGoodZ = this.awaitingPositionFromClient.z; this.lastGoodZ = this.awaitingPositionFromClient.z;
this.player.hasChangedDimension(); this.player.hasChangedDimension();
this.awaitingPositionFromClient = null; this.awaitingPositionFromClient = null;
+ this.player.serverLevel().getChunkSource().move(this.player); // CraftBukkit + this.player.level().getChunkSource().move(this.player); // CraftBukkit
} }
} }
@@ -1702,23 +1718,13 @@
this.player.swing(packet.getHand()); this.player.swing(packet.getHand());
} }
@@ -1598,6 +_,32 @@ @@ -1598,6 +_,22 @@
public void handlePlayerCommand(ServerboundPlayerCommandPacket packet) { public void handlePlayerCommand(ServerboundPlayerCommandPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
if (this.player.hasClientLoaded()) { if (this.player.hasClientLoaded()) {
+ // CraftBukkit start + // CraftBukkit start
+ if (this.player.isRemoved()) return; + if (this.player.isRemoved()) return;
+ switch (packet.getAction()) { + switch (packet.getAction()) {
+ case PRESS_SHIFT_KEY:
+ case RELEASE_SHIFT_KEY: {
+ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getCraftPlayer(), packet.getAction() == ServerboundPlayerCommandPacket.Action.PRESS_SHIFT_KEY);
+ this.cserver.getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ return;
+ }
+ break;
+ }
+ case START_SPRINTING: + case START_SPRINTING:
+ case STOP_SPRINTING: { + case STOP_SPRINTING: {
+ PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getCraftPlayer(), packet.getAction() == ServerboundPlayerCommandPacket.Action.START_SPRINTING); + PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getCraftPlayer(), packet.getAction() == ServerboundPlayerCommandPacket.Action.START_SPRINTING);
@@ -1948,7 +1954,7 @@
- this.player.setGameMode(GameType.SPECTATOR); - this.player.setGameMode(GameType.SPECTATOR);
- this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.server); - this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.server);
+ this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent + this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent
+ this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.player.serverLevel()); // CraftBukkit - per-world + this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.player.level()); // CraftBukkit - per-world
} }
} }
break; break;

View File

@@ -207,7 +207,7 @@
} }
+ // CraftBukkit start + // CraftBukkit start
+ input.getDouble("Bukkit.MaxHealth").ifPresent(maxHealth -> { + input.read("Bukkit.MaxHealth", com.mojang.serialization.Codec.DOUBLE).ifPresent(maxHealth -> {
+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(maxHealth); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(maxHealth);
+ }); + });
+ // CraftBukkit end + // CraftBukkit end
@@ -944,7 +944,7 @@
+ protected void dropExperience(ServerLevel level, @Nullable Entity entity) { + protected void dropExperience(ServerLevel level, @Nullable Entity entity) {
+ // CraftBukkit start - Update getExpReward() above if the removed if() changes! + // CraftBukkit start - Update getExpReward() above if the removed if() changes!
+ if (!(this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon)) { // CraftBukkit - SPIGOT-2420: Special case ender dragon will drop the xp over time + if (!(this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon)) { // CraftBukkit - SPIGOT-2420: Special case ender dragon will drop the xp over time
+ ExperienceOrb.award(level, this.position(), this.expToDrop, this instanceof ServerPlayer ? org.bukkit.entity.ExperienceOrb.SpawnReason.PLAYER_DEATH : org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, entity, this); // Paper + ExperienceOrb.awardWithDirection(level, this.position(), net.minecraft.world.phys.Vec3.ZERO, this.expToDrop, this instanceof ServerPlayer ? org.bukkit.entity.ExperienceOrb.SpawnReason.PLAYER_DEATH : org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, entity, this); // Paper
+ this.expToDrop = 0; + this.expToDrop = 0;
+ } + }
+ // CraftBukkit end + // CraftBukkit end
@@ -1564,7 +1564,7 @@
public void onItemPickup(ItemEntity itemEntity) { public void onItemPickup(ItemEntity itemEntity) {
- Entity owner = itemEntity.getOwner(); - Entity owner = itemEntity.getOwner();
+ Entity owner = itemEntity.thrower != null ? this.level().getGlobalPlayerByUUID(itemEntity.thrower) : null; // Paper - check global player list where appropriate + Entity owner = itemEntity.thrower != null ? itemEntity.thrower.getEntity(this.level()::getGlobalPlayerByUUID, Entity.class) : null; // Paper - check global player list where appropriate
if (owner instanceof ServerPlayer) { if (owner instanceof ServerPlayer) {
CriteriaTriggers.THROWN_ITEM_PICKED_UP_BY_ENTITY.trigger((ServerPlayer)owner, itemEntity.getItem(), this); CriteriaTriggers.THROWN_ITEM_PICKED_UP_BY_ENTITY.trigger((ServerPlayer)owner, itemEntity.getItem(), this);
} }

View File

@@ -25,3 +25,21 @@
return this.player != null; return this.player != null;
} }
} }
@@ -123,7 +_,7 @@
this.mob.getNavigation().stop();
}
- protected void navigateTowards(Player player) {
+ protected void navigateTowards(LivingEntity player) { // Paper
this.mob.getNavigation().moveTo(player, this.speedModifier);
}
@@ -142,7 +_,7 @@
}
@Override
- protected void navigateTowards(Player player) {
+ protected void navigateTowards(LivingEntity player) { // Paper
Vec3 vec3 = player.getEyePosition().subtract(this.mob.position()).scale(this.mob.getRandom().nextDouble()).add(this.mob.position());
this.mob.getMoveControl().setWantedPosition(vec3.x, vec3.y, vec3.z, this.speedModifier);
}

View File

@@ -108,7 +108,7 @@
- if (level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - if (level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- level.addFreshEntity(new ExperienceOrb(level, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1)); - level.addFreshEntity(new ExperienceOrb(level, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1));
+ if (experience > 0 && level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { // Paper - Call EntityBreedEvent + if (experience > 0 && level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { // Paper - Call EntityBreedEvent
+ level.addFreshEntity(new ExperienceOrb(level, this.getX(), this.getY(), this.getZ(), experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, player, baby)); // Paper - Call EntityBreedEvent, add spawn context + level.addFreshEntity(new ExperienceOrb(level, this.position(), net.minecraft.world.phys.Vec3.ZERO, experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, player, baby)); // Paper - Call EntityBreedEvent, add spawn context
} }
} }

View File

@@ -142,7 +142,7 @@
this.level this.level
.addFreshEntity( .addFreshEntity(
- new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), this.animal.getRandom().nextInt(7) + 1) - new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), this.animal.getRandom().nextInt(7) + 1)
+ new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, loveCause, fox) // Paper - call EntityBreedEvent, add spawn context + new ExperienceOrb(this.level, this.animal.position(), net.minecraft.world.phys.Vec3.ZERO, experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, loveCause, fox) // Paper - call EntityBreedEvent, add spawn context
); );
} }
} }

View File

@@ -0,0 +1,25 @@
--- a/net/minecraft/world/entity/animal/HappyGhast.java
+++ b/net/minecraft/world/entity/animal/HappyGhast.java
@@ -296,8 +_,12 @@
}
@Override
- protected void removePassenger(Entity passenger) {
- super.removePassenger(passenger);
+ // Paper start - cancellable passengers
+ protected boolean removePassenger(Entity passenger) {
+ if (!super.removePassenger(passenger)) {
+ return false;
+ }
+ // Paper end - cancellable passengers
if (!this.level().isClientSide) {
this.setServerStillTimeout(this.getPassengers().isEmpty() ? 40 : 10);
}
@@ -306,6 +_,7 @@
this.clearHome();
this.level().playSound(null, this.getX(), this.getY(), this.getZ(), SoundEvents.HARNESS_GOGGLES_UP, this.getSoundSource(), 1.0F, 1.0F);
}
+ return true; // Paper - cancellable passengers
}
@Override

View File

@@ -35,7 +35,7 @@
RandomSource random = this.animal.getRandom(); RandomSource random = this.animal.getRandom();
if (getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { if (getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- this.level.addFreshEntity(new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), random.nextInt(7) + 1)); - this.level.addFreshEntity(new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), random.nextInt(7) + 1));
+ if (event.getExperience() > 0) this.level.addFreshEntity(new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), event.getExperience(), org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, loveCause)); // Paper - Add EntityFertilizeEggEvent event + if (event.getExperience() > 0) this.level.addFreshEntity(new ExperienceOrb(this.level, this.animal.position(), Vec3.ZERO, event.getExperience(), org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, loveCause, this.turtle)); // Paper - Add EntityFertilizeEggEvent event
} }
} }
} }

View File

@@ -186,7 +186,7 @@
- if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0 && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0 && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- ExperienceOrb.award(serverLevel, this.position(), Mth.floor(i * 0.08F)); - ExperienceOrb.award(serverLevel, this.position(), Mth.floor(i * 0.08F));
+ if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0) { // CraftBukkit - SPIGOT-2420: Already checked for the game rule when calculating the xp + if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0) { // CraftBukkit - SPIGOT-2420: Already checked for the game rule when calculating the xp
+ ExperienceOrb.award(serverLevel, this.position(), Mth.floor(i * 0.08F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, net.minecraft.Optionull.map(this.lastHurtByPlayer, lastHurtByPlayer -> lastHurtByPlayer.getEntity(this.level(), Player.class)), this); // Paper + ExperienceOrb.awardWithDirection(serverLevel, this.position(), net.minecraft.world.phys.Vec3.ZERO, Mth.floor(i * 0.08F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, net.minecraft.Optionull.map(this.lastHurtByPlayer, lastHurtByPlayer -> lastHurtByPlayer.getEntity(this.level(), Player.class)), this); // Paper
} }
if (this.dragonDeathTime == 1 && !this.isSilent()) { if (this.dragonDeathTime == 1 && !this.isSilent()) {
@@ -220,7 +220,7 @@
- if (serverLevel1.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - if (serverLevel1.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
- ExperienceOrb.award(serverLevel1, this.position(), Mth.floor(i * 0.2F)); - ExperienceOrb.award(serverLevel1, this.position(), Mth.floor(i * 0.2F));
+ if (true) { // Paper - SPIGOT-2420: Already checked for the game rule when calculating the xp + if (true) { // Paper - SPIGOT-2420: Already checked for the game rule when calculating the xp
+ ExperienceOrb.award(serverLevel1, this.position(), Mth.floor(i * 0.2F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, net.minecraft.Optionull.map(this.lastHurtByPlayer, lastHurtByPlayer -> lastHurtByPlayer.getEntity(this.level(), Player.class)), this); // Paper + ExperienceOrb.awardWithDirection(serverLevel1, this.position(), net.minecraft.world.phys.Vec3.ZERO, Mth.floor(i * 0.2F), org.bukkit.entity.ExperienceOrb.SpawnReason.ENTITY_DEATH, net.minecraft.Optionull.map(this.lastHurtByPlayer, lastHurtByPlayer -> lastHurtByPlayer.getEntity(this.level(), Player.class)), this); // Paper
} }
if (this.dragonFight != null) { if (this.dragonFight != null) {

View File

@@ -86,7 +86,7 @@
protected void dropCustomDeathLoot(ServerLevel level, DamageSource damageSource, boolean recentlyHit) { protected void dropCustomDeathLoot(ServerLevel level, DamageSource damageSource, boolean recentlyHit) {
super.dropCustomDeathLoot(level, damageSource, recentlyHit); super.dropCustomDeathLoot(level, damageSource, recentlyHit);
- ItemEntity itemEntity = this.spawnAtLocation(level, Items.NETHER_STAR); - ItemEntity itemEntity = this.spawnAtLocation(level, Items.NETHER_STAR);
+ ItemEntity itemEntity = this.spawnAtLocation(level, new net.minecraft.world.item.ItemStack(Items.NETHER_STAR), 0, ItemEntity::setExtendedLifetime); // Paper - Restore vanilla drops behavior; spawnAtLocation returns null so modify the item entity with a consumer + ItemEntity itemEntity = this.spawnAtLocation(level, new net.minecraft.world.item.ItemStack(Items.NETHER_STAR), net.minecraft.world.phys.Vec3.ZERO, ItemEntity::setExtendedLifetime); // Paper - Restore vanilla drops behavior; spawnAtLocation returns null so modify the item entity with a consumer
if (itemEntity != null) { if (itemEntity != null) {
- itemEntity.setExtendedLifetime(); - itemEntity.setExtendedLifetime();
+ itemEntity.setExtendedLifetime(); // Paper - diff on change + itemEntity.setExtendedLifetime(); // Paper - diff on change

View File

@@ -215,7 +215,7 @@
+ playerOwner.level() + playerOwner.level()
+ .addFreshEntity( + .addFreshEntity(
+ new ExperienceOrb( + new ExperienceOrb(
+ playerOwner.level(), playerOwner.getX(), playerOwner.getY() + 0.5, playerOwner.getZ() + 0.5, playerFishEvent.getExpToDrop(), org.bukkit.entity.ExperienceOrb.SpawnReason.FISHING, this.getPlayerOwner(), this // Paper + playerOwner.level(), new net.minecraft.world.phys.Vec3(playerOwner.getX(), playerOwner.getY() + 0.5, playerOwner.getZ() + 0.5), net.minecraft.world.phys.Vec3.ZERO, playerFishEvent.getExpToDrop(), org.bukkit.entity.ExperienceOrb.SpawnReason.FISHING, this.getPlayerOwner(), this // Paper
+ ) + )
+ ); + );
+ } + }

View File

@@ -1,6 +1,12 @@
--- a/net/minecraft/world/entity/projectile/Projectile.java --- a/net/minecraft/world/entity/projectile/Projectile.java
+++ b/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java
@@ -44,6 +_,7 @@ @@ -39,11 +_,12 @@
private static final boolean DEFAULT_LEFT_OWNER = false;
private static final boolean DEFAULT_HAS_BEEN_SHOT = false;
@Nullable
- public EntityReference<Entity> owner;
+ protected EntityReference<Entity> owner;
public boolean leftOwner = false;
public boolean hasBeenShot = false; public boolean hasBeenShot = false;
@Nullable @Nullable
private Entity lastDeflectedBy; private Entity lastDeflectedBy;

View File

@@ -70,7 +70,7 @@
+ // Paper start - Fire BlockExpEvent on grindstone use + // Paper start - Fire BlockExpEvent on grindstone use
+ org.bukkit.event.block.BlockExpEvent event = new org.bukkit.event.block.BlockExpEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPos), this.getExperienceAmount(level)); + org.bukkit.event.block.BlockExpEvent event = new org.bukkit.event.block.BlockExpEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPos), this.getExperienceAmount(level));
+ event.callEvent(); + event.callEvent();
+ ExperienceOrb.award((ServerLevel) level, Vec3.atCenterOf(blockPos), event.getExpToDrop(), org.bukkit.entity.ExperienceOrb.SpawnReason.GRINDSTONE, player); + ExperienceOrb.awardWithDirection((ServerLevel) level, Vec3.atCenterOf(blockPos), Vec3.ZERO, event.getExpToDrop(), org.bukkit.entity.ExperienceOrb.SpawnReason.GRINDSTONE, player, null);
+ // Paper end - Fire BlockExpEvent on grindstone use + // Paper end - Fire BlockExpEvent on grindstone use
} }

View File

@@ -30,7 +30,7 @@
+ stack.getAllOfType(ConsumableListener.class).forEach(listener -> { + stack.getAllOfType(ConsumableListener.class).forEach(listener -> {
+ listener.cancelUsingItem(player, stack, packets); // Paper - properly resend entities - collect packets for bundle + listener.cancelUsingItem(player, stack, packets); // Paper - properly resend entities - collect packets for bundle
+ }); + });
+ player.server.getPlayerList().sendActiveEffects(player, packets::add); // Paper - properly resend entities - collect packets for bundle + player.getServer().getPlayerList().sendActiveEffects(player, packets::add); // Paper - properly resend entities - collect packets for bundle
+ player.connection.send(new net.minecraft.network.protocol.game.ClientboundBundlePacket(packets)); + player.connection.send(new net.minecraft.network.protocol.game.ClientboundBundlePacket(packets));
+ } + }
+ // CraftBukkit end + // CraftBukkit end

View File

@@ -90,7 +90,7 @@
+ // Paper end - add entity parameter + // Paper end - add entity parameter
if (level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) { if (level.getGameRules().getBoolean(GameRules.RULE_DOBLOCKDROPS)) {
- ExperienceOrb.award(level, Vec3.atCenterOf(pos), amount); - ExperienceOrb.award(level, Vec3.atCenterOf(pos), amount);
+ ExperienceOrb.award(level, Vec3.atCenterOf(pos), amount, org.bukkit.entity.ExperienceOrb.SpawnReason.BLOCK_BREAK, entity); // Paper + ExperienceOrb.awardWithDirection(level, Vec3.atCenterOf(pos), net.minecraft.world.phys.Vec3.ZERO, amount, org.bukkit.entity.ExperienceOrb.SpawnReason.BLOCK_BREAK, entity, null); // Paper
} }
} }

View File

@@ -268,7 +268,7 @@
+ floor = event.getExpToDrop(); + floor = event.getExpToDrop();
+ // CraftBukkit end + // CraftBukkit end
+ +
+ ExperienceOrb.award(level, popVec, floor, org.bukkit.entity.ExperienceOrb.SpawnReason.FURNACE, serverPlayer); // Paper + ExperienceOrb.awardWithDirection(level, popVec, net.minecraft.world.phys.Vec3.ZERO, floor, org.bukkit.entity.ExperienceOrb.SpawnReason.FURNACE, serverPlayer, null); // Paper
} }
@Override @Override

View File

@@ -26,7 +26,7 @@
+ // Paper end - guard against serializing mismatching coordinates + // Paper end - guard against serializing mismatching coordinates
+ +
+ // Paper start - Do not let the server load chunks from newer versions + // Paper start - Do not let the server load chunks from newer versions
+ private static final int CURRENT_DATA_VERSION = net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion(); + private static final int CURRENT_DATA_VERSION = net.minecraft.SharedConstants.getCurrentVersion().dataVersion().getVersion();
+ private static final boolean JUST_CORRUPT_IT = Boolean.getBoolean("Paper.ignoreWorldDataVersion"); + private static final boolean JUST_CORRUPT_IT = Boolean.getBoolean("Paper.ignoreWorldDataVersion");
+ // Paper end - Do not let the server load chunks from newer versions + // Paper end - Do not let the server load chunks from newer versions
+ +

View File

@@ -45,8 +45,8 @@ public record ServerBuildInfoImpl(
.orElse(BRAND_PAPER_ID), .orElse(BRAND_PAPER_ID),
getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME) getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME)
.orElse(BRAND_PAPER_NAME), .orElse(BRAND_PAPER_NAME),
SharedConstants.getCurrentVersion().getId(), SharedConstants.getCurrentVersion().id(),
SharedConstants.getCurrentVersion().getName(), SharedConstants.getCurrentVersion().name(),
getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER) getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER)
.map(Integer::parseInt) .map(Integer::parseInt)
.map(OptionalInt::of) .map(OptionalInt::of)

View File

@@ -162,7 +162,7 @@ public final class MobcapsCommand implements PaperSubcommand {
} }
final ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); final ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
final ServerLevel level = serverPlayer.serverLevel(); final ServerLevel level = serverPlayer.level();
if (!level.paperConfig().entities.spawning.perPlayerMobSpawns) { if (!level.paperConfig().entities.spawning.perPlayerMobSpawns) {
sender.sendMessage(Component.text("Use '/paper mobcaps' for worlds where per-player mob spawning is disabled.", NamedTextColor.RED)); sender.sendMessage(Component.text("Use '/paper mobcaps' for worlds where per-player mob spawning is disabled.", NamedTextColor.RED));

View File

@@ -177,7 +177,9 @@ public record PaperEquippable(
this.dispensable, this.dispensable,
this.swappable, this.swappable,
this.damageOnHurt, this.damageOnHurt,
this.equipOnInteract this.equipOnInteract,
false, // TODO
Holder.direct(SoundEvents.GOAT_SCREAMING_DEATH) // TODO
) )
); );
} }

View File

@@ -10,11 +10,14 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import net.minecraft.core.GlobalPos; import net.minecraft.core.GlobalPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.protocol.game.ClientboundTagQueryPacket;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.UserWhiteListEntry; import net.minecraft.server.players.UserWhiteListEntry;
import net.minecraft.stats.ServerStatsCounter; import net.minecraft.stats.ServerStatsCounter;
import net.minecraft.util.ProblemReporter;
import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.PlayerDataStorage;
import net.minecraft.world.level.storage.TagValueOutput;
import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec2;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.bukkit.BanEntry; import org.bukkit.BanEntry;
@@ -196,7 +199,8 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
} }
private CompoundTag getData() { private CompoundTag getData() {
return this.storage.load(this.profile.getName(), this.profile.getId().toString()).orElse(null); // This method does not use the problem reporter
return this.storage.load(this.profile.getName(), this.profile.getId().toString(), ProblemReporter.DISCARDING).orElse(null);
} }
private CompoundTag getBukkitData() { private CompoundTag getBukkitData() {

View File

@@ -8,8 +8,10 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.minecraft.core.RegistryAccess;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.InclusiveRange; import net.minecraft.util.InclusiveRange;
import net.minecraft.util.ProblemReporter;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.util.random.Weighted; import net.minecraft.util.random.Weighted;
import net.minecraft.util.random.WeightedList; import net.minecraft.util.random.WeightedList;
@@ -17,6 +19,8 @@ import net.minecraft.world.entity.EquipmentTable;
import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.BaseSpawner;
import net.minecraft.world.level.SpawnData; import net.minecraft.world.level.SpawnData;
import net.minecraft.world.level.block.entity.SpawnerBlockEntity; import net.minecraft.world.level.block.entity.SpawnerBlockEntity;
import net.minecraft.world.level.storage.TagValueInput;
import net.minecraft.world.level.storage.ValueInput;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.CreatureSpawner; import org.bukkit.block.CreatureSpawner;
@@ -46,8 +50,11 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<SpawnerBlockEnti
return null; return null;
} }
Optional<net.minecraft.world.entity.EntityType<?>> type = net.minecraft.world.entity.EntityType.by(spawnData.getEntityToSpawn()); try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(() -> "spawner@" + getLocation(), LOGGER)) {
return type.map(CraftEntityType::minecraftToBukkit).orElse(null); ValueInput valueInput = TagValueInput.create(scopedCollector, this.getInternalWorld().registryAccess(), spawnData.entityToSpawn());
Optional<net.minecraft.world.entity.EntityType<?>> type = net.minecraft.world.entity.EntityType.by(valueInput);
return type.map(CraftEntityType::minecraftToBukkit).orElse(null);
}
} }
@Override @Override
@@ -175,9 +182,12 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<SpawnerBlockEnti
if (spawnData == null) { if (spawnData == null) {
return null; return null;
} }
try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(() -> "spawner@" + getLocation(), LOGGER)) {
ValueInput valueInput = TagValueInput.create(scopedCollector, this.getInternalWorld().registryAccess(), spawnData.getEntityToSpawn());
Optional<net.minecraft.world.entity.EntityType<?>> type = net.minecraft.world.entity.EntityType.by(valueInput);
Optional<net.minecraft.world.entity.EntityType<?>> type = net.minecraft.world.entity.EntityType.by(spawnData.getEntityToSpawn()); return type.map(CraftEntityType::minecraftToBukkit).map(CraftEntityType::bukkitToString).orElse(null);
return type.map(CraftEntityType::minecraftToBukkit).map(CraftEntityType::bukkitToString).orElse(null); }
} }
@Override @Override

View File

@@ -1,5 +1,7 @@
package org.bukkit.craftbukkit.entity; package org.bukkit.craftbukkit.entity;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityReference;
import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.entity.Projectile; import org.bukkit.entity.Projectile;
@@ -76,7 +78,12 @@ public abstract class AbstractProjectile extends CraftEntity implements Projecti
@Override @Override
public java.util.UUID getOwnerUniqueId() { public java.util.UUID getOwnerUniqueId() {
return this.getHandle().ownerUUID; EntityReference<Entity> reference = this.getHandle().owner;
if (reference == null) {
return null;
}
return reference.getUUID();
} }
// Paper end - More projectile API // Paper end - More projectile API
} }

View File

@@ -2,6 +2,8 @@ package org.bukkit.craftbukkit.entity;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import java.util.UUID; import java.util.UUID;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.EntityReference;
import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.Animal;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftServer;
@@ -22,12 +24,17 @@ public class CraftAnimals extends CraftAgeable implements Animals {
@Override @Override
public UUID getBreedCause() { public UUID getBreedCause() {
return this.getHandle().loveCause; EntityReference<ServerPlayer> reference = this.getHandle().loveCause;
if (reference == null) {
return null;
}
return reference.getUUID();
} }
@Override @Override
public void setBreedCause(UUID uuid) { public void setBreedCause(UUID uuid) {
this.getHandle().loveCause = uuid; this.getHandle().loveCause = new EntityReference<>(uuid);
} }
@Override @Override

View File

@@ -8,6 +8,7 @@ import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import com.mojang.logging.LogUtils;
import io.papermc.paper.adventure.PaperAdventure; import io.papermc.paper.adventure.PaperAdventure;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@@ -18,11 +19,13 @@ import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.network.protocol.game.ServerboundContainerClosePacket; import net.minecraft.network.protocol.game.ServerboundContainerClosePacket;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.ProblemReporter;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntitySpawnReason;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.entity.TamableAnimal;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.FireworkRocketEntity; import net.minecraft.world.entity.projectile.FireworkRocketEntity;
@@ -38,6 +41,7 @@ import net.minecraft.world.level.block.BedBlock;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.TagValueInput;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@@ -78,9 +82,11 @@ import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
private static final Logger LOGGER = LogUtils.getLogger();
private CraftInventoryPlayer inventory; private CraftInventoryPlayer inventory;
private final CraftInventory enderChest; private final CraftInventory enderChest;
protected final PermissibleBase perm = new PermissibleBase(this); protected final PermissibleBase perm = new PermissibleBase(this);
@@ -175,7 +181,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
return null; return null;
} }
net.minecraft.server.level.ServerLevel level = ((ServerPlayer) this.getHandle()).server.getLevel(respawnConfig.dimension()); net.minecraft.server.level.ServerLevel level = ((ServerPlayer) this.getHandle()).getServer().getLevel(respawnConfig.dimension());
if (level == null) { if (level == null) {
return null; return null;
} }
@@ -769,8 +775,13 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
@Override @Override
public org.bukkit.entity.Entity getShoulderEntityLeft() { public org.bukkit.entity.Entity getShoulderEntityLeft() {
if (!this.getHandle().getShoulderEntityLeft().isEmpty()) { if (!this.getHandle().getShoulderEntityLeft().isEmpty()) {
Optional<Entity> shoulder = EntityType.create(this.getHandle().getShoulderEntityLeft(), this.getHandle().level(), EntitySpawnReason.LOAD); try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(this.getHandle().problemPath(), LOGGER)) {
return shoulder.map(Entity::getBukkitEntity).orElse(null); return EntityType.create(
TagValueInput.create(scopedCollector.forChild(() -> ".shoulder"), this.getHandle().registryAccess(), this.getHandle().getShoulderEntityLeft()),
this.getHandle().level(),
EntitySpawnReason.LOAD
).map(Entity::getBukkitEntity).orElse(null);
}
} }
return null; return null;
@@ -787,8 +798,13 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
@Override @Override
public org.bukkit.entity.Entity getShoulderEntityRight() { public org.bukkit.entity.Entity getShoulderEntityRight() {
if (!this.getHandle().getShoulderEntityRight().isEmpty()) { if (!this.getHandle().getShoulderEntityRight().isEmpty()) {
Optional<Entity> shoulder = EntityType.create(this.getHandle().getShoulderEntityRight(), this.getHandle().level(), EntitySpawnReason.LOAD); try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(this.getHandle().problemPath(), LOGGER)) {
return shoulder.map(Entity::getBukkitEntity).orElse(null); return EntityType.create(
TagValueInput.create(scopedCollector.forChild(() -> ".shoulder"), this.getHandle().registryAccess(), this.getHandle().getShoulderEntityRight()),
this.getHandle().level(),
EntitySpawnReason.LOAD
).map(Entity::getBukkitEntity).orElse(null);
}
} }
return null; return null;

View File

@@ -1562,7 +1562,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
final ServerPlayer.RespawnConfig respawnConfig = this.getHandle().getRespawnConfig(); final ServerPlayer.RespawnConfig respawnConfig = this.getHandle().getRespawnConfig();
if (respawnConfig == null) return null; if (respawnConfig == null) return null;
final ServerLevel world = this.getHandle().server.getLevel(respawnConfig.dimension()); final ServerLevel world = this.getHandle().getServer().getLevel(respawnConfig.dimension());
if (world == null) return null; if (world == null) return null;
if (!loadLocationAndValidate) { if (!loadLocationAndValidate) {
@@ -1887,7 +1887,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
orb.setPosRaw(handle.getX(), handle.getY(), handle.getZ()); orb.setPosRaw(handle.getX(), handle.getY(), handle.getZ());
final int possibleDurabilityFromXp = net.minecraft.world.item.enchantment.EnchantmentHelper.modifyDurabilityToRepairFromXp( final int possibleDurabilityFromXp = net.minecraft.world.item.enchantment.EnchantmentHelper.modifyDurabilityToRepairFromXp(
handle.serverLevel(), itemstack, amount handle.level(), itemstack, amount
); );
int i = Math.min(possibleDurabilityFromXp, itemstack.getDamageValue()); int i = Math.min(possibleDurabilityFromXp, itemstack.getDamageValue());
final int consumedExperience = i > 0 ? i * amount / possibleDurabilityFromXp : possibleDurabilityFromXp; // Paper - taken from ExperienceOrb#repairPlayerItems + prevent division by 0 final int consumedExperience = i > 0 ? i * amount / possibleDurabilityFromXp : possibleDurabilityFromXp; // Paper - taken from ExperienceOrb#repairPlayerItems + prevent division by 0
@@ -2236,11 +2236,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
ServerGamePacketListenerImpl connection = handle.connection; ServerGamePacketListenerImpl connection = handle.connection;
// Respawn the player then update their position and selected slot // Respawn the player then update their position and selected slot
ServerLevel level = handle.serverLevel(); ServerLevel level = handle.level();
connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(handle.createCommonSpawnInfo(level), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA)); connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(handle.createCommonSpawnInfo(level), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA));
handle.onUpdateAbilities(); handle.onUpdateAbilities();
connection.internalTeleport(net.minecraft.world.entity.PositionMoveRotation.of(this.getHandle()), java.util.Collections.emptySet()); connection.internalTeleport(net.minecraft.world.entity.PositionMoveRotation.of(this.getHandle()), java.util.Collections.emptySet());
net.minecraft.server.players.PlayerList playerList = handle.server.getPlayerList(); net.minecraft.server.players.PlayerList playerList = handle.getServer().getPlayerList();
playerList.sendPlayerPermissionLevel(handle, false); playerList.sendPlayerPermissionLevel(handle, false);
playerList.sendLevelInfo(handle, level); playerList.sendLevelInfo(handle, level);
playerList.sendAllPlayerInfo(handle); playerList.sendAllPlayerInfo(handle);
@@ -3010,7 +3010,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
public void updateCommands() { public void updateCommands() {
if (this.getHandle().connection == null) return; if (this.getHandle().connection == null) return;
this.getHandle().server.getCommands().sendCommands(this.getHandle()); this.getHandle().getServer().getCommands().sendCommands(this.getHandle());
} }
@Override @Override

View File

@@ -74,7 +74,8 @@ public final class CraftEquippableComponent implements EquippableComponent {
(dispensable != null) ? dispensable : true, (dispensable != null) ? dispensable : true,
(swappable != null) ? swappable : true, (swappable != null) ? swappable : true,
(damageOnHurt != null) ? damageOnHurt : true, (damageOnHurt != null) ? damageOnHurt : true,
(equipOnInteract != null) ? equipOnInteract : false (equipOnInteract != null) ? equipOnInteract : false,
false, null // TODO - 1.21.5
); );
} }

View File

@@ -2,29 +2,39 @@ package org.bukkit.craftbukkit.spawner;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import java.util.Optional; import java.util.Optional;
import com.mojang.logging.LogUtils;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.util.ProblemReporter;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.BaseSpawner;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.SpawnData; import net.minecraft.world.level.SpawnData;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.storage.TagValueOutput;
import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.spawner.Spawner; import org.bukkit.spawner.Spawner;
import org.slf4j.Logger;
/** /**
* A common parent interface for both the {@link org.bukkit.craftbukkit.block.CraftCreatureSpawner} and minecart mob spawner. * A common parent interface for both the {@link org.bukkit.craftbukkit.block.CraftCreatureSpawner} and minecart mob spawner.
*/ */
public interface PaperSharedSpawnerLogic extends Spawner { public interface PaperSharedSpawnerLogic extends Spawner {
static final Logger LOGGER = LogUtils.getLogger();
BaseSpawner getSpawner(); BaseSpawner getSpawner();
Level getInternalWorld(); Level getInternalWorld();
BlockPos getInternalPosition(); BlockPos getInternalPosition();
default boolean isActivated() { default boolean isActivated() {
return this.getSpawner().isNearPlayer(this.getInternalWorld(), this.getInternalPosition()); return this.getSpawner().isNearPlayer(this.getInternalWorld(), this.getInternalPosition());
} }
@@ -41,16 +51,20 @@ public interface PaperSharedSpawnerLogic extends Spawner {
Preconditions.checkArgument(itemStack != null && !itemStack.getType().isAir(), "spawners cannot spawn air"); Preconditions.checkArgument(itemStack != null && !itemStack.getType().isAir(), "spawners cannot spawn air");
final net.minecraft.world.item.ItemStack item = CraftItemStack.asNMSCopy(itemStack); final net.minecraft.world.item.ItemStack item = CraftItemStack.asNMSCopy(itemStack);
final CompoundTag entity = new CompoundTag();
entity.putString(Entity.ID_TAG, BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.ITEM).toString());
entity.put("Item", item.save(this.getInternalWorld().registryAccess()));
this.setNextSpawnData( try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(() -> getSpawner().toString(), LOGGER)) {
new net.minecraft.world.level.SpawnData( TagValueOutput tagValueOutput = TagValueOutput.createWithContext(scopedCollector, this.getInternalWorld().registryAccess());
entity, tagValueOutput.putString(Entity.TAG_ID, BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.ITEM).toString());
java.util.Optional.empty(), tagValueOutput.store("Item", net.minecraft.world.item.ItemStack.CODEC, item);
Optional.ofNullable(this.getSpawner().nextSpawnData).flatMap(SpawnData::equipment)
) this.setNextSpawnData(
); new net.minecraft.world.level.SpawnData(
tagValueOutput.buildResult(),
java.util.Optional.empty(),
Optional.ofNullable(this.getSpawner().nextSpawnData).flatMap(SpawnData::equipment)
)
);
}
} }
} }