48 lines
2.0 KiB
Java
48 lines
2.0 KiB
Java
|
// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers
|
||
|
//
|
||
|
// SPDX-License-Identifier: MPL-2.0
|
||
|
|
||
|
package dan200.computercraft.shared.computer.items;
|
||
|
|
||
|
import com.mojang.serialization.Codec;
|
||
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||
|
import dan200.computercraft.shared.ModRegistry;
|
||
|
import dan200.computercraft.shared.computer.core.ServerComputer;
|
||
|
import dan200.computercraft.shared.computer.core.ServerComputerRegistry;
|
||
|
import net.minecraft.core.UUIDUtil;
|
||
|
import net.minecraft.core.component.DataComponentHolder;
|
||
|
import net.minecraft.network.RegistryFriendlyByteBuf;
|
||
|
import net.minecraft.network.codec.ByteBufCodecs;
|
||
|
import net.minecraft.network.codec.StreamCodec;
|
||
|
|
||
|
import javax.annotation.Nullable;
|
||
|
import java.util.UUID;
|
||
|
|
||
|
/**
|
||
|
* A reference to a {@link ServerComputer}.
|
||
|
*
|
||
|
* @param session The current {@linkplain ServerComputerRegistry#getSessionID() session id}.
|
||
|
* @param instance The computer's {@linkplain ServerComputer#getInstanceUUID() instance id}.
|
||
|
*/
|
||
|
public record ServerComputerReference(int session, UUID instance) {
|
||
|
public static final Codec<ServerComputerReference> CODEC = RecordCodecBuilder.create(i -> i.group(
|
||
|
Codec.INT.fieldOf("session").forGetter(ServerComputerReference::session),
|
||
|
UUIDUtil.CODEC.fieldOf("instance").forGetter(ServerComputerReference::instance)
|
||
|
).apply(i, ServerComputerReference::new));
|
||
|
|
||
|
public static final StreamCodec<RegistryFriendlyByteBuf, ServerComputerReference> STREAM_CODEC = StreamCodec.composite(
|
||
|
ByteBufCodecs.VAR_INT, ServerComputerReference::session,
|
||
|
UUIDUtil.STREAM_CODEC, ServerComputerReference::instance,
|
||
|
ServerComputerReference::new
|
||
|
);
|
||
|
|
||
|
public @Nullable ServerComputer get(ServerComputerRegistry registry) {
|
||
|
return registry.get(session, this.instance());
|
||
|
}
|
||
|
|
||
|
public static @Nullable ServerComputer get(DataComponentHolder holder, ServerComputerRegistry registry) {
|
||
|
var reference = holder.get(ModRegistry.DataComponents.COMPUTER.get());
|
||
|
return reference == null ? null : reference.get(registry);
|
||
|
}
|
||
|
}
|