This commit is contained in:
lcy0x1
2024-06-30 17:21:50 +08:00
parent 67aac096e5
commit 42e788a018
6 changed files with 107 additions and 2 deletions

View File

@@ -18,7 +18,7 @@ loader_version_range=[2,)
mod_id=l2core
mod_name=L2Core
mod_license=LGPL-2.1
mod_version=3.0.3-pre1
mod_version=3.0.3-pre7
mod_group_id=dev.xkmc
mod_authors=lcy0x1
mod_description=Core Library mod for all L2 mods

View File

@@ -5,6 +5,7 @@ import dev.xkmc.l2core.capability.attachment.GeneralCapabilityHolder;
import dev.xkmc.l2core.capability.attachment.GeneralCapabilityTemplate;
import dev.xkmc.l2core.capability.player.PlayerCapabilityHolder;
import dev.xkmc.l2core.capability.player.PlayerCapabilityTemplate;
import net.minecraft.world.entity.player.Player;
import net.neoforged.neoforge.attachment.AttachmentHolder;
import net.neoforged.neoforge.attachment.AttachmentType;

View File

@@ -0,0 +1,66 @@
package dev.xkmc.l2core.init.reg.simple;
import com.mojang.serialization.Codec;
import dev.xkmc.l2serial.serialization.codec.CodecAdaptor;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentSerialization;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import java.util.UUID;
public record DCReg(DeferredRegister<DataComponentType<?>> reg) {
public static DCReg of(Reg parent) {
return new DCReg(parent.make(BuiltInRegistries.DATA_COMPONENT_TYPE));
}
public <T> DCVal<T> reg(String id, Codec<T> codec, StreamCodec<? super RegistryFriendlyByteBuf, T> stream) {
return new DCValImpl<>(reg.register(id, () -> DataComponentType.<T>builder().persistent(codec).networkSynchronized(stream).build()));
}
public <T> DCVal<T> reg(String id, Class<T> cls) {
var cdc = new CodecAdaptor<>(cls);
return new DCValImpl<>(reg.register(id, () -> DataComponentType.<T>builder().persistent(cdc).networkSynchronized(cdc.toNetwork()).build()));
}
public DCVal<Integer> intVal(String id) {
return reg(id, Codec.INT, ByteBufCodecs.INT);
}
public DCVal<Double> doubleVal(String id) {
return reg(id, Codec.DOUBLE, ByteBufCodecs.DOUBLE);
}
public DCVal<Long> longVal(String id) {
return reg(id, Codec.LONG, ByteBufCodecs.VAR_LONG);
}
public DCVal<String> str(String id) {
return reg(id, Codec.STRING, ByteBufCodecs.STRING_UTF8);
}
public DCVal<UUID> uuid(String id) {
return reg(id, Codec.STRING.xmap(UUID::fromString, UUID::toString),
StreamCodec.of((b, e) -> FriendlyByteBuf.writeUUID(b, e), b -> FriendlyByteBuf.readUUID(b)));
}
public DCVal<Component> component(String id) {
return reg(id, ComponentSerialization.CODEC, ComponentSerialization.STREAM_CODEC);
}
private record DCValImpl<T>(DeferredHolder<DataComponentType<?>, DataComponentType<T>> val) implements DCVal<T> {
@Override
public DataComponentType<T> get() {
return val.get();
}
}
}

View File

@@ -0,0 +1,24 @@
package dev.xkmc.l2core.init.reg.simple;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.Nullable;
public interface DCVal<T> extends Val<DataComponentType<T>> {
@Nullable
default T get(ItemStack stack) {
return stack.get(this);
}
default T getOrDefault(ItemStack stack, T def) {
T ans = stack.get(this);
return ans == null ? def : ans;
}
default ItemStack set(ItemStack stack, T val) {
stack.set(this, val);
return stack;
}
}

View File

@@ -1,6 +1,8 @@
package dev.xkmc.l2core.init.reg.simple;
public interface Val<T> {
import java.util.function.Supplier;
public interface Val<T> extends Supplier<T> {
T get();

View File

@@ -1,6 +1,8 @@
package dev.xkmc.l2core.serial.advancements;
import dev.xkmc.l2serial.serialization.marker.SerialClass;
import dev.xkmc.l2serial.util.Wrappers;
import net.minecraft.advancements.Criterion;
import net.minecraft.advancements.critereon.ContextAwarePredicate;
import net.minecraft.advancements.critereon.SimpleCriterionTrigger;
@@ -10,9 +12,19 @@ import java.util.Optional;
public class BaseCriterionInstance<T extends BaseCriterionInstance<T, R>, R extends BaseCriterion<T, R>>
implements SimpleCriterionTrigger.SimpleInstance {
private final R r;
protected BaseCriterionInstance(R r) {
this.r = r;
}
@Override
public Optional<ContextAwarePredicate> player() {
return Optional.empty();
}
public Criterion<T> build() {
return new Criterion<>(r, Wrappers.cast(this));
}
}