45 lines
2.2 KiB
Java
45 lines
2.2 KiB
Java
package net.minecraft.world.item.enchantment;
|
|
|
|
import com.mojang.serialization.Codec;
|
|
import com.mojang.serialization.DataResult;
|
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
|
import java.util.Optional;
|
|
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> codec, ContextKeySet contextKeySet) {
|
|
return RecordCodecBuilder.create(
|
|
instance -> instance.group(
|
|
EnchantmentTarget.CODEC.fieldOf("enchanted").forGetter(TargetedConditionalEffect::enchanted),
|
|
EnchantmentTarget.CODEC.fieldOf("affected").forGetter(TargetedConditionalEffect::affected),
|
|
codec.fieldOf("effect").forGetter(TargetedConditionalEffect::effect),
|
|
ConditionalEffect.conditionCodec(contextKeySet).optionalFieldOf("requirements").forGetter(TargetedConditionalEffect::requirements)
|
|
)
|
|
.apply(instance, TargetedConditionalEffect::new)
|
|
);
|
|
}
|
|
|
|
public static <S> Codec<TargetedConditionalEffect<S>> equipmentDropsCodec(Codec<S> codec, ContextKeySet contextKeySet) {
|
|
return RecordCodecBuilder.create(
|
|
instance -> instance.group(
|
|
EnchantmentTarget.CODEC
|
|
.validate(
|
|
enchantmentTarget -> enchantmentTarget != EnchantmentTarget.DAMAGING_ENTITY
|
|
? DataResult.success(enchantmentTarget)
|
|
: DataResult.error(() -> "enchanted must be attacker or victim")
|
|
)
|
|
.fieldOf("enchanted")
|
|
.forGetter(TargetedConditionalEffect::enchanted),
|
|
codec.fieldOf("effect").forGetter(TargetedConditionalEffect::effect),
|
|
ConditionalEffect.conditionCodec(contextKeySet).optionalFieldOf("requirements").forGetter(TargetedConditionalEffect::requirements)
|
|
)
|
|
.apply(instance, (enchantmentTarget, object, optional) -> new TargetedConditionalEffect<>(enchantmentTarget, EnchantmentTarget.VICTIM, object, optional))
|
|
);
|
|
}
|
|
|
|
public boolean matches(LootContext context) {
|
|
return this.requirements.isEmpty() ? true : ((LootItemCondition)this.requirements.get()).test(context);
|
|
}
|
|
}
|