package ar.com.companeros.flags; import ar.com.companeros.Companeros; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.BannerItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BannerBlockEntity; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.common.loot.LootModifier; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; /** Conserva autoría en el loot ya producido por Minecraft; nunca crea ni multiplica items. */ public final class BannerLootModifier extends LootModifier { public static final Codec CODEC = RecordCodecBuilder.create(instance -> codecStart(instance).apply(instance, BannerLootModifier::new)); private static final DeferredRegister> SERIALIZERS = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, Companeros.ID); public static final RegistryObject> BANNER_METADATA = SERIALIZERS.register("banner_metadata", () -> CODEC); public BannerLootModifier(LootItemCondition[] conditions) { super(conditions); } public static void register(IEventBus bus) { SERIALIZERS.register(bus); } @Override public Codec codec() { return CODEC; } // El bloque debe coincidir con su diseño y cada drop con el bloque: sólo se copia RapsFlag. @Override protected ObjectArrayList doApply(ObjectArrayList loot, LootContext context) { if (!(context.getParamOrNull(LootContextParams.BLOCK_ENTITY) instanceof BannerBlockEntity entity) || !entity.getPersistentData().contains(BannerActions.METADATA_TAG, 10)) return loot; var metadata = BannerActions.validatedMetadata(entity.getPersistentData().getCompound(BannerActions.METADATA_TAG)); if (metadata.isEmpty()) return loot; BannerDesign design = BannerDesign.fromTag(metadata.get().getCompound("Design")); if (entity.getBaseColor() != design.baseColor() || !design.patterns().equals(BannerBlockEntity.getItemPatterns(entity.getItem()))) return loot; for (ItemStack stack : loot) { if (stack.getItem() instanceof BannerItem banner && banner.getColor() == design.baseColor() && design.patterns().equals(BannerBlockEntity.getItemPatterns(stack))) stack.getOrCreateTag().put(BannerActions.METADATA_TAG, metadata.get().copy()); } return loot; } }