From b2a9161120833ea846543bf3624134524fe05a6a Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Wed, 29 Jan 2025 20:43:17 +0100 Subject: [PATCH] feat: start working on Geyser compat --- build.gradle | 4 + .../motschen/rocks/RocksMain.java | 7 ++ .../rocks/util/geyser/GeyserBlocks.java | 104 ++++++++++++++++++ .../rocks/util/geyser/GeyserUtil.java | 40 +++++++ .../motschen/rocks/util/polymer/PolyUtil.java | 2 +- src/main/resources/bedrock/rocks.zip | Bin 0 -> 5001 bytes .../bedrock/rocks_base/manifest.json | 17 +++ .../rocks_base/models/block/large_rock.json | 59 ++++++++++ .../bedrock/rocks_base/pack_icon.png | Bin 0 -> 3491 bytes src/main/resources/fabric.mod.json | 1 - 10 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserBlocks.java create mode 100644 src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserUtil.java create mode 100644 src/main/resources/bedrock/rocks.zip create mode 100644 src/main/resources/bedrock/rocks_base/manifest.json create mode 100644 src/main/resources/bedrock/rocks_base/models/block/large_rock.json create mode 100755 src/main/resources/bedrock/rocks_base/pack_icon.png diff --git a/build.gradle b/build.gradle index 52e7778..175956c 100755 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,9 @@ repositories { url = "https://api.modrinth.com/maven" } maven { url 'https://maven.nucleoid.xyz' } + maven { + url = uri("https://repo.opencollab.dev/main/") + } } dependencies { @@ -47,6 +50,7 @@ dependencies { modImplementation ("eu.pb4:polymer-virtual-entity:${polymer_version}") modImplementation ("eu.pb4:polymer-autohost:${polymer_version}") modImplementation ("eu.pb4:factorytools:${factorytools_version}") + compileOnly('org.geysermc.geyser:api:2.4.2-SNAPSHOT') } processResources { diff --git a/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java b/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java index 932ce0e..cd72b41 100755 --- a/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/RocksMain.java @@ -11,6 +11,7 @@ import eu.midnightdust.motschen.rocks.config.RocksConfig; import eu.midnightdust.motschen.rocks.networking.HelloPayload; import eu.midnightdust.motschen.rocks.util.RockType; import eu.midnightdust.motschen.rocks.util.StickType; +import eu.midnightdust.motschen.rocks.util.geyser.GeyserUtil; import eu.midnightdust.motschen.rocks.util.polymer.PolyUtil; import eu.midnightdust.motschen.rocks.world.*; import net.fabricmc.api.ModInitializer; @@ -19,6 +20,7 @@ import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.block.Block; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; @@ -43,6 +45,7 @@ import static eu.midnightdust.motschen.rocks.util.polymer.PolyUtil.*; public class RocksMain implements ModInitializer { public static final String MOD_ID = "rocks"; public static boolean polymerMode = hasRequiredPolymerModules(); + public static boolean hasGeyserMC = PlatformFunctions.isModLoaded("geyser-fabric") || PlatformFunctions.isModLoaded("geyser-neoforge"); public static List playersWithMod = new ArrayList<>(); public static final EnumProperty ROCK_VARIATION = EnumProperty.of("variation", RockVariation.class); @@ -85,6 +88,7 @@ public class RocksMain implements ModInitializer { }); if (polymerMode) PolyUtil.init(); + if (hasGeyserMC) GeyserUtil.init(this); for (RockType type : RockType.values()) { Identifier id = id(type.getName()); @@ -136,4 +140,7 @@ public class RocksMain implements ModInitializer { Registry.register(Registries.ITEM_GROUP, ROCKS_GROUP, RocksGroup); } } + public static boolean isOnBedrock(PlayerEntity player) { + return player != null && hasGeyserMC && GeyserUtil.isOnBedrock(player.getUuid()); + } } diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserBlocks.java b/src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserBlocks.java new file mode 100644 index 0000000..96d2464 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserBlocks.java @@ -0,0 +1,104 @@ +package eu.midnightdust.motschen.rocks.util.geyser; + +import eu.midnightdust.motschen.rocks.RocksMain; +import eu.midnightdust.motschen.rocks.blockstates.RockVariation; +import eu.midnightdust.motschen.rocks.util.RockType; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.registry.Registries; +import net.minecraft.state.property.Properties; +import org.geysermc.event.subscribe.Subscribe; +import org.geysermc.geyser.api.block.custom.CustomBlockData; +import org.geysermc.geyser.api.block.custom.CustomBlockPermutation; +import org.geysermc.geyser.api.block.custom.NonVanillaCustomBlockData; +import org.geysermc.geyser.api.block.custom.component.BoxComponent; +import org.geysermc.geyser.api.block.custom.component.CustomBlockComponents; +import org.geysermc.geyser.api.block.custom.component.GeometryComponent; +import org.geysermc.geyser.api.block.custom.component.MaterialInstance; +import org.geysermc.geyser.api.block.custom.nonvanilla.JavaBlockState; +import org.geysermc.geyser.api.event.lifecycle.GeyserDefineCustomBlocksEvent; +import org.geysermc.geyser.api.extension.Extension; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; + +import static eu.midnightdust.motschen.rocks.RocksMain.*; + +public class GeyserBlocks implements Extension { + static final BoxComponent SHAPE = new BoxComponent(-8, 0, -8, 8, 2, 8); + static final BoxComponent SHAPE_LARGE = new BoxComponent(-8, 0, -8, 8, 3, 8); + + /* + Bedrock follows a very different design than Java. + A rock here will contain a property that defines its stone material type, rather than the variation. + Each variation will be registered as one such rock block. + */ + @Subscribe + public void onDefineCustomBlocks(GeyserDefineCustomBlocksEvent event) { + for (RockVariation variation : RockVariation.values()) { + CustomBlockComponents components = CustomBlockComponents.builder() + .collisionBox(BoxComponent.emptyBox()) + .selectionBox(variation == RockVariation.LARGE ? SHAPE_LARGE : SHAPE) + .geometry(GeometryComponent.builder() + .identifier(String.format("geometry.rocks.%s_rock", variation.asString())) + .build()) + .lightEmission(0) + .lightDampening(0) + .friction(1f) + .build(); + + CustomBlockData rockVariant = NonVanillaCustomBlockData.builder() + .name(variation.asString()+"_rock") + .namespace(MOD_ID) + .stringProperty("TYPE", Arrays.stream(RockType.values()).map(RockType::getName).collect(Collectors.toList())) + .components(components) + .permutations(createRockPermutations()) + .includedInCreativeInventory(true) + .build(); + + event.register(rockVariant); + event.registerItemOverride(id(RockType.STONE.getName()).toString(), rockVariant); + + for (RockType type : RockType.values()) { + String javaIdentifier = String.format("%s:%s[variation=%s]", MOD_ID, type.getName(), variation.asString()); + BlockState state = RocksMain.rocksByType.get(type).getDefaultState().with(ROCK_VARIATION, variation); + + JavaBlockState javaBlockState = JavaBlockState.builder() + .javaId(Block.getRawIdFromState(state)) + .identifier(javaIdentifier) + .stateGroupId(Registries.BLOCK.getRawId(rocksByType.get(type))) + .waterlogged(state.contains(Properties.WATERLOGGED) && state.get(Properties.WATERLOGGED)) + .canBreakWithHand(true) + .build(); + event.registerOverride(javaBlockState, rockVariant.blockStateBuilder() + .stringProperty("TYPE", type.getName()) + .build()); + } + } + } + + private List createRockPermutations() { + List permutations = new ArrayList<>(); + for (RockType type : RockType.values()) { + MaterialInstance material = MaterialInstance.builder() + .texture(String.format("minecraft.%s", type.name().toLowerCase(Locale.ROOT))) + .renderMethod("opaque") + .ambientOcclusion(true) + .build(); + CustomBlockComponents components = CustomBlockComponents.builder() + .materialInstance("up", material) + .materialInstance("down", material) + .materialInstance("north", material) + .materialInstance("south", material) + .materialInstance("east", material) + .materialInstance("west", material) + .build(); + String condition = String.format("query.block_property('%s') == %s", "TYPE", type.getName()); + permutations.add(new CustomBlockPermutation(components, condition)); + } + return permutations; + } +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserUtil.java b/src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserUtil.java new file mode 100644 index 0000000..0fa0118 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/geyser/GeyserUtil.java @@ -0,0 +1,40 @@ +package eu.midnightdust.motschen.rocks.util.geyser; + +import eu.midnightdust.motschen.rocks.RocksMain; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.loader.api.FabricLoader; +import org.geysermc.event.subscribe.Subscribe; +import org.geysermc.geyser.api.GeyserApi; +import org.geysermc.geyser.api.connection.GeyserConnection; +import org.geysermc.geyser.api.event.EventRegistrar; +import org.geysermc.geyser.api.event.lifecycle.GeyserLoadResourcePacksEvent; + +import java.net.URI; +import java.nio.file.Path; +import java.util.UUID; + +import static eu.midnightdust.motschen.rocks.RocksMain.MOD_ID; + +public class GeyserUtil implements EventRegistrar { + static GeyserApi geyser; + + public static void init(RocksMain mainEntryPoint) { + //GeyserConnection connection = GeyserApi.api().connectionByUuid(uuid); + ServerLifecycleEvents.SERVER_STARTING.register((server) -> { + geyser = GeyserApi.api(); + EventRegistrar registrar = new GeyserUtil(); + geyser.eventBus().register(registrar, registrar); + geyser.eventBus().register(registrar, new GeyserBlocks()); // register your mod & this class instance as a listener + }); + } + @Subscribe + public void onGeyserLoadResourcePacksEvent(GeyserLoadResourcePacksEvent event) { + //logger().info("Loading: " + event.resourcePacks().size() + " resource packs."); + event.resourcePacks().add(FabricLoader.getInstance().getModContainer(MOD_ID).get().findPath("bedrock/rocks.zip").get()); + // you could add a resource pack with event.resourcePacks().add(path-to-pack) + } + public static boolean isOnBedrock(UUID uuid) { + if (geyser == null) return false; + return geyser.isBedrockPlayer(uuid); + } +} diff --git a/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java b/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java index 4efced8..7b1ce08 100644 --- a/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java +++ b/src/main/java/eu/midnightdust/motschen/rocks/util/polymer/PolyUtil.java @@ -69,7 +69,7 @@ public class PolyUtil { } public static boolean hasModOnClient(ServerPlayerEntity player) { - return playersWithMod.contains(player); + return playersWithMod.contains(player) || isOnBedrock(player); } public static Item polymerBlockItem(Block block, Identifier id) { diff --git a/src/main/resources/bedrock/rocks.zip b/src/main/resources/bedrock/rocks.zip new file mode 100644 index 0000000000000000000000000000000000000000..5eac68d16dbc35118afc3ea8a02688d7e3b300d9 GIT binary patch literal 5001 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/bedrock/rocks_base/manifest.json b/src/main/resources/bedrock/rocks_base/manifest.json new file mode 100644 index 0000000..a22f8e7 --- /dev/null +++ b/src/main/resources/bedrock/rocks_base/manifest.json @@ -0,0 +1,17 @@ +{ + "format_version": 2, + "header": { + "name": "pack.rocks", + "description": "pack.description", + "uuid": "420e8521-598a-428d-9a44-ed3e2f1b303d", + "version": [1, 0, 0], + "min_engine_version": [1, 16, 0] + }, + "modules": [ + { + "type": "resources", + "uuid": "517e7279-6a76-4956-b34d-f2e126d3187a", + "version": [1, 0, 0] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/bedrock/rocks_base/models/block/large_rock.json b/src/main/resources/bedrock/rocks_base/models/block/large_rock.json new file mode 100644 index 0000000..ba0fcf5 --- /dev/null +++ b/src/main/resources/bedrock/rocks_base/models/block/large_rock.json @@ -0,0 +1,59 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.large_rock", + "texture_width": 16, + "texture_height": 16, + "visible_bounds_width": 2, + "visible_bounds_height": 1.5, + "visible_bounds_offset": [0, 0.25, 0] + }, + "bones": [ + { + "name": "bb_main", + "pivot": [0, 0, 0], + "cubes": [ + { + "origin": [-5, 0, -3], + "size": [12, 3, 7], + "uv": { + "north": {"uv": [0, 0], "uv_size": [12, 3]}, + "east": {"uv": [0, 0], "uv_size": [7, 3]}, + "south": {"uv": [0, 0], "uv_size": [12, 3]}, + "west": {"uv": [0, 0], "uv_size": [7, 3]}, + "up": {"uv": [12, 7], "uv_size": [-12, -7]}, + "down": {"uv": [12, 7], "uv_size": [-12, -7]} + } + }, + { + "origin": [-1, 3, -1], + "size": [7, 1, 4], + "uv": { + "north": {"uv": [0, 0], "uv_size": [7, 1]}, + "east": {"uv": [0, 0], "uv_size": [4, 1]}, + "south": {"uv": [0, 0], "uv_size": [7, 1]}, + "west": {"uv": [0, 0], "uv_size": [4, 1]}, + "up": {"uv": [7, 4], "uv_size": [-7, -4]}, + "down": {"uv": [7, 4], "uv_size": [-7, -4]} + } + }, + { + "origin": [-4, 0, -5], + "size": [8, 1, 10], + "uv": { + "north": {"uv": [0, 0], "uv_size": [8, 1]}, + "east": {"uv": [0, 0], "uv_size": [10, 1]}, + "south": {"uv": [0, 0], "uv_size": [8, 1]}, + "west": {"uv": [0, 0], "uv_size": [10, 1]}, + "up": {"uv": [8, 10], "uv_size": [-8, -10]}, + "down": {"uv": [8, 10], "uv_size": [-8, -10]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/bedrock/rocks_base/pack_icon.png b/src/main/resources/bedrock/rocks_base/pack_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..f54e752cbcd6d60f6275802b382e6f01a8bc6cbd GIT binary patch literal 3491 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 R^XC8n002ovPDHLkV1oS@UWEVv literal 0 HcmV?d00001 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a63ecff..a2325e9 100755 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,7 +30,6 @@ ] }, - "accessWidener" : "thisrocks.accesswidener", "mixins": [ "rocks.mixins.json" ],