package io.gitlab.jfronny.libjf.config.impl.network.rci; import io.gitlab.jfronny.libjf.config.impl.network.*; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.network.PacketByteBuf; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; public class MirrorObject { protected final PacketSender packetSender; public MirrorObject(PacketSender packetSender) { this.packetSender = packetSender; } protected T synchronize(Consumer> action) { Object[] result = {null}; AtomicBoolean pause = new AtomicBoolean(true); action.accept(with -> { result[0] = with; pause.set(false); synchronized (result) { result.notifyAll(); } }); synchronized (result) { while (pause.get()) { try { if (pause.get()) result.wait(); } catch (InterruptedException e) { // ignored } } } return (T) result[0]; } protected PacketByteBuf sendRequest(String name, PacketByteBuf body) { return sendRequest(name, body, Map.of()); } protected PacketByteBuf sendRequest(String name, PacketByteBuf body, Map temporaryHandlers) { return this.synchronize(hold -> { RequestRouter.sendRequest(packetSender, name, body, new PMResponseHandler(hold::resume), temporaryHandlers); }).get(); } protected interface Hold { void resume(T with); } }