Volver al índice
src/main/java/ar/com/companeros/flags/BannerLootModifier.java
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<BannerLootModifier> CODEC = RecordCodecBuilder.create(instance ->
codecStart(instance).apply(instance, BannerLootModifier::new));
private static final DeferredRegister<Codec<? extends IGlobalLootModifier>> SERIALIZERS =
DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, Companeros.ID);
public static final RegistryObject<Codec<BannerLootModifier>> 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<? extends IGlobalLootModifier> 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<ItemStack> doApply(ObjectArrayList<ItemStack> 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;
}
}