diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d84793..0fe6975 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,3 @@ -- Remove redundant escape characters from string config field default comments. -- Add comments to lists of enums stating what values they can take (#23). -- Use system dependant line endings. -- Give each config its own Jankson instance to fix multithreading issues on Neoforge (#22). +Add more APIs in order to remove Architectury dependency. + +This is a backwards compatible update. Mods which still use 1.x.x versions of JamLib are able to coexist with JamLib 2.x.x and mods using it. Please get in touch if you run into issues. diff --git a/README.md b/README.md index b2ef9cf..88dc938 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,9 @@ JamLib provides: - Platform abstractions +- Events - A JSON5 config API +- Networking - A mod repost (9minecraft etc.) checker Comprehensive documentation can be found [here](https://docs.jamalam.tech/jamlib/getting-started/). diff --git a/common/build.gradle b/common/build.gradle index f314a78..7a49bd3 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -2,6 +2,14 @@ architectury { common(rootProject.enabled_platforms.split(",")) } +sourceSets { + deprecated { + java { + srcDir "src/deprecated/java" + } + } +} + loom { splitEnvironmentSourceSets() @@ -9,14 +17,33 @@ loom { jamlib { sourceSet sourceSets.main sourceSet sourceSets.client + sourceSet sourceSets.deprecated } } } +loom.createRemapConfigurations(sourceSets.deprecated) +configurations { + deprecatedImplementation.extendsFrom implementation + deprecatedRuntimeOnly.extendsFrom runtimeOnly + modDeprecatedImplementation.extendsFrom modImplementation + deprecatedCompileClasspath.extendsFrom clientCompileClasspath + modDeprecatedImplementation.extendsFrom modClientImplementation + deprecatedImplementation.extendsFrom clientImplementation +} + dependencies { modImplementation libs.fabric.loader - modImplementation libs.architectury.common api libs.jankson + + deprecatedImplementation libs.architectury.common + deprecatedImplementation sourceSets.main.output + deprecatedImplementation sourceSets.client.output +} + +tasks.named('jar', Jar) { + from sourceSets.deprecated.output + duplicatesStrategy = DuplicatesStrategy.EXCLUDE } publishing { diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/api/events/ClientPlayLifecycleEvents.java b/common/src/client/java/io/github/jamalam360/jamlib/client/api/events/ClientPlayLifecycleEvents.java new file mode 100644 index 0000000..570ccc5 --- /dev/null +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/api/events/ClientPlayLifecycleEvents.java @@ -0,0 +1,28 @@ +package io.github.jamalam360.jamlib.client.api.events; + +import io.github.jamalam360.jamlib.api.events.core.Event; +import net.minecraft.client.Minecraft; + +/** + * Events for client-side player lifecycle events. + */ +public class ClientPlayLifecycleEvents { + /** + * Called when the local player has joined a logical server. + */ + public static final Event JOIN = new Event<>(); + /** + * Called when the local player leaves a logical server. + */ + public static final Event DISCONNECT = new Event<>(); + + @FunctionalInterface + public interface Join { + void onJoin(Minecraft client); + } + + @FunctionalInterface + public interface Leave { + void onLeave(Minecraft client); + } +} diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/gui/WidgetList.java b/common/src/client/java/io/github/jamalam360/jamlib/client/api/gui/WidgetList.java similarity index 98% rename from common/src/client/java/io/github/jamalam360/jamlib/client/gui/WidgetList.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/api/gui/WidgetList.java index 06f3464..8a25cda 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/gui/WidgetList.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/api/gui/WidgetList.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.client.gui; +package io.github.jamalam360.jamlib.client.api.gui; import com.google.common.collect.ImmutableList; import net.minecraft.client.Minecraft; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/package-info.java b/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/package-info.java deleted file mode 100644 index 2ba9aeb..0000000 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * All classes in this package are internal. - */ -@ApiStatus.Internal -package io.github.jamalam360.jamlib.client.config.gui.entry; - -import org.jetbrains.annotations.ApiStatus; \ No newline at end of file diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/JamLibClient.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java similarity index 82% rename from common/src/client/java/io/github/jamalam360/jamlib/client/JamLibClient.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java index 6fe5960..9f90014 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/JamLibClient.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/JamLibClient.java @@ -1,8 +1,8 @@ -package io.github.jamalam360.jamlib.client; +package io.github.jamalam360.jamlib.client.impl; import static io.github.jamalam360.jamlib.JamLib.JAR_RENAMING_CHECKER; -import dev.architectury.event.events.client.ClientPlayerEvent; +import io.github.jamalam360.jamlib.client.api.events.ClientPlayLifecycleEvents; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -12,14 +12,11 @@ public class JamLibClient { @ApiStatus.Internal public static void init() { - ClientPlayerEvent.CLIENT_PLAYER_JOIN.register(JamLibClient::onPlayerJoin); + ClientPlayLifecycleEvents.JOIN.listen(JamLibClient::onPlayerJoin); } - private static void onPlayerJoin(LocalPlayer player) { - if (player != Minecraft.getInstance().player) { - return; - } - + private static void onPlayerJoin(Minecraft minecraft) { + LocalPlayer player = minecraft.player; if (JAR_RENAMING_CHECKER.getSuspiciousJarsToNotifyAbout().isEmpty()) { return; } diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/ConfigScreen.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/ConfigScreen.java similarity index 91% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/ConfigScreen.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/ConfigScreen.java index a79f7c4..73b7a33 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/ConfigScreen.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/ConfigScreen.java @@ -1,12 +1,13 @@ -package io.github.jamalam360.jamlib.client.config.gui; +package io.github.jamalam360.jamlib.client.impl.config; -import dev.architectury.platform.Platform; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.client.config.gui.entry.ConfigEntry; -import io.github.jamalam360.jamlib.client.gui.WidgetList; -import io.github.jamalam360.jamlib.config.ConfigExtensions; -import io.github.jamalam360.jamlib.config.ConfigManager; -import io.github.jamalam360.jamlib.config.HiddenInGui; +import io.github.jamalam360.jamlib.client.impl.config.entry.ConfigEntry; +import io.github.jamalam360.jamlib.client.api.gui.WidgetList; +import io.github.jamalam360.jamlib.api.config.ConfigExtensions; +import io.github.jamalam360.jamlib.api.config.ConfigManager; +import io.github.jamalam360.jamlib.api.config.HiddenInGui; +import io.github.jamalam360.jamlib.api.platform.ModInfo; +import io.github.jamalam360.jamlib.api.platform.Platform; import net.minecraft.util.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -58,7 +59,7 @@ protected static Component createTitle(ConfigManager manager) { if (I18n.exists(translationKey)) { return Component.translatable(translationKey); } else { - return Component.literal(Platform.getMod(manager.getModId()).getName()); + return Component.literal(Platform.getMod(manager.getModId()).map(ModInfo::modName).orElse("Unknown")); } } diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectConfigScreen.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectConfigScreen.java similarity index 90% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectConfigScreen.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectConfigScreen.java index e205bab..b06697f 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectConfigScreen.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectConfigScreen.java @@ -1,9 +1,11 @@ -package io.github.jamalam360.jamlib.client.config.gui; +package io.github.jamalam360.jamlib.client.impl.config; -import dev.architectury.platform.Platform; -import io.github.jamalam360.jamlib.config.ConfigManager; +import io.github.jamalam360.jamlib.api.config.ConfigManager; import java.util.List; import java.util.Objects; + +import io.github.jamalam360.jamlib.api.platform.ModInfo; +import io.github.jamalam360.jamlib.api.platform.Platform; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; @@ -31,7 +33,7 @@ private static Component createTitle(String modId) { if (I18n.exists(translationKey)) { return Component.translatable(translationKey); } else { - return Component.translatable("config.jamlib.selection_screen_title", Platform.getMod(modId).getName()); + return Component.translatable("config.jamlib.selection_screen_title", Platform.getMod(modId).map(ModInfo::modName).orElse("Unknown")); } } diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectionList.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectionList.java similarity index 93% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectionList.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectionList.java index d99becd..ff8cec6 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectionList.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectionList.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.client.config.gui; +package io.github.jamalam360.jamlib.client.impl.config; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectionListEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectionListEntry.java similarity index 98% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectionListEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectionListEntry.java index 44e1978..113c812 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/SelectionListEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/SelectionListEntry.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.client.config.gui; +package io.github.jamalam360.jamlib.client.impl.config; import java.util.List; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/BooleanConfigEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/BooleanConfigEntry.java similarity index 91% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/BooleanConfigEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/BooleanConfigEntry.java index 2d5ed8e..8522642 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/BooleanConfigEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/BooleanConfigEntry.java @@ -1,10 +1,9 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.List; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ConfigEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ConfigEntry.java similarity index 95% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ConfigEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ConfigEntry.java index 3cff140..d9ca215 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ConfigEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ConfigEntry.java @@ -1,11 +1,11 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import com.google.gson.Gson; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.client.config.gui.ConfigScreen; -import io.github.jamalam360.jamlib.client.mixinsupport.MutableSpriteImageWidget$Sprite; -import io.github.jamalam360.jamlib.config.ConfigExtensions; -import io.github.jamalam360.jamlib.config.ConfigManager; +import io.github.jamalam360.jamlib.client.impl.config.ConfigScreen; +import io.github.jamalam360.jamlib.client.impl.mixinsupport.MutableSpriteImageWidget$Sprite; +import io.github.jamalam360.jamlib.api.config.ConfigExtensions; +import io.github.jamalam360.jamlib.api.config.ConfigManager; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.ImageWidget; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ConfigField.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ConfigField.java similarity index 77% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ConfigField.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ConfigField.java index 314d560..ec2b83a 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ConfigField.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ConfigField.java @@ -1,6 +1,6 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; -import io.github.jamalam360.jamlib.config.ConfigManager; +import io.github.jamalam360.jamlib.api.config.ConfigManager; import java.lang.annotation.Annotation; import java.lang.reflect.Field; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/EnumButton.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/EnumButton.java similarity index 94% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/EnumButton.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/EnumButton.java index 4625239..c21e666 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/EnumButton.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/EnumButton.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import net.minecraft.client.gui.components.Button; import net.minecraft.network.chat.CommonComponents; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/EnumConfigEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/EnumConfigEntry.java similarity index 92% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/EnumConfigEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/EnumConfigEntry.java index 2df7af5..be4d6b9 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/EnumConfigEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/EnumConfigEntry.java @@ -1,6 +1,6 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; -import io.github.jamalam360.jamlib.client.config.gui.ConfigScreen; +import io.github.jamalam360.jamlib.client.impl.config.ConfigScreen; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.CommonComponents; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/FieldConfigField.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/FieldConfigField.java similarity index 91% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/FieldConfigField.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/FieldConfigField.java index 2930e55..9dc8dc5 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/FieldConfigField.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/FieldConfigField.java @@ -1,7 +1,7 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.config.ConfigManager; +import io.github.jamalam360.jamlib.api.config.ConfigManager; import java.lang.annotation.Annotation; import java.lang.reflect.Field; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ListConfigEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ListConfigEntry.java similarity index 93% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ListConfigEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ListConfigEntry.java index 9c03c00..c70a0d3 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ListConfigEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ListConfigEntry.java @@ -1,19 +1,15 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; -import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.client.gui.WidgetList; -import io.github.jamalam360.jamlib.config.ConfigExtensions; +import io.github.jamalam360.jamlib.client.api.gui.WidgetList; +import io.github.jamalam360.jamlib.api.config.ConfigExtensions; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.ImageWidget; -import net.minecraft.client.gui.components.Tooltip; import net.minecraft.network.chat.Component; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.function.Predicate; public class ListConfigEntry extends ConfigEntry> { private List> listMembers; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ListMemberConfigField.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ListMemberConfigField.java similarity index 93% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ListMemberConfigField.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ListMemberConfigField.java index 2db249e..a938f96 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/ListMemberConfigField.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/ListMemberConfigField.java @@ -1,7 +1,7 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.config.ConfigManager; +import io.github.jamalam360.jamlib.api.config.ConfigManager; import java.lang.annotation.Annotation; import java.lang.reflect.Field; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/NumberConfigEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/NumberConfigEntry.java similarity index 94% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/NumberConfigEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/NumberConfigEntry.java index f777c5b..225228b 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/NumberConfigEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/NumberConfigEntry.java @@ -1,7 +1,7 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; -import io.github.jamalam360.jamlib.config.Slider; -import io.github.jamalam360.jamlib.config.WithinRange; +import io.github.jamalam360.jamlib.api.config.Slider; +import io.github.jamalam360.jamlib.api.config.WithinRange; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/SliderButton.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/SliderButton.java similarity index 95% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/SliderButton.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/SliderButton.java index e29b18c..ddace34 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/SliderButton.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/SliderButton.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import net.minecraft.client.gui.components.AbstractSliderButton; import net.minecraft.network.chat.Component; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/StringConfigEntry.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/StringConfigEntry.java similarity index 90% rename from common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/StringConfigEntry.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/StringConfigEntry.java index d21bdf1..4d1458e 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/config/gui/entry/StringConfigEntry.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/config/entry/StringConfigEntry.java @@ -1,10 +1,9 @@ -package io.github.jamalam360.jamlib.client.config.gui.entry; +package io.github.jamalam360.jamlib.client.impl.config.entry; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.CommonComponents; -import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; import java.util.List; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/mixin/ImageWidget$SpriteMixin.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/ImageWidget$SpriteMixin.java similarity index 61% rename from common/src/client/java/io/github/jamalam360/jamlib/client/mixin/ImageWidget$SpriteMixin.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/ImageWidget$SpriteMixin.java index fbb7ba6..95c63cf 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/mixin/ImageWidget$SpriteMixin.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/ImageWidget$SpriteMixin.java @@ -1,13 +1,13 @@ -package io.github.jamalam360.jamlib.client.mixin; +package io.github.jamalam360.jamlib.client.impl.mixin; -import io.github.jamalam360.jamlib.client.mixinsupport.MutableSpriteImageWidget$Sprite; +import io.github.jamalam360.jamlib.client.impl.mixinsupport.MutableSpriteImageWidget$Sprite; import net.minecraft.resources.Identifier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net.minecraft.client.gui.components.ImageWidget$Sprite") -public class ImageWidget$SpriteMixin implements MutableSpriteImageWidget$Sprite { +public abstract class ImageWidget$SpriteMixin implements MutableSpriteImageWidget$Sprite { @Mutable @Shadow private Identifier sprite; diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/mixin/event/ClientPacketListenerMixin.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/ClientPacketListenerMixin.java similarity index 71% rename from common/src/client/java/io/github/jamalam360/jamlib/client/mixin/event/ClientPacketListenerMixin.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/ClientPacketListenerMixin.java index 6079aec..1fd43e7 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/mixin/event/ClientPacketListenerMixin.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/ClientPacketListenerMixin.java @@ -1,8 +1,6 @@ -package io.github.jamalam360.jamlib.client.mixin.event; +package io.github.jamalam360.jamlib.client.impl.mixin.event; -import io.github.jamalam360.jamlib.events.client.ClientPlayLifecycleEvents; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import io.github.jamalam360.jamlib.client.api.events.ClientPlayLifecycleEvents; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.protocol.game.ClientboundLoginPacket; @@ -12,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ClientPacketListener.class) -public class ClientPacketListenerMixin { +public abstract class ClientPacketListenerMixin { /** * Injection point taken from Fabric API - ... */ @@ -21,6 +19,6 @@ public class ClientPacketListenerMixin { at = @At("RETURN") ) private void jamlib$joinServer(ClientboundLoginPacket packet, CallbackInfo ci) { - ClientPlayLifecycleEvents.JOIN.invoker().onJoin(Minecraft.getInstance()); + ClientPlayLifecycleEvents.JOIN.invoke((listener) -> listener.onJoin(Minecraft.getInstance())); } } diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/mixin/event/ConnectionMixin.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/ConnectionMixin.java similarity index 67% rename from common/src/client/java/io/github/jamalam360/jamlib/client/mixin/event/ConnectionMixin.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/ConnectionMixin.java index 7d82d5d..f63f63d 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/mixin/event/ConnectionMixin.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/ConnectionMixin.java @@ -1,6 +1,6 @@ -package io.github.jamalam360.jamlib.client.mixin.event; +package io.github.jamalam360.jamlib.client.impl.mixin.event; -import io.github.jamalam360.jamlib.events.client.ClientPlayLifecycleEvents; +import io.github.jamalam360.jamlib.client.api.events.ClientPlayLifecycleEvents; import io.netty.channel.ChannelHandlerContext; import net.minecraft.client.Minecraft; import net.minecraft.network.Connection; @@ -10,13 +10,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Connection.class) -public class ConnectionMixin { +public abstract class ConnectionMixin { @Inject( method = "channelInactive", at = @At("HEAD") ) private void jamlib$callDisconnectEvent(ChannelHandlerContext channelHandlerContext, CallbackInfo ci) { - ClientPlayLifecycleEvents.DISCONNECT.invoker().onLeave(Minecraft.getInstance()); + ClientPlayLifecycleEvents.DISCONNECT.invoke((listener) -> listener.onLeave(Minecraft.getInstance())); } @Inject( @@ -27,6 +27,6 @@ public class ConnectionMixin { ) ) private void jamlib$callDisconnectEvent(CallbackInfo ci) { - ClientPlayLifecycleEvents.DISCONNECT.invoker().onLeave(Minecraft.getInstance()); + ClientPlayLifecycleEvents.DISCONNECT.invoke((listener) -> listener.onLeave(Minecraft.getInstance())); } } diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/MultiPlayerGameModeMixin.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/MultiPlayerGameModeMixin.java new file mode 100644 index 0000000..3b1c800 --- /dev/null +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixin/event/MultiPlayerGameModeMixin.java @@ -0,0 +1,48 @@ +package io.github.jamalam360.jamlib.client.impl.mixin.event; + +import io.github.jamalam360.jamlib.api.events.InteractionEvent; +import io.github.jamalam360.jamlib.api.events.core.EventResult; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.client.multiplayer.prediction.PredictiveAction; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.protocol.game.ServerboundUseItemOnPacket; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +// Injection point credit to Fabric API: https://github.com/FabricMC/fabric-api/blob/05ed2daee8dab2367d68aacd75bf86d2277ec177/fabric-events-interaction-v0/src/client/java/net/fabricmc/fabric/mixin/event/interaction/client/MultiPlayerGameModeMixin.java#L99 +@Mixin(MultiPlayerGameMode.class) +public abstract class MultiPlayerGameModeMixin { + @Shadow + protected abstract void startPrediction(ClientLevel level, PredictiveAction action); + + @Inject( + method = "useItemOn", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;startPrediction(Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/multiplayer/prediction/PredictiveAction;)V" + ), + cancellable = true + ) + private void jamlib$onInteractBlock(LocalPlayer player, InteractionHand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { + if (player.isSpectator()) { + return; + } + + EventResult result = InteractionEvent.USE_BLOCK.invokeCancellable((ev) -> ev.onUseBlock(player, hand, hitResult.getBlockPos(), hitResult.getDirection())); + + if (result.wasCancelled()) { + if (result.getResult() != null && result.getResult().consumesAction()) { + startPrediction((ClientLevel) player.level(), id -> new ServerboundUseItemOnPacket(hand, hitResult, id)); + } + + cir.setReturnValue(result.getResult()); + } + } +} diff --git a/common/src/client/java/io/github/jamalam360/jamlib/client/mixinsupport/MutableSpriteImageWidget$Sprite.java b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixinsupport/MutableSpriteImageWidget$Sprite.java similarity index 68% rename from common/src/client/java/io/github/jamalam360/jamlib/client/mixinsupport/MutableSpriteImageWidget$Sprite.java rename to common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixinsupport/MutableSpriteImageWidget$Sprite.java index 083fc3d..54c8d39 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/client/mixinsupport/MutableSpriteImageWidget$Sprite.java +++ b/common/src/client/java/io/github/jamalam360/jamlib/client/impl/mixinsupport/MutableSpriteImageWidget$Sprite.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.client.mixinsupport; +package io.github.jamalam360.jamlib.client.impl.mixinsupport; import net.minecraft.resources.Identifier; diff --git a/common/src/client/resources/jamlib.client.mixins.json b/common/src/client/resources/jamlib.client.mixins.json index 0e4cf32..6c63876 100644 --- a/common/src/client/resources/jamlib.client.mixins.json +++ b/common/src/client/resources/jamlib.client.mixins.json @@ -1,14 +1,15 @@ { "required": true, "minVersion": "0.8", - "package": "io.github.jamalam360.jamlib.client.mixin", + "package": "io.github.jamalam360.jamlib.client.impl.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ ], "client": [ "ImageWidget$SpriteMixin", "event.ClientPacketListenerMixin", - "event.ConnectionMixin" + "event.ConnectionMixin", + "event.MultiPlayerGameModeMixin" ], "server": [ ], diff --git a/common/src/main/java/io/github/jamalam360/jamlib/JamLibPlatform.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/JamLibPlatform.java similarity index 62% rename from common/src/main/java/io/github/jamalam360/jamlib/JamLibPlatform.java rename to common/src/deprecated/java/io/github/jamalam360/jamlib/JamLibPlatform.java index 9643665..dd00128 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/JamLibPlatform.java +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/JamLibPlatform.java @@ -1,29 +1,16 @@ package io.github.jamalam360.jamlib; - -/** - * Provides common platform agnostic methods. - * - * @see dev.architectury.platform.Platform - */ +@Deprecated(forRemoval = true) public class JamLibPlatform { - - /** - * @return The current mod loader. - */ public static Platform getPlatform() { - if (dev.architectury.platform.Platform.isModLoaded("quilt_loader")) { - return Platform.QUILT; - } else if (dev.architectury.platform.Platform.isNeoForge()) { - return Platform.NEOFORGE; - } else { - return Platform.FABRIC; - } + return switch (io.github.jamalam360.jamlib.api.platform.Platform.getModLoader()) { + case FABRIC -> Platform.FABRIC; + case QUILT -> Platform.QUILT; + case FORGE -> throw new IllegalStateException("Forge is not supported past 1.20.1"); + case NEOFORGE -> Platform.NEOFORGE; + }; } - /** - * A mod loader. - */ public enum Platform { FABRIC, NEOFORGE, diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/ConfigExtensions.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/ConfigExtensions.java new file mode 100644 index 0000000..259fed2 --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/ConfigExtensions.java @@ -0,0 +1,92 @@ +package io.github.jamalam360.jamlib.config; + +import io.github.jamalam360.jamlib.JamLib; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; + +import java.lang.reflect.Field; +import java.net.URI; +import java.net.URL; +import java.util.List; + +@Deprecated(forRemoval = true) +public interface ConfigExtensions { + default List getLinks() { + return List.of(); + } + + default void afterSave() { } + + default List getValidationErrors(ConfigManager manager, FieldValidationInfo info) { + return List.of(); + } + + @Deprecated(forRemoval = true) + class Link { + @Deprecated(forRemoval = true) + public static final Identifier DISCORD = JamLib.id("link_discord"); + @Deprecated(forRemoval = true) + public static final Identifier GENERIC_LINK = JamLib.id("link_generic"); + @Deprecated(forRemoval = true) + public static final Identifier GITHUB = JamLib.id("link_github"); + + private final Identifier texture; + private final URL url; + private final Component tooltip; + + public Link(Identifier texture, String url, Component tooltip) { + this.texture = texture; + + try { + this.url = new URI(url).toURL(); + } catch (Exception e) { + JamLib.LOGGER.error("Malformed URL for config screen link: {}", url); + throw new RuntimeException(e); + } + + this.tooltip = tooltip; + } + + public Link(Identifier texture, URL url, Component tooltip) { + this.texture = texture; + this.url = url; + this.tooltip = tooltip; + } + + public Identifier getTexture() { + return this.texture; + } + + public URL getUrl() { + return this.url; + } + + public Component getTooltip() { + return this.tooltip; + } + } + + @Deprecated(forRemoval = true) + record ValidationError(Type type, FieldValidationInfo field, Component message) { + + @Deprecated(forRemoval = true) + public enum Type { + WARNING, + ERROR; + + private final Identifier texture; + + Type() { + this.texture = JamLib.id("validation_" + this.name().toLowerCase()); + } + + public Identifier getTexture() { + return this.texture; + } + } + } + + @Deprecated(forRemoval = true) + record FieldValidationInfo(String name, Object value, Object initialValue, Field backingField) { + } +} diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/ConfigManager.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/ConfigManager.java new file mode 100644 index 0000000..9bc624b --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/ConfigManager.java @@ -0,0 +1,41 @@ +package io.github.jamalam360.jamlib.config; + +@Deprecated(forRemoval = true) +public class ConfigManager { + private final io.github.jamalam360.jamlib.api.config.ConfigManager delegate; + + public ConfigManager(String modId, Class configClass) { + this(modId, modId, configClass); + } + + public ConfigManager(String modId, String configName, Class configClass) { + this.delegate = new io.github.jamalam360.jamlib.api.config.ConfigManager<>(modId, configName, configClass); + } + + public T get() { + return this.delegate.get(); + } + + public String getConfigName() { + return this.delegate.getConfigName(); + } + + public Class getConfigClass() { + return this.delegate.getConfigClass(); + } + + public String getModId() { + return this.delegate.getModId(); + } + + public void save() { + this.delegate.save(); + } + + public void reloadFromDisk() { + this.delegate.reloadFromDisk(); + } + + public record Key(String modId, String configName) { + } +} diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/HiddenInGui.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/HiddenInGui.java new file mode 100644 index 0000000..f12a2cb --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/HiddenInGui.java @@ -0,0 +1,12 @@ +package io.github.jamalam360.jamlib.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Deprecated(forRemoval = true) +public @interface HiddenInGui { +} diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/MatchesRegex.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/MatchesRegex.java new file mode 100644 index 0000000..55a2f77 --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/MatchesRegex.java @@ -0,0 +1,13 @@ +package io.github.jamalam360.jamlib.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Deprecated(forRemoval = true) +public @interface MatchesRegex { + String value(); +} diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/RequiresRestart.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/RequiresRestart.java new file mode 100644 index 0000000..63c179c --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/RequiresRestart.java @@ -0,0 +1,12 @@ +package io.github.jamalam360.jamlib.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Deprecated(forRemoval = true) +public @interface RequiresRestart { +} diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/Slider.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/Slider.java new file mode 100644 index 0000000..0c63b80 --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/Slider.java @@ -0,0 +1,12 @@ +package io.github.jamalam360.jamlib.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Deprecated(forRemoval = true) +public @interface Slider { +} diff --git a/common/src/deprecated/java/io/github/jamalam360/jamlib/config/WithinRange.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/WithinRange.java new file mode 100644 index 0000000..58e2882 --- /dev/null +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/config/WithinRange.java @@ -0,0 +1,14 @@ +package io.github.jamalam360.jamlib.config; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Deprecated(forRemoval = true) +public @interface WithinRange { + double min(); + double max(); +} diff --git a/common/src/client/java/io/github/jamalam360/jamlib/events/client/ClientPlayLifecycleEvents.java b/common/src/deprecated/java/io/github/jamalam360/jamlib/events/client/ClientPlayLifecycleEvents.java similarity index 67% rename from common/src/client/java/io/github/jamalam360/jamlib/events/client/ClientPlayLifecycleEvents.java rename to common/src/deprecated/java/io/github/jamalam360/jamlib/events/client/ClientPlayLifecycleEvents.java index 540f5b2..9844978 100644 --- a/common/src/client/java/io/github/jamalam360/jamlib/events/client/ClientPlayLifecycleEvents.java +++ b/common/src/deprecated/java/io/github/jamalam360/jamlib/events/client/ClientPlayLifecycleEvents.java @@ -4,9 +4,7 @@ import dev.architectury.event.EventFactory; import net.minecraft.client.Minecraft; -/** - * Events for client-side player lifecycle events. - */ +@Deprecated(forRemoval = true) public class ClientPlayLifecycleEvents { /** * Called when the local player has joined a logical server. @@ -17,6 +15,11 @@ public class ClientPlayLifecycleEvents { */ public static final Event DISCONNECT = EventFactory.createLoop(Leave.class); + static { + io.github.jamalam360.jamlib.client.api.events.ClientPlayLifecycleEvents.JOIN.listen((minecraft) -> JOIN.invoker().onJoin(minecraft)); + io.github.jamalam360.jamlib.client.api.events.ClientPlayLifecycleEvents.DISCONNECT.listen((minecraft) -> DISCONNECT.invoker().onLeave(minecraft)); + } + @FunctionalInterface public interface Join { void onJoin(Minecraft client); diff --git a/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java b/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java index baefa75..7e555e1 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/JamLib.java @@ -1,9 +1,7 @@ package io.github.jamalam360.jamlib; -import dev.architectury.event.events.client.ClientPlayerEvent; -import dev.architectury.platform.Platform; -import dev.architectury.utils.EnvExecutor; -import net.fabricmc.api.EnvType; +import io.github.jamalam360.jamlib.api.platform.Platform; +import io.github.jamalam360.jamlib.impl.JarRenamingChecker; import net.minecraft.resources.Identifier; import org.jetbrains.annotations.ApiStatus; import org.slf4j.Logger; @@ -19,7 +17,7 @@ public class JamLib { @ApiStatus.Internal public static void init() { - LOGGER.info("Initializing JamLib on {}", JamLibPlatform.getPlatform()); + LOGGER.info("Initializing JamLib on {}", Platform.getModLoader()); checkForJarRenaming(JamLib.class); } @@ -41,4 +39,9 @@ public static void checkForJarRenaming(Class anyModClass) { public static Identifier id(String path) { return Identifier.fromNamespaceAndPath(MOD_ID, path); } + + @ApiStatus.Internal + public static T expectPlatform() { + throw new AssertionError("Expected platform-specific implementation"); + } } diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/ConfigExtensions.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/ConfigExtensions.java similarity index 99% rename from common/src/main/java/io/github/jamalam360/jamlib/config/ConfigExtensions.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/ConfigExtensions.java index 0f1a3b4..590b0a3 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/ConfigExtensions.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/ConfigExtensions.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import io.github.jamalam360.jamlib.JamLib; import net.minecraft.network.chat.Component; diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/ConfigManager.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/ConfigManager.java similarity index 98% rename from common/src/main/java/io/github/jamalam360/jamlib/config/ConfigManager.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/ConfigManager.java index 0342b6b..381a379 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/ConfigManager.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/ConfigManager.java @@ -1,11 +1,11 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import blue.endless.jankson.Jankson; import blue.endless.jankson.JsonElement; import blue.endless.jankson.JsonGrammar; import blue.endless.jankson.JsonObject; -import dev.architectury.platform.Platform; import io.github.jamalam360.jamlib.JamLib; +import io.github.jamalam360.jamlib.api.platform.Platform; import org.jetbrains.annotations.ApiStatus; import java.io.IOException; diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/HiddenInGui.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/HiddenInGui.java similarity index 75% rename from common/src/main/java/io/github/jamalam360/jamlib/config/HiddenInGui.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/HiddenInGui.java index 6350c01..53a7ce0 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/HiddenInGui.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/HiddenInGui.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,7 +6,7 @@ import java.lang.annotation.Target; /** - * Applying this to a config field will cause it to not show in the {@link io.github.jamalam360.jamlib.client.config.gui.ConfigScreen}. + * Applying this to a config field will cause it to not show in the config screen. * * @see ConfigManager */ diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/MatchesRegex.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/MatchesRegex.java similarity index 89% rename from common/src/main/java/io/github/jamalam360/jamlib/config/MatchesRegex.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/MatchesRegex.java index 44773b4..e74c6af 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/MatchesRegex.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/MatchesRegex.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/RequiresRestart.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/RequiresRestart.java similarity index 90% rename from common/src/main/java/io/github/jamalam360/jamlib/config/RequiresRestart.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/RequiresRestart.java index 7cb5224..81b18a2 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/RequiresRestart.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/RequiresRestart.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/Slider.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/Slider.java similarity index 91% rename from common/src/main/java/io/github/jamalam360/jamlib/config/Slider.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/Slider.java index 67456e4..eaa1bdc 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/Slider.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/Slider.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/common/src/main/java/io/github/jamalam360/jamlib/config/WithinRange.java b/common/src/main/java/io/github/jamalam360/jamlib/api/config/WithinRange.java similarity index 90% rename from common/src/main/java/io/github/jamalam360/jamlib/config/WithinRange.java rename to common/src/main/java/io/github/jamalam360/jamlib/api/config/WithinRange.java index fb65314..544d093 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/config/WithinRange.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/config/WithinRange.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.config; +package io.github.jamalam360.jamlib.api.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/events/InteractionEvent.java b/common/src/main/java/io/github/jamalam360/jamlib/api/events/InteractionEvent.java new file mode 100644 index 0000000..616eb58 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/events/InteractionEvent.java @@ -0,0 +1,24 @@ +package io.github.jamalam360.jamlib.api.events; + +import io.github.jamalam360.jamlib.api.events.core.CancellableEvent; +import io.github.jamalam360.jamlib.api.events.core.EventResult; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; + +/** + * Events related to player interactions. + */ +public class InteractionEvent { + /** + * Called when a player interacts with a block. + */ + public static final CancellableEvent USE_BLOCK = new CancellableEvent<>(); + + @FunctionalInterface + public interface UseBlock { + EventResult onUseBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/CancellableEvent.java b/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/CancellableEvent.java new file mode 100644 index 0000000..af0b22c --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/CancellableEvent.java @@ -0,0 +1,29 @@ +package io.github.jamalam360.jamlib.api.events.core; + +import java.util.function.Function; + +/** + * A {@link Event} that can be canceled. + * @param The listener type. + * @param The return type. + */ +public class CancellableEvent extends Event { + /** + * Invokes all listeners for this event. + * @param invoker The listener invoker. + * @return The result of the first listener to return a non-passing {@link EventResult}, or a passing {@link EventResult} if all listeners pass. + */ + public EventResult invokeCancellable(Function> invoker) { + for (int priority : this.getListeners().keySet()) { + for (L listener : this.getListeners().get(priority)) { + EventResult result = invoker.apply(listener); + + if (result.wasCancelled()) { + return result; + } + } + } + + return EventResult.pass(); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/Event.java b/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/Event.java new file mode 100644 index 0000000..0f42c50 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/Event.java @@ -0,0 +1,52 @@ +package io.github.jamalam360.jamlib.api.events.core; + +import com.google.common.collect.Ordering; +import com.google.common.collect.TreeMultimap; + +import java.util.function.Consumer; + +/** + * A listenable event. + * @param The listener type. + */ +public class Event { + public static final int DEFAULT_PRIORITY = 1000; + private final TreeMultimap listeners; + + public Event() { + this.listeners = TreeMultimap.create(Ordering.natural().reverse(), Ordering.arbitrary()); + } + + /** + * Listens for this event, using the default priority of 1000. + * @param listener The listener. + */ + public void listen(L listener) { + this.listen(DEFAULT_PRIORITY, listener); + } + + /** + * Listens for this event. + * @param priority The priority of the listener - higher numbers are executed first. + * @param listener The listener. + */ + public void listen(int priority, L listener) { + this.listeners.put(priority, listener); + } + + /** + * Invokes all listeners for this event. + * @param invoker The listener invoker. + */ + public void invoke(Consumer invoker) { + for (int priority : this.listeners.keySet()) { + for (L listener : this.listeners.get(priority)) { + invoker.accept(listener); + } + } + } + + protected TreeMultimap getListeners() { + return this.listeners; + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/EventResult.java b/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/EventResult.java new file mode 100644 index 0000000..a667d7e --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/events/core/EventResult.java @@ -0,0 +1,31 @@ +package io.github.jamalam360.jamlib.api.events.core; + +import org.jetbrains.annotations.Nullable; + +public class EventResult { + private final boolean cancelled; + @Nullable + private final T result; + + private EventResult(boolean cancelled, @Nullable T result) { + this.cancelled = cancelled; + this.result = result; + } + + public static EventResult pass() { + return new EventResult<>(false, null); + } + + public static EventResult cancel(T result) { + return new EventResult<>(true, result); + } + + public boolean wasCancelled() { + return this.cancelled; + } + + @Nullable + public T getResult() { + return this.result; + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java new file mode 100644 index 0000000..d835097 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/Network.java @@ -0,0 +1,106 @@ +package io.github.jamalam360.jamlib.api.network; + +import io.github.jamalam360.jamlib.JamLib; +import io.github.jamalam360.jamlib.impl.fabric.network.JamLibPacket; +import io.github.jamalam360.jamlib.impl.fabric.network.PlatformNetwork; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.ApiStatus; + +import java.util.*; + +/** + * A platform-agnostic packet sending system. + */ +public class Network { + private static final Map, NetworkPayloadType> types = new HashMap<>(); + private static final Map, NetworkPayloadHandler> clientBoundHandlers = new HashMap<>(); + private static final Map, NetworkPayloadHandler> serverBoundHandlers = new HashMap<>(); + + /** + * Registers a handler for a payload type. + * @param direction The direction the handler should be registered for. + * @param id The ID of the payload the handler handles. + * @param handler The handler. + */ + public static void registerHandler(Direction direction, PayloadType id, NetworkPayloadHandler handler) { + Map, NetworkPayloadHandler> handlers = switch (direction) { + case CLIENT_BOUND -> clientBoundHandlers; + case SERVER_BOUND -> serverBoundHandlers; + }; + + if (handlers.containsKey(id)) { + throw new IllegalArgumentException("A handler for the payload type with the id " + id + " is already registered"); + } + + handlers.put(id, handler); + } + + /** + * @param id The ID of the payload type. + * @param type The type of the payload. + */ + public static void registerPayloadType(PayloadType id, NetworkPayloadType type) { + if (types.containsKey(id)) { + throw new IllegalArgumentException("A payload type with the id " + id + " is already registered"); + } + + types.put(id, type); + JamLib.LOGGER.info("Registered network payload type {}", id.id()); + } + + /** + * Sends a payload to the server. + * @param id The ID of the payload type. + * @param payload The payload. + */ + @SuppressWarnings("unchecked") + public static void sendToServer(PayloadType id, T payload) { + if (!types.containsKey(id)) { + throw new IllegalArgumentException("No payload type with the id " + id + " is registered"); + } + + NetworkPayloadType type = (NetworkPayloadType) types.get(id); + PlatformNetwork.sendToServer(id, type.getSerializer(), payload); + } + + /** + * Sends a payload to the client. + * @param id The ID of the payload type. + * @param payload The payload. + */ + @SuppressWarnings("unchecked") + public static void sendToClient(ServerPlayer player, PayloadType id, T payload) { + if (!types.containsKey(id)) { + throw new IllegalArgumentException("No payload type with the id " + id + " is registered"); + } + + NetworkPayloadType type = (NetworkPayloadType) types.get(id); + PlatformNetwork.sendToClient(player, id, type.getSerializer(), payload); + } + + @SuppressWarnings("unchecked") + @ApiStatus.Internal + public static void receive(Direction direction, NetworkContext context, JamLibPacket packet) { + Map, NetworkPayloadHandler> handlers = switch (direction) { + case CLIENT_BOUND -> clientBoundHandlers; + case SERVER_BOUND -> serverBoundHandlers; + }; + + if (!types.containsKey(packet.payloadType())) { + throw new IllegalArgumentException("No payload type with the id " + packet.payloadType() + " is registered"); + } + + if (!handlers.containsKey(packet.payloadType())) { + throw new IllegalStateException("Received a packet with the id " + packet.payloadType() + " for which no handler is registered"); + } + + NetworkPayloadType type = (NetworkPayloadType) types.get(packet.payloadType()); + NetworkPayloadHandler handler = (NetworkPayloadHandler) handlers.get(packet.payloadType()); + handler.handle(context, type.getDeserializer().deserialize(packet.payload())); + } + + public enum Direction { + CLIENT_BOUND, + SERVER_BOUND + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java new file mode 100644 index 0000000..ef9857d --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkContext.java @@ -0,0 +1,10 @@ +package io.github.jamalam360.jamlib.api.network; + +import net.minecraft.world.entity.player.Player; + +/** + * Context passed to a {@link NetworkPayloadHandler}. + * @param player The player who received or sent the packet. + */ +public record NetworkContext(Player player) { +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadHandler.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadHandler.java new file mode 100644 index 0000000..e40692f --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadHandler.java @@ -0,0 +1,14 @@ +package io.github.jamalam360.jamlib.api.network; + +/** + * A handler for network payloads. + */ +@FunctionalInterface +public interface NetworkPayloadHandler { + /** + * Handle an incoming network payload. + * @param ctx The network context. + * @param payload The payload. + */ + void handle(NetworkContext ctx, T payload); +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadType.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadType.java new file mode 100644 index 0000000..2f62efc --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/NetworkPayloadType.java @@ -0,0 +1,46 @@ +package io.github.jamalam360.jamlib.api.network; + +import net.minecraft.network.RegistryFriendlyByteBuf; + +/** + * A payload that can be sent over the network. + * @param The type of the payload, usually a record. + */ +public interface NetworkPayloadType { + /** + * @return A serializer instance for the payload type. + */ + Serializer getSerializer(); + + /** + * @return A deserializer instance for the payload type. + */ + Deserializer getDeserializer(); + + /** + * A serializer for a payload. + */ + @FunctionalInterface + interface Serializer { + + /** + * Serializes a payload to a buffer. + * @param object The payload to serialize. + * @param buf The buffer to write to. + */ + void serialize(T object, RegistryFriendlyByteBuf buf); + } + + /** + * A deserializer for a payload. + */ + @FunctionalInterface + interface Deserializer { + /** + * Deserializes a payload from a buffer. + * @param buf The buffer to read from. + * @return The deserialized payload. + */ + T deserialize(RegistryFriendlyByteBuf buf); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/PayloadType.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PayloadType.java new file mode 100644 index 0000000..ceb22b0 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/PayloadType.java @@ -0,0 +1,10 @@ +package io.github.jamalam360.jamlib.api.network; + +import net.minecraft.resources.Identifier; + +/** + * Uniquely identifies a {@link NetworkPayloadType}. + * @param id A unique identifier for the payload type. + */ +public record PayloadType(Identifier id) { +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/network/StreamCodecNetworkPayloadType.java b/common/src/main/java/io/github/jamalam360/jamlib/api/network/StreamCodecNetworkPayloadType.java new file mode 100644 index 0000000..14f7c3d --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/network/StreamCodecNetworkPayloadType.java @@ -0,0 +1,21 @@ +package io.github.jamalam360.jamlib.api.network; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +/** + * A {@link NetworkPayloadType} that uses a {@link StreamCodec} to encode and decode the payload. + */ +public interface StreamCodecNetworkPayloadType extends NetworkPayloadType { + StreamCodec getStreamCodec(); + + @Override + default Serializer getSerializer() { + return (object, buf) -> getStreamCodec().encode(buf, object); + } + + @Override + default Deserializer getDeserializer() { + return buf -> getStreamCodec().decode(buf); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/platform/ModInfo.java b/common/src/main/java/io/github/jamalam360/jamlib/api/platform/ModInfo.java new file mode 100644 index 0000000..abd67b6 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/platform/ModInfo.java @@ -0,0 +1,7 @@ +package io.github.jamalam360.jamlib.api.platform; + +/** + * A basic platform-independent representation of a mod. + */ +public record ModInfo(String modId, String modName, String version) { +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/platform/ModLoader.java b/common/src/main/java/io/github/jamalam360/jamlib/api/platform/ModLoader.java new file mode 100644 index 0000000..fcde5ed --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/platform/ModLoader.java @@ -0,0 +1,45 @@ +package io.github.jamalam360.jamlib.api.platform; + +/** + * A mod loader. + */ +public enum ModLoader { + FABRIC, + QUILT, + FORGE, + NEOFORGE; + + public boolean isFabric() { + return this == FABRIC; + } + + public boolean isQuilt() { + return this == QUILT; + } + + public boolean isForge() { + return this == FORGE; + } + + public boolean isNeoForge() { + return this == NEOFORGE; + } + + public boolean isFabricLike() { + return this.isFabric() || this.isQuilt(); + } + + public boolean isForgeLike() { + return this.isForge() || this.isNeoForge(); + } + + @Override + public String toString() { + return switch (this) { + case FABRIC -> "Fabric"; + case QUILT -> "Quilt"; + case FORGE -> "Forge"; + case NEOFORGE -> "NeoForge"; + }; + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/api/platform/Platform.java b/common/src/main/java/io/github/jamalam360/jamlib/api/platform/Platform.java new file mode 100644 index 0000000..0eac368 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/api/platform/Platform.java @@ -0,0 +1,84 @@ +package io.github.jamalam360.jamlib.api.platform; + +import dev.architectury.injectables.annotations.ExpectPlatform; +import io.github.jamalam360.jamlib.JamLib; + +import java.nio.file.Path; +import java.util.Optional; + +/** + * Provides common platform-agnostic methods. + */ +public class Platform { + /** + * @return Information about the mod with the given ID, if it is loaded. + */ + @ExpectPlatform + public static Optional getMod(String modId) { + return JamLib.expectPlatform(); + } + + /** + * @return Whether the mod with the given ID is loaded. + */ + public static boolean isModLoaded(String modId) { + return getMod(modId).isPresent(); + } + + /** + * @return Whether the current platform is Forge. + */ + @ExpectPlatform + public static boolean isForge() { + return JamLib.expectPlatform(); + } + + /** + * @return Whether the current platform is NeoForge. + */ + @ExpectPlatform + public static boolean isNeoForge() { + return JamLib.expectPlatform(); + } + + /** + * @return The current mod loader. + */ + public static ModLoader getModLoader() { + if (isModLoaded("fabricloader")) { + return ModLoader.FABRIC; + } else if (isModLoaded("quilt_loader")) { + return ModLoader.QUILT; + } else if (isForge()) { + return ModLoader.FORGE; + } else if (isNeoForge()){ + return ModLoader.NEOFORGE; + } + + throw new IllegalStateException("Could not determine mod loader"); + } + + /** + * @return Whether the game is currently running in a development environment. + */ + @ExpectPlatform + public static boolean isDevelopmentEnvironment() { + return JamLib.expectPlatform(); + } + + /** + * @return The path to the root game folder (e.g. .minecraft). + */ + @ExpectPlatform + public static Path getGameFolder() { + return JamLib.expectPlatform(); + } + + /** + * @return The path to the config folder. + */ + @ExpectPlatform + public static Path getConfigFolder() { + return JamLib.expectPlatform(); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/JarRenamingChecker.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/JarRenamingChecker.java similarity index 97% rename from common/src/main/java/io/github/jamalam360/jamlib/JarRenamingChecker.java rename to common/src/main/java/io/github/jamalam360/jamlib/impl/JarRenamingChecker.java index 297dad8..6edde7e 100644 --- a/common/src/main/java/io/github/jamalam360/jamlib/JarRenamingChecker.java +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/JarRenamingChecker.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib; +package io.github.jamalam360.jamlib.impl; import com.google.common.io.Files; import java.io.File; @@ -8,13 +8,13 @@ import java.util.ArrayList; import java.util.List; import java.util.jar.Manifest; -import org.jetbrains.annotations.ApiStatus; + +import io.github.jamalam360.jamlib.JamLib; import org.jetbrains.annotations.Nullable; // 9minecraft and related sites often rename jars. // This class checks the manifest of a given class to see if it has been renamed. // For this to work, the jar's manifest file has to have a "JamLib-File-Name" attribute. -@ApiStatus.Internal public class JarRenamingChecker { private final List suspiciousJars = new ArrayList<>(); diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/JamLibPacket.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/JamLibPacket.java new file mode 100644 index 0000000..ad6f524 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/JamLibPacket.java @@ -0,0 +1,29 @@ +package io.github.jamalam360.jamlib.impl.fabric.network; + +import io.github.jamalam360.jamlib.JamLib; +import io.github.jamalam360.jamlib.api.network.PayloadType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.Identifier; + +public record JamLibPacket(PayloadType payloadType, RegistryFriendlyByteBuf payload) implements CustomPacketPayload { + public static final Identifier JAMLIB_PACKET_ID = JamLib.id("packet"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(JAMLIB_PACKET_ID); + public static final StreamCodec CODEC = StreamCodec.of( + (buf, packet) -> { + buf.writeIdentifier(packet.payloadType().id()); + buf.writeBytes(packet.payload()); + }, + (buf) -> { + Identifier payloadType = buf.readIdentifier(); + RegistryFriendlyByteBuf payload = new RegistryFriendlyByteBuf(buf.readBytes(buf.readableBytes()), buf.registryAccess()); + return new JamLibPacket(new PayloadType<>(payloadType), payload); + } + ); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/PlatformNetwork.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/PlatformNetwork.java new file mode 100644 index 0000000..45a72ac --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/PlatformNetwork.java @@ -0,0 +1,19 @@ +package io.github.jamalam360.jamlib.impl.fabric.network; + +import dev.architectury.injectables.annotations.ExpectPlatform; +import io.github.jamalam360.jamlib.JamLib; +import io.github.jamalam360.jamlib.api.network.NetworkPayloadType; +import io.github.jamalam360.jamlib.api.network.PayloadType; +import net.minecraft.server.level.ServerPlayer; + +public class PlatformNetwork { + @ExpectPlatform + public static void sendToServer(PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + JamLib.expectPlatform(); + } + + @ExpectPlatform + public static void sendToClient(ServerPlayer target, PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + JamLib.expectPlatform(); + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/mixin/event/ServerPlayerGameModeMixin.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/mixin/event/ServerPlayerGameModeMixin.java new file mode 100644 index 0000000..d5c9735 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/mixin/event/ServerPlayerGameModeMixin.java @@ -0,0 +1,31 @@ +package io.github.jamalam360.jamlib.impl.mixin.event; + +import io.github.jamalam360.jamlib.api.events.InteractionEvent; +import io.github.jamalam360.jamlib.api.events.core.EventResult; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ServerPlayerGameMode.class) +public abstract class ServerPlayerGameModeMixin { + @Inject( + method = "useItemOn", + at = @At("HEAD"), + cancellable = true + ) + private void jamlib$onInteractBlock(ServerPlayer player, Level level, ItemStack stack, InteractionHand hand, BlockHitResult hitResult, CallbackInfoReturnable cir) { + EventResult result = InteractionEvent.USE_BLOCK.invokeCancellable((ev) -> ev.onUseBlock(player, hand, hitResult.getBlockPos(), hitResult.getDirection())); + + if (result.wasCancelled()) { + cir.setReturnValue(result.getResult()); + } + } +} diff --git a/common/src/main/java/io/github/jamalam360/jamlib/impl/package-info.java b/common/src/main/java/io/github/jamalam360/jamlib/impl/package-info.java new file mode 100644 index 0000000..b398e33 --- /dev/null +++ b/common/src/main/java/io/github/jamalam360/jamlib/impl/package-info.java @@ -0,0 +1,4 @@ +@ApiStatus.Internal +package io.github.jamalam360.jamlib.impl; + +import org.jetbrains.annotations.ApiStatus; diff --git a/common/src/main/resources/jamlib.mixins.json b/common/src/main/resources/jamlib.mixins.json index dd9baf5..b1a8d79 100644 --- a/common/src/main/resources/jamlib.mixins.json +++ b/common/src/main/resources/jamlib.mixins.json @@ -1,9 +1,10 @@ { "required": true, "minVersion": "0.8", - "package": "io.github.jamalam360.jamlib.mixin", + "package": "io.github.jamalam360.jamlib.impl.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "event.ServerPlayerGameModeMixin" ], "client": [ ], diff --git a/fabric/build.gradle b/fabric/build.gradle index 63d8cc3..02b6fc2 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -23,7 +23,6 @@ configurations { dependencies { modImplementation libs.fabric.loader modImplementation libs.fabric.api - modImplementation libs.architectury.fabric modImplementation libs.modmenu api libs.jankson include libs.jankson @@ -48,11 +47,6 @@ if (System.getenv("CURSEFORGE_API_KEY") != null && System.getenv("MODRINTH_API_K curseforge = "fabric-api" modrinth = "fabric-api" } - - depends { - curseforge = "architectury-api" - modrinth = "architectury-api" - } } @@ -95,7 +89,6 @@ processResources { "version" : project.version, "minecraft_version" : project.minimum_minecraft_version, "fabric_api_version" : project.minimum_fabric_api_version, - "architectury_version": project.minimum_architectury_api_version ] filesMatching("fabric.mod.json") { diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/api/platform/fabric/PlatformImpl.java b/fabric/src/main/java/io/github/jamalam360/jamlib/api/platform/fabric/PlatformImpl.java new file mode 100644 index 0000000..9cfe109 --- /dev/null +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/api/platform/fabric/PlatformImpl.java @@ -0,0 +1,35 @@ +package io.github.jamalam360.jamlib.api.platform.fabric; + +import io.github.jamalam360.jamlib.api.platform.ModInfo; +import net.fabricmc.loader.api.FabricLoader; + +import java.nio.file.Path; +import java.util.Optional; + +public class PlatformImpl { + public static Optional getMod(String modId) { + return FabricLoader.getInstance() + .getModContainer(modId) + .map(m -> new ModInfo(m.getMetadata().getId(), m.getMetadata().getName(), m.getMetadata().getVersion().getFriendlyString())); + } + + public static boolean isForge() { + return false; + } + + public static boolean isNeoForge() { + return false; + } + + public static boolean isDevelopmentEnvironment() { + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } + + public static Path getGameFolder() { + return FabricLoader.getInstance().getGameDir().toAbsolutePath(); + } + + public static Path getConfigFolder() { + return FabricLoader.getInstance().getConfigDir().toAbsolutePath(); + } +} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/JamLibClientFabric.java b/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/JamLibClientFabric.java deleted file mode 100644 index e4c25e8..0000000 --- a/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/JamLibClientFabric.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.jamalam360.jamlib.fabric; - -import io.github.jamalam360.jamlib.client.JamLibClient; -import net.fabricmc.api.ClientModInitializer; - -public class JamLibClientFabric implements ClientModInitializer { - @Override - public void onInitializeClient() { - JamLibClient.init(); - } -} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/JamLibFabric.java b/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/JamLibFabric.java deleted file mode 100644 index 4e3a148..0000000 --- a/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/JamLibFabric.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.jamalam360.jamlib.fabric; - -import io.github.jamalam360.jamlib.JamLib; -import net.fabricmc.api.ModInitializer; - -public class JamLibFabric implements ModInitializer { - - @Override - public void onInitialize() { - JamLib.init(); - } -} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java new file mode 100644 index 0000000..d879e75 --- /dev/null +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibClientFabric.java @@ -0,0 +1,16 @@ +package io.github.jamalam360.jamlib.impl.fabric; + +import io.github.jamalam360.jamlib.api.network.Network; +import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.client.impl.JamLibClient; +import io.github.jamalam360.jamlib.impl.fabric.network.JamLibPacket; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; + +public class JamLibClientFabric implements ClientModInitializer { + @Override + public void onInitializeClient() { + JamLibClient.init(); + ClientPlayNetworking.registerGlobalReceiver(JamLibPacket.TYPE, (payload, ctx) -> Network.receive(Network.Direction.CLIENT_BOUND, new NetworkContext(ctx.player()), payload)); + } +} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java new file mode 100644 index 0000000..79478aa --- /dev/null +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/JamLibFabric.java @@ -0,0 +1,20 @@ +package io.github.jamalam360.jamlib.impl.fabric; + +import io.github.jamalam360.jamlib.JamLib; +import io.github.jamalam360.jamlib.api.network.Network; +import io.github.jamalam360.jamlib.api.network.NetworkContext; +import io.github.jamalam360.jamlib.impl.fabric.network.JamLibPacket; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; + +public class JamLibFabric implements ModInitializer { + + @Override + public void onInitialize() { + JamLib.init(); + PayloadTypeRegistry.playC2S().register(JamLibPacket.TYPE, JamLibPacket.CODEC); + PayloadTypeRegistry.playS2C().register(JamLibPacket.TYPE, JamLibPacket.CODEC); + ServerPlayNetworking.registerGlobalReceiver(JamLibPacket.TYPE, (payload, ctx) -> Network.receive(Network.Direction.SERVER_BOUND, new NetworkContext(ctx.player()), payload)); + } +} diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/config/ModMenuCompatibility.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/config/ModMenuCompatibility.java similarity index 83% rename from fabric/src/main/java/io/github/jamalam360/jamlib/fabric/config/ModMenuCompatibility.java rename to fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/config/ModMenuCompatibility.java index d8fa8d1..65aac63 100644 --- a/fabric/src/main/java/io/github/jamalam360/jamlib/fabric/config/ModMenuCompatibility.java +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/config/ModMenuCompatibility.java @@ -1,11 +1,11 @@ -package io.github.jamalam360.jamlib.fabric.config; +package io.github.jamalam360.jamlib.impl.fabric.config; import com.mojang.datafixers.util.Pair; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; -import io.github.jamalam360.jamlib.config.ConfigManager; -import io.github.jamalam360.jamlib.client.config.gui.ConfigScreen; -import io.github.jamalam360.jamlib.client.config.gui.SelectConfigScreen; +import io.github.jamalam360.jamlib.api.config.ConfigManager; +import io.github.jamalam360.jamlib.client.impl.config.ConfigScreen; +import io.github.jamalam360.jamlib.client.impl.config.SelectConfigScreen; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/fabric/PlatformNetworkImpl.java b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/fabric/PlatformNetworkImpl.java new file mode 100644 index 0000000..4fff80b --- /dev/null +++ b/fabric/src/main/java/io/github/jamalam360/jamlib/impl/fabric/network/fabric/PlatformNetworkImpl.java @@ -0,0 +1,32 @@ +package io.github.jamalam360.jamlib.impl.fabric.network.fabric; + +import io.github.jamalam360.jamlib.api.network.NetworkPayloadType; +import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.impl.fabric.network.JamLibPacket; +import io.netty.buffer.Unpooled; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; + +public class PlatformNetworkImpl { + public static void sendToServer(PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level == null) { + throw new IllegalStateException("Attempted to send a play phase packet before a level exists"); + } + + RegistryFriendlyByteBuf payloadData = new RegistryFriendlyByteBuf(Unpooled.buffer(), minecraft.level.registryAccess()); + serializer.serialize(payload, payloadData); + JamLibPacket packet = new JamLibPacket(payloadType, payloadData); + ClientPlayNetworking.send(packet); + } + + public static void sendToClient(ServerPlayer target, PayloadType payloadType, NetworkPayloadType.Serializer serializer, T payload) { + RegistryFriendlyByteBuf payloadData = new RegistryFriendlyByteBuf(Unpooled.buffer(), target.level().registryAccess()); + serializer.serialize(payload, payloadData); + JamLibPacket packet = new JamLibPacket(payloadType, payloadData); + ServerPlayNetworking.send(target, packet); + } +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 5b908fd..9a0af5b 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -17,13 +17,13 @@ "environment": "*", "entrypoints": { "main": [ - "io.github.jamalam360.jamlib.fabric.JamLibFabric" + "io.github.jamalam360.jamlib.impl.fabric.JamLibFabric" ], "client": [ - "io.github.jamalam360.jamlib.fabric.JamLibClientFabric" + "io.github.jamalam360.jamlib.impl.fabric.JamLibClientFabric" ], "modmenu": [ - "io.github.jamalam360.jamlib.fabric.config.ModMenuCompatibility" + "io.github.jamalam360.jamlib.impl.fabric.config.ModMenuCompatibility" ] }, "mixins": [ @@ -32,7 +32,6 @@ ], "depends": { "fabric-api": ">=${fabric_api_version}", - "minecraft": ">=${minecraft_version}", - "architectury": ">=${architectury_version}" + "minecraft": ">=${minecraft_version}" } } diff --git a/gradle.properties b/gradle.properties index 98e11e8..db25b35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,11 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false org.gradle.parallel=true -version=1.3.6+1.21.11 +version=2.0.0+1.21.11 minecraft_version=1.21.11 additional_minecraft_versions= minimum_minecraft_version=1.21.11 -minimum_architectury_api_version=19.0.1 minimum_fabric_api_version=0.134.0+1.21.9 branch=main diff --git a/libs.versions.toml b/libs.versions.toml index 6daf1e0..df1d205 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -21,8 +21,6 @@ jankson = "1.2.3" [libraries] architectury-common = { module = "dev.architectury:architectury", version.ref = "architectury" } -architectury-fabric = { module = "dev.architectury:architectury-fabric", version.ref = "architectury" } -architectury-neoforge = { module = "dev.architectury:architectury-neoforge", version.ref = "architectury" } neoforge = { module = "net.neoforged:neoforge", version.ref = "neoforge" } diff --git a/neoforge/build.gradle b/neoforge/build.gradle index fe22033..cce2d76 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -29,7 +29,6 @@ repositories { dependencies { neoForge libs.neoforge - modImplementation libs.architectury.neoforge api libs.jankson include libs.jankson forgeRuntimeLibrary libs.jankson @@ -49,14 +48,6 @@ if (System.getenv("CURSEFORGE_API_KEY") != null && System.getenv("MODRINTH_API_K mainPublication tasks.remapJar - relations { - depends { - curseforge = "architectury-api" - modrinth = "architectury-api" - } - } - - curseforge { token = System.getenv("CURSEFORGE_API_KEY") id = "623764" @@ -96,7 +87,6 @@ processResources { "version" : project.version, "minecraft_version" : project.minimum_minecraft_version, "neoforge_version" : project.minimum_minecraft_version.substring(2), - "architectury_version": project.minimum_architectury_api_version ] filesMatching("META-INF/neoforge.mods.toml") { diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/api/platform/neoforge/PlatformImpl.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/api/platform/neoforge/PlatformImpl.java new file mode 100644 index 0000000..6dbc67d --- /dev/null +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/api/platform/neoforge/PlatformImpl.java @@ -0,0 +1,37 @@ +package io.github.jamalam360.jamlib.api.platform.neoforge; + +import io.github.jamalam360.jamlib.api.platform.ModInfo; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.fml.loading.FMLPaths; + +import java.nio.file.Path; +import java.util.Optional; + +public class PlatformImpl { + public static Optional getMod(String modId) { + return ModList.get() + .getModContainerById(modId) + .map(m -> new ModInfo(m.getModId(), m.getModInfo().getDisplayName(), m.getModInfo().getVersion().toString())); + } + + public static boolean isForge() { + return false; + } + + public static boolean isNeoForge() { + return true; + } + + public static boolean isDevelopmentEnvironment() { + return !FMLEnvironment.isProduction(); + } + + public static Path getGameFolder() { + return FMLPaths.GAMEDIR.get().toAbsolutePath(); + } + + public static Path getConfigFolder() { + return FMLPaths.CONFIGDIR.get().toAbsolutePath(); + } +} diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/neoforge/JamLibNeoForge.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java similarity index 78% rename from neoforge/src/main/java/io/github/jamalam360/jamlib/neoforge/JamLibNeoForge.java rename to neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java index 1616adc..947c3cc 100644 --- a/neoforge/src/main/java/io/github/jamalam360/jamlib/neoforge/JamLibNeoForge.java +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForge.java @@ -1,4 +1,4 @@ -package io.github.jamalam360.jamlib.neoforge; +package io.github.jamalam360.jamlib.impl.neoforge; import io.github.jamalam360.jamlib.JamLib; import net.neoforged.fml.common.Mod; diff --git a/neoforge/src/main/java/io/github/jamalam360/jamlib/neoforge/JamLibNeoForgeClient.java b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java similarity index 81% rename from neoforge/src/main/java/io/github/jamalam360/jamlib/neoforge/JamLibNeoForgeClient.java rename to neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java index 0669728..fb2b143 100644 --- a/neoforge/src/main/java/io/github/jamalam360/jamlib/neoforge/JamLibNeoForgeClient.java +++ b/neoforge/src/main/java/io/github/jamalam360/jamlib/impl/neoforge/JamLibNeoForgeClient.java @@ -1,10 +1,10 @@ -package io.github.jamalam360.jamlib.neoforge; +package io.github.jamalam360.jamlib.impl.neoforge; import io.github.jamalam360.jamlib.JamLib; -import io.github.jamalam360.jamlib.client.JamLibClient; -import io.github.jamalam360.jamlib.config.ConfigManager; -import io.github.jamalam360.jamlib.client.config.gui.ConfigScreen; -import io.github.jamalam360.jamlib.client.config.gui.SelectConfigScreen; +import io.github.jamalam360.jamlib.api.config.ConfigManager; +import io.github.jamalam360.jamlib.client.impl.JamLibClient; +import io.github.jamalam360.jamlib.client.impl.config.ConfigScreen; +import io.github.jamalam360.jamlib.client.impl.config.SelectConfigScreen; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModList; diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 0ca5ebd..79ba673 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -26,13 +26,6 @@ versionRange = "[${minecraft_version},)" ordering = "NONE" side = "BOTH" -[[dependencies.jamlib]] -modId = "architectury" -type = "required" -versionRange = "[${architectury_version},)" -ordering = "AFTER" -side = "BOTH" - [[mixins]] config = "jamlib.mixins.json" diff --git a/testmod-common/build.gradle b/testmod-common/build.gradle index 91e4cb0..ea808a8 100644 --- a/testmod-common/build.gradle +++ b/testmod-common/build.gradle @@ -1,6 +1,5 @@ dependencies { modImplementation libs.fabric.loader - modImplementation libs.architectury.common implementation project(path: ":common", configuration: "namedElements") } diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java index 7512cb1..d2a1d09 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestMod.java @@ -1,11 +1,17 @@ package io.github.jamalam360.testmod; -import io.github.jamalam360.jamlib.JamLibPlatform; -import io.github.jamalam360.jamlib.config.ConfigManager; -import io.github.jamalam360.jamlib.events.client.ClientPlayLifecycleEvents; +import io.github.jamalam360.jamlib.api.events.InteractionEvent; +import io.github.jamalam360.jamlib.api.events.core.EventResult; +import io.github.jamalam360.jamlib.api.network.Network; +import io.github.jamalam360.jamlib.api.platform.Platform; +import io.github.jamalam360.jamlib.api.config.ConfigManager; +import io.github.jamalam360.jamlib.client.api.events.ClientPlayLifecycleEvents; import io.github.jamalam360.testmod.config.NestedConfigChild; import io.github.jamalam360.testmod.config.QuickerConnectButtonTestConfig; import io.github.jamalam360.testmod.config.TestConfig; +import io.github.jamalam360.testmod.network.PotatoPacket; +import net.minecraft.resources.Identifier; +import net.minecraft.world.InteractionResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,11 +26,34 @@ public class TestMod { public static final ConfigManager NESTED_CONFIG = new ConfigManager<>(MOD_ID, "nested", NestedConfigChild.class); public static void init() { - LOGGER.info("Initializing JamLib Test Mod on {}", JamLibPlatform.getPlatform()); + LOGGER.info("Initializing JamLib Test Mod on {}", Platform.getModLoader()); + LOGGER.info("Fabric Loader: {}", Platform.getMod("fabricloader")); System.out.println(CONFIG_MANAGER.get()); System.out.println(QCB_CONFIG.get()); - ClientPlayLifecycleEvents.JOIN.register(client -> LOGGER.info("Joined server!")); - ClientPlayLifecycleEvents.DISCONNECT.register(client -> LOGGER.info("Left server!")); + ClientPlayLifecycleEvents.JOIN.listen(client -> LOGGER.info("Joined server!")); + ClientPlayLifecycleEvents.DISCONNECT.listen(client -> LOGGER.info("Left server!")); + InteractionEvent.USE_BLOCK.listen(((player, hand, pos, direction) -> { + LOGGER.info("Used block!"); + + if (player.getRandom().nextBoolean() && !player.level().isClientSide()) { + LOGGER.info("Cancelling interaction"); + return EventResult.cancel(InteractionResult.PASS); + } else { + return EventResult.pass(); + } + })); + + Network.registerPayloadType(PotatoPacket.TYPE, PotatoPacket.INSTANCE); + +// DeferredRegister reg = DeferredRegister.create(MOD_ID, Registries.ITEM); +// reg.register(id("potato"), () -> new PacketPotatoItem(new Item.Properties().setId( +// ResourceKey.create(Registries.ITEM, id("potato")) +// ))); +// reg.register(); + } + + public static Identifier id(String path) { + return Identifier.fromNamespaceAndPath(MOD_ID, path); } } diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java new file mode 100644 index 0000000..8360dd5 --- /dev/null +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/TestModClient.java @@ -0,0 +1,12 @@ +package io.github.jamalam360.testmod; + +import io.github.jamalam360.jamlib.api.network.Network; +import io.github.jamalam360.testmod.network.PotatoPacket; + +public class TestModClient { + public static void init() { + Network.registerHandler(Network.Direction.CLIENT_BOUND, PotatoPacket.TYPE, (ctx, payload) -> { + TestMod.LOGGER.info("Received potato packet with random: {}", payload.random()); + }); + } +} diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/config/QuickerConnectButtonTestConfig.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/config/QuickerConnectButtonTestConfig.java index 151fdd8..50e1a79 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/config/QuickerConnectButtonTestConfig.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/config/QuickerConnectButtonTestConfig.java @@ -1,9 +1,9 @@ package io.github.jamalam360.testmod.config; import blue.endless.jankson.Comment; -import io.github.jamalam360.jamlib.config.ConfigExtensions; -import io.github.jamalam360.jamlib.config.MatchesRegex; -import io.github.jamalam360.jamlib.config.WithinRange; +import io.github.jamalam360.jamlib.api.config.ConfigExtensions; +import io.github.jamalam360.jamlib.api.config.MatchesRegex; +import io.github.jamalam360.jamlib.api.config.WithinRange; import java.util.List; import net.minecraft.network.chat.Component; diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/config/TestConfig.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/config/TestConfig.java index 7af2f33..ecd0eda 100644 --- a/testmod-common/src/main/java/io/github/jamalam360/testmod/config/TestConfig.java +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/config/TestConfig.java @@ -1,13 +1,13 @@ package io.github.jamalam360.testmod.config; import blue.endless.jankson.Comment; -import io.github.jamalam360.jamlib.config.ConfigExtensions; -import io.github.jamalam360.jamlib.config.ConfigManager; -import io.github.jamalam360.jamlib.config.HiddenInGui; -import io.github.jamalam360.jamlib.config.MatchesRegex; -import io.github.jamalam360.jamlib.config.RequiresRestart; -import io.github.jamalam360.jamlib.config.Slider; -import io.github.jamalam360.jamlib.config.WithinRange; +import io.github.jamalam360.jamlib.api.config.ConfigExtensions; +import io.github.jamalam360.jamlib.api.config.ConfigManager; +import io.github.jamalam360.jamlib.api.config.HiddenInGui; +import io.github.jamalam360.jamlib.api.config.MatchesRegex; +import io.github.jamalam360.jamlib.api.config.RequiresRestart; +import io.github.jamalam360.jamlib.api.config.Slider; +import io.github.jamalam360.jamlib.api.config.WithinRange; import java.util.ArrayList; import java.util.List; diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java new file mode 100644 index 0000000..4449107 --- /dev/null +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/item/PacketPotatoItem.java @@ -0,0 +1,31 @@ +package io.github.jamalam360.testmod.item; + +import io.github.jamalam360.jamlib.api.network.Network; +import io.github.jamalam360.testmod.TestMod; +import io.github.jamalam360.testmod.network.PotatoPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; + +import java.util.Random; + +public class PacketPotatoItem extends Item { + public PacketPotatoItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResult use(Level level, Player player, InteractionHand hand) { + if (level.isClientSide()) { + return InteractionResult.PASS; + } + + int random = new Random().nextInt(3, 10); + TestMod.LOGGER.info("On client: {}", random); + Network.sendToClient((ServerPlayer) player, PotatoPacket.TYPE, new PotatoPacket.Payload(random)); + return InteractionResult.SUCCESS; + } +} diff --git a/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java b/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java new file mode 100644 index 0000000..ab3dfd8 --- /dev/null +++ b/testmod-common/src/main/java/io/github/jamalam360/testmod/network/PotatoPacket.java @@ -0,0 +1,22 @@ +package io.github.jamalam360.testmod.network; + +import io.github.jamalam360.jamlib.api.network.PayloadType; +import io.github.jamalam360.jamlib.api.network.StreamCodecNetworkPayloadType; +import io.github.jamalam360.testmod.TestMod; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; + +public class PotatoPacket implements StreamCodecNetworkPayloadType { + public static final PotatoPacket INSTANCE = new PotatoPacket(); + public static final PayloadType TYPE = new PayloadType<>(TestMod.id("potato")); + + @Override + public StreamCodec getStreamCodec() { + return StreamCodec.of( + (buf, payload) -> buf.writeInt(payload.random()), + (buf) -> new Payload(buf.readInt()) + ); + } + + public record Payload(int random) {} +} diff --git a/testmod-fabric/build.gradle b/testmod-fabric/build.gradle index 0a155db..f162b7e 100644 --- a/testmod-fabric/build.gradle +++ b/testmod-fabric/build.gradle @@ -22,7 +22,6 @@ configurations { dependencies { modImplementation libs.fabric.loader modImplementation libs.fabric.api - modImplementation libs.architectury.fabric modRuntimeOnly libs.modmenu implementation project(path: ":fabric", configuration: "namedElements") diff --git a/testmod-fabric/src/main/java/io/github/jamalam360/testmod/fabric/TestModClientFabric.java b/testmod-fabric/src/main/java/io/github/jamalam360/testmod/fabric/TestModClientFabric.java new file mode 100644 index 0000000..b18d521 --- /dev/null +++ b/testmod-fabric/src/main/java/io/github/jamalam360/testmod/fabric/TestModClientFabric.java @@ -0,0 +1,11 @@ +package io.github.jamalam360.testmod.fabric; + +import io.github.jamalam360.testmod.TestModClient; +import net.fabricmc.api.ClientModInitializer; + +public class TestModClientFabric implements ClientModInitializer { + @Override + public void onInitializeClient() { + TestModClient.init(); + } +} diff --git a/testmod-fabric/src/main/resources/fabric.mod.json b/testmod-fabric/src/main/resources/fabric.mod.json index 6a54dc5..a9da59c 100644 --- a/testmod-fabric/src/main/resources/fabric.mod.json +++ b/testmod-fabric/src/main/resources/fabric.mod.json @@ -18,6 +18,9 @@ "entrypoints": { "main": [ "io.github.jamalam360.testmod.fabric.TestModFabric" + ], + "client": [ + "io.github.jamalam360.testmod.fabric.TestModClientFabric" ] }, "mixins": [ @@ -26,7 +29,6 @@ "fabricloader": ">=0.14", "fabric": "*", "minecraft": ">=1.20", - "java": ">=17", - "architectury": ">=9.1.12" + "java": ">=17" } } diff --git a/testmod-neoforge/build.gradle b/testmod-neoforge/build.gradle index f29996f..a032885 100644 --- a/testmod-neoforge/build.gradle +++ b/testmod-neoforge/build.gradle @@ -32,7 +32,6 @@ repositories { dependencies { neoForge libs.neoforge - modImplementation libs.architectury.neoforge forgeRuntimeLibrary libs.jankson implementation project(path: ":neoforge", configuration: "namedElements") diff --git a/testmod-neoforge/src/main/resources/META-INF/neoforge.mods.toml b/testmod-neoforge/src/main/resources/META-INF/neoforge.mods.toml index eadb15b..a58dd74 100644 --- a/testmod-neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/testmod-neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -26,9 +26,3 @@ versionRange = "[1.20.2,)" ordering = "NONE" side = "BOTH" -[[dependencies.testmod]] -modId = "architectury" -type = "required" -versionRange = "[9.1.12,)" -ordering = "AFTER" -side = "BOTH"