Code/net/minecraft/world/item/enchantment/TargetedConditionalEffect.java

53 lines
3.0 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.item.enchantment;
import com.mojang.datafixers.util.Function4;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.Optional;
import java.util.function.Function;
import net.minecraft.util.context.ContextKeySet;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
public record TargetedConditionalEffect<T>(EnchantmentTarget enchanted, EnchantmentTarget affected, T effect, Optional<LootItemCondition> requirements) {
public static <S> Codec<TargetedConditionalEffect<S>> codec(Codec<S> p_345149_, ContextKeySet p_365659_) {
return RecordCodecBuilder.create(
p_359932_ -> p_359932_.group(
EnchantmentTarget.CODEC.fieldOf("enchanted").forGetter(TargetedConditionalEffect::enchanted),
EnchantmentTarget.CODEC.fieldOf("affected").forGetter(TargetedConditionalEffect::affected),
p_345149_.fieldOf("effect").forGetter((Function<TargetedConditionalEffect<S>, S>)(TargetedConditionalEffect::effect)),
ConditionalEffect.conditionCodec(p_365659_).optionalFieldOf("requirements").forGetter(TargetedConditionalEffect::requirements)
)
.apply(
p_359932_,
(Function4<EnchantmentTarget, EnchantmentTarget, S, Optional<LootItemCondition>, TargetedConditionalEffect<S>>)(TargetedConditionalEffect::new)
)
);
}
public static <S> Codec<TargetedConditionalEffect<S>> equipmentDropsCodec(Codec<S> p_343050_, ContextKeySet p_363330_) {
return RecordCodecBuilder.create(
p_359935_ -> p_359935_.group(
EnchantmentTarget.CODEC
.validate(
p_342627_ -> p_342627_ != EnchantmentTarget.DAMAGING_ENTITY
? DataResult.success(p_342627_)
: DataResult.error(() -> "enchanted must be attacker or victim")
)
.fieldOf("enchanted")
.forGetter(TargetedConditionalEffect::enchanted),
p_343050_.fieldOf("effect").forGetter((Function<TargetedConditionalEffect<S>, S>)(TargetedConditionalEffect::effect)),
ConditionalEffect.conditionCodec(p_363330_).optionalFieldOf("requirements").forGetter(TargetedConditionalEffect::requirements)
)
.apply(
p_359935_, (p_345323_, p_343604_, p_343198_) -> new TargetedConditionalEffect<>(p_345323_, EnchantmentTarget.VICTIM, p_343604_, p_343198_)
)
);
}
public boolean matches(LootContext p_343867_) {
return this.requirements.isEmpty() ? true : this.requirements.get().test(p_343867_);
}
}