Skip to content

Commit cbed28a

Browse files
committed
Rewrite Fabric platform bridges in Java
1 parent 834e982 commit cbed28a

23 files changed

+341
-232
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.block.entity.BrewerBlockEntity;
4+
import juuxel.adorn.block.entity.BrewerBlockEntityFabric;
5+
import juuxel.adorn.block.entity.KitchenSinkBlockEntity;
6+
import juuxel.adorn.block.entity.KitchenSinkBlockEntityFabric;
7+
import juuxel.adorn.platform.BlockEntityBridge;
8+
import net.minecraft.block.BlockState;
9+
import net.minecraft.util.math.BlockPos;
10+
11+
public final class BlockEntityBridgeFabric implements BlockEntityBridge {
12+
public static final BlockEntityBridgeFabric INSTANCE = new BlockEntityBridgeFabric();
13+
14+
@Override
15+
public BrewerBlockEntity createBrewer(BlockPos pos, BlockState state) {
16+
return new BrewerBlockEntityFabric(pos, state);
17+
}
18+
19+
@Override
20+
public KitchenSinkBlockEntity createKitchenSink(BlockPos pos, BlockState state) {
21+
return new KitchenSinkBlockEntityFabric(pos, state);
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.config.ConfigManager;
4+
import net.fabricmc.loader.api.FabricLoader;
5+
6+
import java.nio.file.Path;
7+
8+
public final class ConfigManagerImpl extends ConfigManager {
9+
private final Path configDirectory = FabricLoader.getInstance().getConfigDir();
10+
11+
@Override
12+
protected Path getConfigDirectory() {
13+
return configDirectory;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.entity.SeatEntity;
4+
import juuxel.adorn.platform.EntityBridge;
5+
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder;
6+
import net.minecraft.entity.EntityDimensions;
7+
import net.minecraft.entity.EntityType;
8+
import net.minecraft.entity.SpawnGroup;
9+
10+
public final class EntityBridgeImpl implements EntityBridge {
11+
public static final EntityBridgeImpl INSTANCE = new EntityBridgeImpl();
12+
13+
@Override
14+
public EntityType<SeatEntity> createSeatType() {
15+
return FabricEntityTypeBuilder.create(SpawnGroup.MISC, SeatEntity::new)
16+
.dimensions(EntityDimensions.fixed(0f, 0f))
17+
.build();
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.lib.registry.Registrar;
4+
import juuxel.adorn.lib.registry.RegistrarFactory;
5+
import net.minecraft.registry.Registries;
6+
import net.minecraft.registry.Registry;
7+
import net.minecraft.registry.RegistryKey;
8+
9+
public final class FabricRegistrarFactory implements RegistrarFactory {
10+
@SuppressWarnings("unchecked")
11+
@Override
12+
public <T> Registrar<T> create(RegistryKey<Registry<T>> registryKey) {
13+
var registry = ((Registry<Registry<T>>) Registries.REGISTRIES).get(registryKey);
14+
if (registry == null) throw new IllegalArgumentException("No registry found for key " + registryKey);
15+
return new RegistrarImpl<>(registry);
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.fluid.FluidAmountPredicate;
4+
import juuxel.adorn.fluid.FluidUnit;
5+
import juuxel.adorn.fluid.FluidVolume;
6+
import juuxel.adorn.platform.FluidBridge;
7+
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage;
8+
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
9+
import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction;
10+
import net.minecraft.block.BlockState;
11+
import net.minecraft.fluid.Fluid;
12+
import net.minecraft.util.math.BlockPos;
13+
import net.minecraft.util.math.Direction;
14+
import net.minecraft.world.World;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
public final class FluidBridgeFabric implements FluidBridge {
18+
@Override
19+
public FluidUnit getFluidUnit() {
20+
return FluidUnit.DROPLET;
21+
}
22+
23+
@Override
24+
public @Nullable FluidVolume drain(World world, BlockPos pos, @Nullable BlockState state, Direction side, Fluid fluid, FluidAmountPredicate amountPredicate) {
25+
var storage = FluidStorage.SIDED.find(world, pos, state, null, side);
26+
27+
if (storage != null) {
28+
var upperBound = amountPredicate.getUpperBound();
29+
var maxAmount = FluidUnit.convert(upperBound.getAmount(), upperBound.getUnit(), FluidUnit.DROPLET);
30+
try (var transaction = Transaction.openOuter()) {
31+
var extracted = storage.extract(FluidVariant.of(fluid), maxAmount, transaction);
32+
33+
if (extracted > 0 && amountPredicate.test(extracted, FluidUnit.DROPLET)) {
34+
transaction.commit();
35+
return new FluidVolume(fluid, extracted, null, FluidUnit.DROPLET);
36+
}
37+
}
38+
}
39+
40+
return null;
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.item.group.ItemGroupModifyContext;
4+
import juuxel.adorn.platform.ItemGroupBridge;
5+
import kotlin.Unit;
6+
import kotlin.jvm.functions.Function1;
7+
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
8+
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
9+
import net.minecraft.item.ItemConvertible;
10+
import net.minecraft.item.ItemGroup;
11+
import net.minecraft.registry.RegistryKey;
12+
13+
import java.util.List;
14+
15+
public final class ItemGroupBridgeFabric implements ItemGroupBridge {
16+
@Override
17+
public ItemGroup.Builder builder() {
18+
return FabricItemGroup.builder();
19+
}
20+
21+
@Override
22+
public void addItems(RegistryKey<ItemGroup> group, Function1<? super ItemGroupModifyContext, Unit> configurator) {
23+
ItemGroupEvents.modifyEntriesEvent(group).register(entries -> {
24+
var context = new ItemGroupModifyContext() {
25+
@Override
26+
public void add(ItemConvertible item) {
27+
entries.add(item);
28+
}
29+
30+
@Override
31+
public void addAfter(ItemConvertible after, List<? extends ItemConvertible> items) {
32+
entries.addAfter(after, items.toArray(ItemConvertible[]::new));
33+
}
34+
};
35+
36+
configurator.invoke(context);
37+
});
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.platform.MenuBridge;
4+
import juuxel.adorn.util.Logging;
5+
import kotlin.jvm.functions.Function3;
6+
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
7+
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType;
8+
import net.minecraft.entity.player.PlayerEntity;
9+
import net.minecraft.entity.player.PlayerInventory;
10+
import net.minecraft.menu.Menu;
11+
import net.minecraft.menu.MenuType;
12+
import net.minecraft.menu.NamedMenuFactory;
13+
import net.minecraft.network.PacketByteBuf;
14+
import net.minecraft.server.network.ServerPlayerEntity;
15+
import net.minecraft.text.Text;
16+
import net.minecraft.util.math.BlockPos;
17+
import org.jetbrains.annotations.Nullable;
18+
import org.slf4j.Logger;
19+
20+
public final class MenuBridgeImpl implements MenuBridge {
21+
public static final MenuBridgeImpl INSTANCE = new MenuBridgeImpl();
22+
private static final Logger LOGGER = Logging.logger();
23+
24+
@Override
25+
public void open(PlayerEntity player, @Nullable NamedMenuFactory factory, BlockPos pos) {
26+
if (factory == null) {
27+
LOGGER.warn("[Adorn] Menu factory is null, please report this!", new Throwable("Stacktrace").fillInStackTrace());
28+
return;
29+
}
30+
31+
if (!player.getWorld().isClient) {
32+
// ^ technically not needed as vanilla safeguards against it,
33+
// but no need to create the extra factory on the client
34+
35+
player.openMenu(new ExtendedScreenHandlerFactory() {
36+
@Override
37+
public @Nullable Menu createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) {
38+
return factory.createMenu(syncId, playerInventory, player);
39+
}
40+
41+
@Override
42+
public Text getDisplayName() {
43+
return factory.getDisplayName();
44+
}
45+
46+
@Override
47+
public void writeScreenOpeningData(ServerPlayerEntity player, PacketByteBuf buf) {
48+
buf.writeBlockPos(pos);
49+
}
50+
});
51+
}
52+
}
53+
54+
@Override
55+
public <M extends Menu> MenuType<M> createType(Function3<? super Integer, ? super PlayerInventory, ? super PacketByteBuf, ? extends M> factory) {
56+
return new ExtendedScreenHandlerType<>(factory::invoke);
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.fluid.FluidReference;
4+
import juuxel.adorn.lib.AdornNetworking;
5+
import juuxel.adorn.platform.NetworkBridge;
6+
import net.fabricmc.fabric.api.networking.v1.PlayerLookup;
7+
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
8+
import net.minecraft.entity.Entity;
9+
import net.minecraft.entity.player.PlayerEntity;
10+
import net.minecraft.network.packet.Packet;
11+
import net.minecraft.util.Identifier;
12+
13+
public final class NetworkBridgeImpl implements NetworkBridge {
14+
public static final NetworkBridgeImpl INSTANCE = new NetworkBridgeImpl();
15+
16+
@Override
17+
public void sendToTracking(Entity entity, Packet<?> packet) {
18+
for (var player : PlayerLookup.tracking(entity)) {
19+
ServerPlayNetworking.getSender(player).sendPacket(packet);
20+
}
21+
}
22+
23+
@Override
24+
public void sendOpenBookPacket(PlayerEntity player, Identifier bookId) {
25+
AdornNetworking.sendOpenBookPacket(player, bookId);
26+
}
27+
28+
@Override
29+
public void sendBrewerFluidSync(PlayerEntity player, int syncId, FluidReference fluid) {
30+
AdornNetworking.sendBrewerFluidSync(player, syncId, fluid);
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.platform.BlockEntityBridge;
4+
import juuxel.adorn.platform.BlockFactory;
5+
import juuxel.adorn.platform.EntityBridge;
6+
import juuxel.adorn.platform.MenuBridge;
7+
import juuxel.adorn.platform.NetworkBridge;
8+
import juuxel.adorn.platform.PlatformBridges;
9+
import juuxel.adorn.platform.ResourceBridge;
10+
11+
public final class PlatformBridgesImpl implements PlatformBridges {
12+
@Override
13+
public BlockEntityBridge getBlockEntities() {
14+
return BlockEntityBridgeFabric.INSTANCE;
15+
}
16+
17+
@Override
18+
public BlockFactory getBlockFactory() {
19+
return BlockFactory.Default;
20+
}
21+
22+
@Override
23+
public EntityBridge getEntities() {
24+
return EntityBridgeImpl.INSTANCE;
25+
}
26+
27+
@Override
28+
public MenuBridge getMenus() {
29+
return MenuBridgeImpl.INSTANCE;
30+
}
31+
32+
@Override
33+
public NetworkBridge getNetwork() {
34+
return NetworkBridgeImpl.INSTANCE;
35+
}
36+
37+
@Override
38+
public ResourceBridge getResources() {
39+
return ResourceBridgeImpl.INSTANCE;
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.AdornCommon;
4+
import juuxel.adorn.lib.registry.Registered;
5+
import juuxel.adorn.lib.registry.Registrar;
6+
import kotlin.jvm.functions.Function0;
7+
import net.minecraft.registry.Registry;
8+
9+
import java.util.ArrayList;
10+
import java.util.Iterator;
11+
import java.util.List;
12+
13+
public final class RegistrarImpl<T> implements Registrar<T> {
14+
private final Registry<T> registry;
15+
private final List<T> objects = new ArrayList<>();
16+
17+
public RegistrarImpl(Registry<T> registry) {
18+
this.registry = registry;
19+
}
20+
21+
@Override
22+
public <U extends T> Registered<U> register(String id, Function0<? extends U> provider) {
23+
var registered = Registry.register(registry, AdornCommon.id(id), provider.invoke());
24+
objects.add(registered);
25+
return () -> registered;
26+
}
27+
28+
@Override
29+
public Iterator<T> iterator() {
30+
return objects.iterator();
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package juuxel.adorn.platform.fabric;
2+
3+
import juuxel.adorn.client.book.BookManager;
4+
import juuxel.adorn.client.resources.BookManagerFabric;
5+
import juuxel.adorn.client.resources.ColorManager;
6+
import juuxel.adorn.client.resources.ColorManagerFabric;
7+
import juuxel.adorn.platform.ResourceBridge;
8+
9+
public final class ResourceBridgeImpl implements ResourceBridge {
10+
public static final ResourceBridgeImpl INSTANCE = new ResourceBridgeImpl();
11+
12+
@Override
13+
public BookManager getBookManager() {
14+
return BookManagerFabric.INSTANCE;
15+
}
16+
17+
@Override
18+
public ColorManager getColorManager() {
19+
return ColorManagerFabric.INSTANCE;
20+
}
21+
}

fabric/src/main/kotlin/juuxel/adorn/lib/AdornNetworking.kt

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ object AdornNetworking {
5555
}
5656
}
5757

58+
@JvmStatic
5859
fun sendOpenBookPacket(player: PlayerEntity, bookId: Identifier) {
5960
if (player is ServerPlayerEntity) {
6061
val buf = PacketByteBufs.create()
@@ -63,6 +64,7 @@ object AdornNetworking {
6364
}
6465
}
6566

67+
@JvmStatic
6668
fun sendBrewerFluidSync(player: PlayerEntity, syncId: Int, fluid: FluidReference) {
6769
if (player is ServerPlayerEntity) {
6870
val buf = PacketByteBufs.create()

fabric/src/main/kotlin/juuxel/adorn/platform/fabric/BlockEntityBridgeFabric.kt

-17
This file was deleted.

fabric/src/main/kotlin/juuxel/adorn/platform/fabric/ConfigManagerImpl.kt

-9
This file was deleted.

0 commit comments

Comments
 (0)