From 3ac321ad6cc74c6adc4ceb54f910cb192e0eb2a8 Mon Sep 17 00:00:00 2001 From: PinkGoosik Date: Fri, 24 Mar 2023 20:11:47 +0500 Subject: [PATCH] random improvements --- build.gradle | 1 - gradle.properties | 2 +- src/main/java/skylands/api/SkylandsAPI.java | 51 +++++++++++++++++- .../java/skylands/command/AcceptCommand.java | 4 +- .../java/skylands/command/HomeCommand.java | 14 ++--- .../java/skylands/command/HubCommands.java | 2 +- .../java/skylands/command/VisitCommand.java | 2 +- .../skylands/data/AbstractPlayerData.java | 11 ---- .../java/skylands/data/AbstractWorldData.java | 6 --- .../java/skylands/data/PlayerComponent.java | 19 +++++-- ...omponents.java => SkylandsComponents.java} | 2 +- .../java/skylands/data/WorldComponent.java | 3 +- src/main/java/skylands/logic/Hub.java | 5 +- src/main/java/skylands/logic/Island.java | 38 +++++++------ src/main/java/skylands/logic/Skylands.java | 4 ++ .../mixin/entity/ServerPlayerEntityMixin.java | 2 +- .../resources/data/skylands/lang/en_us.json | 32 +++++------ .../data/skylands/structures/start_island.nbt | Bin 15825 -> 15744 bytes src/main/resources/fabric.mod.json | 2 +- 19 files changed, 129 insertions(+), 71 deletions(-) delete mode 100644 src/main/java/skylands/data/AbstractPlayerData.java delete mode 100644 src/main/java/skylands/data/AbstractWorldData.java rename src/main/java/skylands/data/{Components.java => SkylandsComponents.java} (92%) diff --git a/build.gradle b/build.gradle index f3408db..fd2fa92 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ plugins { id "fabric-loom" version "1.1-SNAPSHOT" id "io.github.juuxel.loom-quiltflower" version "1.8.0" - id "io.github.p03w.machete" version "1.2.0" } archivesBaseName = project.archives_base_name diff --git a/gradle.properties b/gradle.properties index 7c9cb0f..daf7f52 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.parallel = true # Mod Properties maven_group = ru.pinkgoosik archives_base_name = skylands -mod_version = 0.3.4 +mod_version = 0.3.5 # Dependencies | Check these on https://fabricmc.net/develop minecraft_version = 1.19.4 diff --git a/src/main/java/skylands/api/SkylandsAPI.java b/src/main/java/skylands/api/SkylandsAPI.java index f4ab6fb..4da98df 100644 --- a/src/main/java/skylands/api/SkylandsAPI.java +++ b/src/main/java/skylands/api/SkylandsAPI.java @@ -1,10 +1,13 @@ package skylands.api; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.registry.RegistryKey; import net.minecraft.world.World; +import skylands.SkylandsMod; import skylands.logic.Island; import skylands.logic.Skylands; -import skylands.util.Worlds; import java.util.Optional; import java.util.UUID; @@ -12,6 +15,33 @@ public class SkylandsAPI { static Skylands skylands = Skylands.getInstance(); + public static final Event ON_HUB_VISIT = EventFactory.createArrayBacked(HubVisitEvent.class, callbacks -> (player, world) -> { + for (HubVisitEvent callback : callbacks) { + callback.invoke(player, world); + } + }); + @FunctionalInterface public interface HubVisitEvent {void invoke(PlayerEntity player, World world);} + + public static final Event ON_ISLAND_VISIT = EventFactory.createArrayBacked(GenericIslandEvent.class, callbacks -> (player, world, island) -> { + for (GenericIslandEvent callback : callbacks) { + callback.invoke(player, world, island); + } + }); + + public static final Event ON_ISLAND_FIRST_LOAD = EventFactory.createArrayBacked(GenericIslandEvent.class, callbacks -> (player, world, island) -> { + for (GenericIslandEvent callback : callbacks) { + callback.invoke(player, world, island); + } + }); + @FunctionalInterface public interface GenericIslandEvent {void invoke(PlayerEntity player, World world, Island island);} + + public static final Event ON_NETHER_FIRST_LOAD = EventFactory.createArrayBacked(NetherFirstLoad.class, callbacks -> (world, island) -> { + for (NetherFirstLoad callback : callbacks) { + callback.onLoad(world, island); + } + }); + @FunctionalInterface public interface NetherFirstLoad {void onLoad(World world, Island island);} + public static Optional getIsland(PlayerEntity player) { return skylands.islands.get(player); } @@ -24,8 +54,25 @@ public static Optional getIsland(UUID playerUuid) { return skylands.islands.get(playerUuid); } + public static boolean isIsland(World world) { + return isIsland(world.getRegistryKey()); + } + + public static boolean isIsland(RegistryKey registryKey) { + var namespace = registryKey.getValue().getNamespace(); + return namespace.equals(SkylandsMod.MOD_ID) || namespace.equals("nether") || namespace.equals("end"); + } + public static Optional getIsland(World world) { - return Worlds.getIsland(world); + if (isIsland(world)) { + try { + return Skylands.instance.islands.get(UUID.fromString(world.getRegistryKey().getValue().getPath())); + } + catch (Exception e) { + return Optional.empty(); + } + } + return Optional.empty(); } } diff --git a/src/main/java/skylands/command/AcceptCommand.java b/src/main/java/skylands/command/AcceptCommand.java index 220e549..b4ce720 100644 --- a/src/main/java/skylands/command/AcceptCommand.java +++ b/src/main/java/skylands/command/AcceptCommand.java @@ -5,7 +5,7 @@ import me.lucko.fabric.api.permissions.v0.Permissions; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; -import skylands.data.Components; +import skylands.data.SkylandsComponents; import skylands.logic.Skylands; import skylands.util.Players; import skylands.util.Texts; @@ -38,7 +38,7 @@ static void run(ServerPlayerEntity player, String ownerName) { if(!invite.get().accepted) { invite.get().accept(player); player.sendMessage(Texts.prefixed("message.skylands.accept.success", map -> map.put("%owner%", ownerName))); - Components.PLAYER_DATA.get(player).addIsland(ownerName); + SkylandsComponents.PLAYER_DATA.get(player).addIsland(ownerName); } } else { diff --git a/src/main/java/skylands/command/HomeCommand.java b/src/main/java/skylands/command/HomeCommand.java index 4e9c18f..0a865fa 100644 --- a/src/main/java/skylands/command/HomeCommand.java +++ b/src/main/java/skylands/command/HomeCommand.java @@ -6,7 +6,7 @@ import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import skylands.SkylandsMod; -import skylands.data.Components; +import skylands.data.SkylandsComponents; import skylands.logic.Skylands; import skylands.util.Texts; @@ -28,7 +28,7 @@ static void init(CommandDispatcher dispatcher) { var player = context.getSource().getPlayer(); if(player != null) { - var islands = Components.PLAYER_DATA.get(player).getIslands(); + var islands = SkylandsComponents.PLAYER_DATA.get(player).getIslands(); String remains = builder.getRemaining(); @@ -50,7 +50,7 @@ static void init(CommandDispatcher dispatcher) { })))); } - static void run(ServerPlayerEntity player) { + public static void run(ServerPlayerEntity player) { Skylands.instance.islands.get(player).ifPresentOrElse(island -> { if(player.getWorld().getRegistryKey().getValue().equals(SkylandsMod.id(player.getUuid().toString()))) { player.sendMessage(Texts.prefixed("message.skylands.home.fail")); @@ -62,7 +62,7 @@ static void run(ServerPlayerEntity player) { }, () -> player.sendMessage(Texts.prefixed("message.skylands.home.no_island"))); } - static void run(ServerPlayerEntity visitor, String islandOwner) { + public static void run(ServerPlayerEntity visitor, String islandOwner) { Skylands.instance.islands.get(islandOwner).ifPresentOrElse(island -> { if(visitor.getWorld().getRegistryKey().getValue().equals(SkylandsMod.id(island.owner.uuid.toString()))) { visitor.sendMessage(Texts.prefixed("message.skylands.visit_home.fail", map -> map.put("%owner%", islandOwner))); @@ -71,16 +71,16 @@ static void run(ServerPlayerEntity visitor, String islandOwner) { if(island.isMember(visitor)) { visitor.sendMessage(Texts.prefixed("message.skylands.visit_home.success", map -> map.put("%owner%", islandOwner))); island.visitAsMember(visitor); - Components.PLAYER_DATA.get(visitor).addIsland(islandOwner); + SkylandsComponents.PLAYER_DATA.get(visitor).addIsland(islandOwner); } else { visitor.sendMessage(Texts.prefixed("message.skylands.visit_home.not_member")); - Components.PLAYER_DATA.get(visitor).removeIsland(islandOwner); + SkylandsComponents.PLAYER_DATA.get(visitor).removeIsland(islandOwner); } } }, () -> { visitor.sendMessage(Texts.prefixed("message.skylands.visit_home.no_island")); - Components.PLAYER_DATA.get(visitor).removeIsland(islandOwner); + SkylandsComponents.PLAYER_DATA.get(visitor).removeIsland(islandOwner); }); } } diff --git a/src/main/java/skylands/command/HubCommands.java b/src/main/java/skylands/command/HubCommands.java index 95fa415..6c0c925 100644 --- a/src/main/java/skylands/command/HubCommands.java +++ b/src/main/java/skylands/command/HubCommands.java @@ -39,7 +39,7 @@ static void init(CommandDispatcher dispatcher) { }))); } - static void visit(ServerPlayerEntity player, MinecraftServer server) { + public static void visit(ServerPlayerEntity player, MinecraftServer server) { player.sendMessage(Texts.prefixed("message.skylands.hub_visit")); Skylands.instance.hub.visit(player); } diff --git a/src/main/java/skylands/command/VisitCommand.java b/src/main/java/skylands/command/VisitCommand.java index 253352d..1bb52a7 100644 --- a/src/main/java/skylands/command/VisitCommand.java +++ b/src/main/java/skylands/command/VisitCommand.java @@ -26,7 +26,7 @@ static void init(CommandDispatcher dispatcher) { })))); } - static void run(ServerPlayerEntity visitor, ServerPlayerEntity owner) { + public static void run(ServerPlayerEntity visitor, ServerPlayerEntity owner) { String ownerName = owner.getName().getString(); Skylands.instance.islands.get(owner).ifPresentOrElse(island -> { diff --git a/src/main/java/skylands/data/AbstractPlayerData.java b/src/main/java/skylands/data/AbstractPlayerData.java deleted file mode 100644 index 8d3b3da..0000000 --- a/src/main/java/skylands/data/AbstractPlayerData.java +++ /dev/null @@ -1,11 +0,0 @@ -package skylands.data; - -import dev.onyxstudios.cca.api.v3.component.ComponentV3; - -import java.util.ArrayList; - -public interface AbstractPlayerData extends ComponentV3 { - - ArrayList getIslands(); - void setIslands(ArrayList islands); -} diff --git a/src/main/java/skylands/data/AbstractWorldData.java b/src/main/java/skylands/data/AbstractWorldData.java deleted file mode 100644 index 86346a8..0000000 --- a/src/main/java/skylands/data/AbstractWorldData.java +++ /dev/null @@ -1,6 +0,0 @@ -package skylands.data; - -import dev.onyxstudios.cca.api.v3.component.ComponentV3; - -public interface AbstractWorldData extends ComponentV3 { -} diff --git a/src/main/java/skylands/data/PlayerComponent.java b/src/main/java/skylands/data/PlayerComponent.java index 1c5e792..0e1daf5 100644 --- a/src/main/java/skylands/data/PlayerComponent.java +++ b/src/main/java/skylands/data/PlayerComponent.java @@ -1,11 +1,15 @@ package skylands.data; +import dev.onyxstudios.cca.api.v3.component.ComponentV3; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; +import skylands.logic.Skylands; +import skylands.util.Worlds; import java.util.ArrayList; +import java.util.UUID; -public class PlayerComponent implements AbstractPlayerData { +public class PlayerComponent implements ComponentV3 { public PlayerEntity player; @@ -15,12 +19,10 @@ public PlayerComponent(PlayerEntity player) { this.player = player; } - @Override public ArrayList getIslands() { return islands; } - @Override public void setIslands(ArrayList islands) { this.islands = islands; } @@ -43,6 +45,13 @@ public void readFromNbt(NbtCompound tag) { String owner = islandsNbt.getString(String.valueOf(i)); this.islands.add(owner); } + + if(!tag.getString("lastIsland").isEmpty()) { + Skylands.instance.islands.get(UUID.fromString(tag.getString("lastIsland"))).ifPresent(island -> { + island.getWorld(); + if(island.hasNether) island.getNether(); + }); + } } @Override @@ -54,5 +63,9 @@ public void writeToNbt(NbtCompound tag) { islandsNbt.putString(Integer.toString(i), owner); } tag.put("islands", islandsNbt); + + Worlds.getIsland(player.getWorld()).ifPresent(island -> { + tag.putString("lastIsland", island.owner.uuid.toString()); + }); } } diff --git a/src/main/java/skylands/data/Components.java b/src/main/java/skylands/data/SkylandsComponents.java similarity index 92% rename from src/main/java/skylands/data/Components.java rename to src/main/java/skylands/data/SkylandsComponents.java index 1051196..1be7524 100644 --- a/src/main/java/skylands/data/Components.java +++ b/src/main/java/skylands/data/SkylandsComponents.java @@ -9,7 +9,7 @@ import dev.onyxstudios.cca.api.v3.world.WorldComponentInitializer; import skylands.SkylandsMod; -public class Components implements WorldComponentInitializer, EntityComponentInitializer { +public class SkylandsComponents implements WorldComponentInitializer, EntityComponentInitializer { public static final ComponentKey WORLD_DATA = ComponentRegistryV3.INSTANCE.getOrCreate(SkylandsMod.id("world_data"), WorldComponent.class); public static final ComponentKey PLAYER_DATA = ComponentRegistryV3.INSTANCE.getOrCreate(SkylandsMod.id("player_data"), PlayerComponent.class); diff --git a/src/main/java/skylands/data/WorldComponent.java b/src/main/java/skylands/data/WorldComponent.java index d9ccdbc..1e2a383 100644 --- a/src/main/java/skylands/data/WorldComponent.java +++ b/src/main/java/skylands/data/WorldComponent.java @@ -1,11 +1,12 @@ package skylands.data; +import dev.onyxstudios.cca.api.v3.component.ComponentV3; import net.minecraft.nbt.NbtCompound; import net.minecraft.world.World; import org.jetbrains.annotations.NotNull; import skylands.logic.Skylands; -public class WorldComponent implements AbstractWorldData { +public class WorldComponent implements ComponentV3 { public World world; public WorldComponent(World world) { diff --git a/src/main/java/skylands/logic/Hub.java b/src/main/java/skylands/logic/Hub.java index 88d3fbc..f326829 100644 --- a/src/main/java/skylands/logic/Hub.java +++ b/src/main/java/skylands/logic/Hub.java @@ -3,6 +3,7 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.math.Vec3d; +import skylands.api.SkylandsAPI; import java.util.Set; @@ -29,6 +30,8 @@ public void writeToNbt(NbtCompound nbt) { } public void visit(PlayerEntity player) { - player.teleport(Skylands.instance.server.getOverworld(), pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); + var world = Skylands.getServer().getOverworld(); + player.teleport(world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); + SkylandsAPI.ON_HUB_VISIT.invoker().invoke(player, world); } } diff --git a/src/main/java/skylands/logic/Island.java b/src/main/java/skylands/logic/Island.java index 5b1a5b9..2ec4788 100644 --- a/src/main/java/skylands/logic/Island.java +++ b/src/main/java/skylands/logic/Island.java @@ -20,6 +20,7 @@ import net.minecraft.world.gen.chunk.FlatChunkGenerator; import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; import skylands.SkylandsMod; +import skylands.api.SkylandsAPI; import skylands.util.Players; import skylands.util.Texts; import xyz.nucleoid.fantasy.Fantasy; @@ -240,34 +241,40 @@ public ServerWorld getWorld() { return handler.asWorld(); } - public void visitAsMember(PlayerEntity player) { + public void visit(PlayerEntity player, Vec3d pos) { ServerWorld world = this.getWorld(); - player.teleport(world, this.spawnPos.getX(), this.spawnPos.getY(), this.spawnPos.getZ(), Set.of(), 0, 0); + player.teleport(world, pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); + + if(!isMember(player)) { + Players.get(this.owner.name).ifPresent(owner -> { + if(!player.getUuid().equals(owner.getUuid())) { + owner.sendMessage(Texts.prefixed("message.skylands.island_visit.visit", map -> map.put("%visitor%", player.getName().getString()))); + } + }); + } + + SkylandsAPI.ON_ISLAND_VISIT.invoker().invoke(player, world, this); + if (this.freshCreated) { - this.onFirstLoad(); + this.onFirstLoad(player); this.freshCreated = false; } } + public void visitAsMember(PlayerEntity player) { + this.visit(player, this.spawnPos); + } + public void visitAsVisitor(PlayerEntity player) { - ServerWorld world = this.getWorld(); - player.teleport(world, this.visitsPos.getX(), this.visitsPos.getY(), this.visitsPos.getZ(), Set.of(), 0, 0); - if (this.freshCreated) { - this.onFirstLoad(); - this.freshCreated = false; - } - Players.get(this.owner.name).ifPresent(owner -> { - if(!player.getUuid().equals(owner.getUuid())) { - owner.sendMessage(Texts.prefixed("message.skylands.island_visit.visit", map -> map.put("%visitor%", player.getName().getString()))); - } - }); + this.visit(player, this.visitsPos); } - public void onFirstLoad() { + public void onFirstLoad(PlayerEntity player) { ServerWorld world = this.getWorld(); StructureTemplate structure = server.getStructureTemplateManager().getTemplateOrBlank(SkylandsMod.id("start_island")); StructurePlacementData data = new StructurePlacementData().setMirror(BlockMirror.NONE).setIgnoreEntities(true); structure.place(world, new BlockPos(-7, 65, -7), new BlockPos(0, 0, 0), data, world.getRandom(), Block.NOTIFY_ALL); + SkylandsAPI.ON_ISLAND_FIRST_LOAD.invoker().invoke(player, world, this); } void onFirstNetherLoad(ServerWorld world) { @@ -278,6 +285,7 @@ void onFirstNetherLoad(ServerWorld world) { StructureTemplate structure = server.getStructureTemplateManager().getTemplateOrBlank(SkylandsMod.id("nether_island")); StructurePlacementData data = new StructurePlacementData().setMirror(BlockMirror.NONE).setIgnoreEntities(true); structure.place(world, new BlockPos(-7, 65, -7), new BlockPos(0, 0, 0), data, world.getRandom(), Block.NOTIFY_ALL); + SkylandsAPI.ON_NETHER_FIRST_LOAD.invoker().onLoad(world, this); this.hasNether = true; } diff --git a/src/main/java/skylands/logic/Skylands.java b/src/main/java/skylands/logic/Skylands.java index 185273e..efd3566 100644 --- a/src/main/java/skylands/logic/Skylands.java +++ b/src/main/java/skylands/logic/Skylands.java @@ -48,6 +48,10 @@ public void writeToNbt(NbtCompound nbt) { nbt.put("skylands", skylandsNbt); } + public static MinecraftServer getServer() { + return getInstance().server; + } + public static Skylands getInstance() { return Skylands.instance; } diff --git a/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java b/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java index a977d8f..0e5425d 100644 --- a/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java +++ b/src/main/java/skylands/mixin/entity/ServerPlayerEntityMixin.java @@ -30,7 +30,7 @@ void tick(CallbackInfo ci) { ServerPlayerEntity player = ServerPlayerEntity.class.cast(this); if(!WorldProtection.canModify(world, player)) { - if(player.getPos().getY() < -74) { + if(player.getPos().getY() < world.getDimension().minY() - 10) { Worlds.getIsland(world).ifPresentOrElse(island -> { var pos = island.spawnPos; player.teleport(island.getWorld(), pos.getX(), pos.getY(), pos.getZ(), Set.of(), 0, 0); diff --git a/src/main/resources/data/skylands/lang/en_us.json b/src/main/resources/data/skylands/lang/en_us.json index 598e5b2..b5055e8 100644 --- a/src/main/resources/data/skylands/lang/en_us.json +++ b/src/main/resources/data/skylands/lang/en_us.json @@ -105,20 +105,20 @@ "message.skylands.world_protection.boat_open": "You can't interact with entities out here!", "message.skylands.world_protection.armor_stand_use": "You can't interact with entities out here!", - "message.skylands.help.0": "- /sl hub -> Teleport to the Hub.", - "message.skylands.help.1": "- /sl create -> Creates an Island.", - "message.skylands.help.2": "- /sl home -> Teleport to your Island.", - "message.skylands.help.3": "- /sl visit -> Visit someone's Island.", - "message.skylands.help.4": "- /sl home -> Teleport to an Island you are member of.", - "message.skylands.help.5": "- /sl members invite -> Invite player to your Island.", - "message.skylands.help.6": "- /sl members remove -> Remove player from your Island.", - "message.skylands.help.7": "- /sl accept -> Accept Island join invite request.", - "message.skylands.help.8": "- /sl kick -> Kick player from your Island.", - "message.skylands.help.9": "- /sl ban -> Ban player from visiting your Island.", - "message.skylands.help.10": "- /sl unban -> Unban player to allow visiting your Island.", - "message.skylands.help.11": "- /sl delete -> Deletes your Island.", - "message.skylands.help.12": "- /sl settings set-spawn-pos -> Changes home position.", - "message.skylands.help.13": "- /sl settings set-visits-pos -> Changes visits position.", - "message.skylands.help.14": "- /sl settings toggle-visits -> Enables/disables ability to visit your Island.", - "message.skylands.help.15": "- /sl help -> Sends this list." + "message.skylands.help.0": "- /sl hub → Teleport to the Hub.", + "message.skylands.help.1": "- /sl create → Creates an Island.", + "message.skylands.help.2": "- /sl home → Teleport to your Island.", + "message.skylands.help.3": "- /sl visit → Visit someone's Island.", + "message.skylands.help.4": "- /sl home → Teleport to an Island you are member of.", + "message.skylands.help.5": "- /sl members invite → Invite player to your Island.", + "message.skylands.help.6": "- /sl members remove → Remove player from your Island.", + "message.skylands.help.7": "- /sl accept → Accept Island join invite request.", + "message.skylands.help.8": "- /sl kick → Kick player from your Island.", + "message.skylands.help.9": "- /sl ban → Ban player from visiting your Island.", + "message.skylands.help.10": "- /sl unban → Unban player to allow visiting your Island.", + "message.skylands.help.11": "- /sl delete → Deletes your Island.", + "message.skylands.help.12": "- /sl settings set-spawn-pos → Changes home position.", + "message.skylands.help.13": "- /sl settings set-visits-pos → Changes visits position.", + "message.skylands.help.14": "- /sl settings toggle-visits → Enables/disables ability to visit your Island.", + "message.skylands.help.15": "- /sl help → Sends this list." } diff --git a/src/main/resources/data/skylands/structures/start_island.nbt b/src/main/resources/data/skylands/structures/start_island.nbt index a6bc324db50d7d3004f8a14f23d8aec678136c75..3efb90352aee091768c5c5b560c487b6331bc7bb 100644 GIT binary patch literal 15744 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 literal 15825 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 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 8e41c3a..35d86b5 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,7 +23,7 @@ "skylands.SkylandsMod" ], "cardinal-components": [ - "skylands.data.Components" + "skylands.data.SkylandsComponents" ] }, "accessWidener": "skylands.accesswidener",