components

This commit is contained in:
Lulu13022002
2024-12-14 18:41:01 +01:00
parent 016503a85f
commit d7eab570bd
13 changed files with 113 additions and 146 deletions

View File

@@ -0,0 +1,39 @@
--- a/net/minecraft/world/item/component/Consumable.java
+++ b/net/minecraft/world/item/component/Consumable.java
@@ -84,13 +_,35 @@
stack.getAllOfType(ConsumableListener.class).forEach(consumableListener -> consumableListener.onConsume(level, entity, stack, this));
if (!level.isClientSide) {
- this.onConsumeEffects.forEach(consumeEffect -> consumeEffect.apply(level, stack, entity));
+ // CraftBukkit start
+ org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause;
+ if (stack.is(net.minecraft.world.item.Items.MILK_BUCKET)) {
+ cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.MILK;
+ } else if (stack.is(net.minecraft.world.item.Items.POTION)) {
+ cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.POTION_DRINK;
+ } else {
+ cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.FOOD;
+ }
+
+ this.onConsumeEffects.forEach(consumeEffect -> consumeEffect.apply(level, stack, entity, cause));
+ // CraftBukkit end
}
entity.gameEvent(this.animation == ItemUseAnimation.DRINK ? GameEvent.DRINK : GameEvent.EAT);
stack.consume(1, entity);
return stack;
}
+
+ // CraftBukkit start
+ public void cancelUsingItem(ServerPlayer player, ItemStack stack) {
+ final java.util.List<net.minecraft.network.protocol.Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> packets = new it.unimi.dsi.fastutil.objects.ObjectArrayList<>(); // Paper - properly resend entities - collect packets for bundle
+ stack.getAllOfType(ConsumableListener.class).forEach(listener -> {
+ 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.connection.send(new net.minecraft.network.protocol.game.ClientboundBundlePacket(packets));
+ }
+ // CraftBukkit end
public boolean canConsume(LivingEntity entity, ItemStack stack) {
FoodProperties foodProperties = stack.get(DataComponents.FOOD);

View File

@@ -0,0 +1,9 @@
--- a/net/minecraft/world/item/component/ConsumableListener.java
+++ b/net/minecraft/world/item/component/ConsumableListener.java
@@ -6,4 +_,6 @@
public interface ConsumableListener {
void onConsume(Level level, LivingEntity entity, ItemStack stack, Consumable consumable);
+
+ default void cancelUsingItem(net.minecraft.server.level.ServerPlayer player, ItemStack stack, java.util.List<net.minecraft.network.protocol.Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> collectedPackets) {} // CraftBukkit // Paper - properly resend entities - collect packets for bundle
}

View File

@@ -0,0 +1,21 @@
--- a/net/minecraft/world/item/component/CustomData.java
+++ b/net/minecraft/world/item/component/CustomData.java
@@ -34,7 +_,17 @@
private static final Logger LOGGER = LogUtils.getLogger();
public static final CustomData EMPTY = new CustomData(new CompoundTag());
private static final String TYPE_TAG = "id";
- public static final Codec<CustomData> CODEC = Codec.withAlternative(CompoundTag.CODEC, TagParser.AS_CODEC)
+ // Paper start - Item serialization as json
+ public static ThreadLocal<Boolean> SERIALIZE_CUSTOM_AS_SNBT = ThreadLocal.withInitial(() -> false);
+ public static final Codec<CustomData> CODEC = Codec.either(CompoundTag.CODEC, TagParser.AS_CODEC)
+ .xmap(com.mojang.datafixers.util.Either::unwrap, data -> { // Both will be used for deserialization, but we decide which one to use for serialization
+ if (!SERIALIZE_CUSTOM_AS_SNBT.get()) {
+ return com.mojang.datafixers.util.Either.left(data); // First codec
+ } else {
+ return com.mojang.datafixers.util.Either.right(data); // Second codec
+ }
+ })
+ // Paper end - Item serialization as json
.xmap(CustomData::new, customData -> customData.tag);
public static final Codec<CustomData> CODEC_WITH_ID = CODEC.validate(
data -> data.getUnsafe().contains("id", 8) ? DataResult.success(data) : DataResult.error(() -> "Missing id for entity in: " + data)

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/world/item/component/DeathProtection.java
+++ b/net/minecraft/world/item/component/DeathProtection.java
@@ -37,7 +_,7 @@
public void applyEffects(ItemStack stack, LivingEntity entity) {
for (ConsumeEffect consumeEffect : this.deathEffects) {
- consumeEffect.apply(entity.level(), stack, entity);
+ consumeEffect.apply(entity.level(), stack, entity, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM); // CraftBukkit
}
}
}

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/world/item/component/LodestoneTracker.java
+++ b/net/minecraft/world/item/component/LodestoneTracker.java
@@ -29,7 +_,7 @@
return this;
} else {
BlockPos blockPos = this.target.get().pos();
- return level.isInWorldBounds(blockPos) && level.getPoiManager().existsAtPosition(PoiTypes.LODESTONE, blockPos)
+ return level.isInWorldBounds(blockPos) && (!level.hasChunkAt(blockPos) || level.getPoiManager().existsAtPosition(PoiTypes.LODESTONE, blockPos)) // Paper - Prevent compass from loading chunks
? this
: new LodestoneTracker(Optional.empty(), true);
}

View File

@@ -0,0 +1,20 @@
--- a/net/minecraft/world/item/component/OminousBottleAmplifier.java
+++ b/net/minecraft/world/item/component/OminousBottleAmplifier.java
@@ -28,8 +_,15 @@
@Override
public void onConsume(Level level, LivingEntity entity, ItemStack stack, Consumable consumable) {
- entity.addEffect(new MobEffectInstance(MobEffects.BAD_OMEN, 120000, this.value, false, false, true));
- }
+ entity.addEffect(new MobEffectInstance(MobEffects.BAD_OMEN, 120000, this.value, false, false, true)); // Paper - properly resend entities - diff on change for below
+ }
+
+ // Paper start - properly resend entities - collect packets for bundle
+ @Override
+ public void cancelUsingItem(net.minecraft.server.level.ServerPlayer player, ItemStack stack, List<net.minecraft.network.protocol.Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> collectedPackets) {
+ collectedPackets.add(new net.minecraft.network.protocol.game.ClientboundRemoveMobEffectPacket(player.getId(), MobEffects.BAD_OMEN));
+ }
+ // Paper end - properly resend entities - collect packets for bundle
@Override
public void addToTooltip(Item.TooltipContext context, Consumer<Component> tooltipAdder, TooltipFlag tooltipFlag) {

View File

@@ -0,0 +1,23 @@
--- a/net/minecraft/world/item/component/ResolvableProfile.java
+++ b/net/minecraft/world/item/component/ResolvableProfile.java
@@ -20,9 +_,10 @@
instance -> instance.group(
ExtraCodecs.PLAYER_NAME.optionalFieldOf("name").forGetter(ResolvableProfile::name),
UUIDUtil.CODEC.optionalFieldOf("id").forGetter(ResolvableProfile::id),
+ UUIDUtil.STRING_CODEC.lenientOptionalFieldOf("Id").forGetter($ -> Optional.empty()), // Paper
ExtraCodecs.PROPERTY_MAP.optionalFieldOf("properties", new PropertyMap()).forGetter(ResolvableProfile::properties)
)
- .apply(instance, ResolvableProfile::new)
+ .apply(instance, (name, uuid, uuid2, propertyMap) -> new ResolvableProfile(name, uuid2.or(() -> uuid), propertyMap)) // Paper
);
public static final Codec<ResolvableProfile> CODEC = Codec.withAlternative(
FULL_CODEC, ExtraCodecs.PLAYER_NAME, name -> new ResolvableProfile(Optional.of(name), Optional.empty(), new PropertyMap())
@@ -49,7 +_,7 @@
if (this.isResolved()) {
return CompletableFuture.completedFuture(this);
} else {
- return this.id.isPresent() ? SkullBlockEntity.fetchGameProfile(this.id.get()).thenApply(optional -> {
+ return this.id.isPresent() ? SkullBlockEntity.fetchGameProfile(this.id.get(), this.name.orElse(null)).thenApply(optional -> { // Paper - player profile events
GameProfile gameProfile = optional.orElseGet(() -> new GameProfile(this.id.get(), this.name.orElse("")));
return new ResolvableProfile(gameProfile);
}) : SkullBlockEntity.fetchGameProfile(this.name.orElseThrow()).thenApply(optional -> {

View File

@@ -0,0 +1,18 @@
--- a/net/minecraft/world/item/component/SuspiciousStewEffects.java
+++ b/net/minecraft/world/item/component/SuspiciousStewEffects.java
@@ -41,6 +_,15 @@
}
}
+ // CraftBukkit start
+ @Override
+ public void cancelUsingItem(net.minecraft.server.level.ServerPlayer player, ItemStack stack, List<net.minecraft.network.protocol.Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> collectedPackets) { // Paper - properly resend entities - collect packets for bundle
+ for (SuspiciousStewEffects.Entry entry : this.effects) {
+ collectedPackets.add(new net.minecraft.network.protocol.game.ClientboundRemoveMobEffectPacket(player.getId(), entry.effect())); // Paper - bundlize packets
+ }
+ }
+ // CraftBukkit end
+
@Override
public void addToTooltip(Item.TooltipContext context, Consumer<Component> tooltipAdder, TooltipFlag tooltipFlag) {
if (tooltipFlag.isCreative()) {