diff --git a/build.gradle b/build.gradle index 7e86e00f..06a4950f 100644 --- a/build.gradle +++ b/build.gradle @@ -60,6 +60,9 @@ dependencies { implementation 'li.cil.sedna:sedna:0.0.1+99' implementation 'li.cil.sedna:sedna-buildroot:0.0.1+15' + compileOnly fg.deobf("li.cil.markdown_manual:MarkdownManual:MC${minecraft_version}-Forge-${manual_version}:api") + runtimeOnly fg.deobf("li.cil.markdown_manual:MarkdownManual:MC${minecraft_version}-Forge-${manual_version}") + compileOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}:api") runtimeOnly fg.deobf("mezz.jei:jei-${jei_minecraft_version}:${jei_version}") @@ -89,7 +92,8 @@ processResources { 'mod_issues_url' : mod_issues_url, 'forge_version_min' : forge_version_min, 'minecraft_version_min': minecraft_version_min, - 'oc2_sedna_version_min': oc2_sedna_version_min + 'oc2_sedna_version_min': oc2_sedna_version_min, + 'manual_version_min' : manual_version, ]) } } @@ -142,11 +146,9 @@ minecraft { } task copyGeneratedResources(type: Copy) { - dependsOn { runData } from "src/generated" into "src/main" exclude "resources/.cache" - exclude "resources/assets/oc2/models/block" } jar { @@ -179,6 +181,7 @@ artifacts { publishing { publications { mavenJava(MavenPublication) { + version "MC${minecraft_version}-Forge-${version}" artifact jar artifact apiJar } diff --git a/gradle.properties b/gradle.properties index 7fe82b3c..461323af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,6 +20,7 @@ version_minor=0 version_patch=1 oc2_sedna_version_min=0.0.1 +manual_version=1.0.1+ jei_minecraft_version=1.16.4 jei_version=7.6.1.71 diff --git a/src/main/java/li/cil/oc2/client/manual/Manuals.java b/src/main/java/li/cil/oc2/client/manual/Manuals.java new file mode 100644 index 00000000..caf8d403 --- /dev/null +++ b/src/main/java/li/cil/oc2/client/manual/Manuals.java @@ -0,0 +1,55 @@ +package li.cil.oc2.client.manual; + +import li.cil.manual.api.ManualModel; +import li.cil.manual.api.Tab; +import li.cil.manual.api.prefab.Manual; +import li.cil.manual.api.prefab.provider.NamespaceContentProvider; +import li.cil.manual.api.prefab.provider.NamespacePathProvider; +import li.cil.manual.api.prefab.tab.ItemStackTab; +import li.cil.manual.api.prefab.tab.TextureTab; +import li.cil.manual.api.provider.ContentProvider; +import li.cil.manual.api.provider.PathProvider; +import li.cil.oc2.api.API; +import li.cil.oc2.common.block.Blocks; +import li.cil.oc2.common.item.Items; +import li.cil.oc2.common.util.RegistryUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; + +@OnlyIn(Dist.CLIENT) +public final class Manuals { + private static final DeferredRegister MANUALS = RegistryUtils.create(ManualModel.class); + + /////////////////////////////////////////////////////////////////// + + public static final RegistryObject MANUAL = MANUALS.register("manual", Manual::new); + + /////////////////////////////////////////////////////////////////// + + public static void initialize() { + final DeferredRegister pathProviders = RegistryUtils.create(PathProvider.class); + final DeferredRegister contentProviders = RegistryUtils.create(ContentProvider.class); + final DeferredRegister tabs = RegistryUtils.create(Tab.class); + + pathProviders.register("path_provider", () -> new NamespacePathProvider(API.MOD_ID)); + contentProviders.register("content_provider", () -> new NamespaceContentProvider(API.MOD_ID, "doc")); + + tabs.register("home", () -> new TextureTab( + ManualModel.LANGUAGE_KEY + "/index.md", + new TranslationTextComponent("manual." + API.MOD_ID + ".home"), + new ResourceLocation(API.MOD_ID, "textures/gui/manual/home.png"))); + tabs.register("blocks", () -> new ItemStackTab( + ManualModel.LANGUAGE_KEY + "/block/index.md", + new TranslationTextComponent("manual." + API.MOD_ID + ".blocks"), + new ItemStack(Blocks.COMPUTER.get()))); + tabs.register("modules", () -> new ItemStackTab( + ManualModel.LANGUAGE_KEY + "/item/index.md", + new TranslationTextComponent("manual." + API.MOD_ID + ".items"), + new ItemStack(Items.TRANSISTOR.get()))); + } +} diff --git a/src/main/java/li/cil/oc2/client/manual/ModManualScreenStyle.java b/src/main/java/li/cil/oc2/client/manual/ModManualScreenStyle.java new file mode 100644 index 00000000..288d9c39 --- /dev/null +++ b/src/main/java/li/cil/oc2/client/manual/ModManualScreenStyle.java @@ -0,0 +1,58 @@ +package li.cil.oc2.client.manual; + +import li.cil.manual.api.ManualScreenStyle; +import li.cil.oc2.api.API; +import net.minecraft.client.renderer.Rectangle2d; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public final class ModManualScreenStyle implements ManualScreenStyle { + public static final ManualScreenStyle INSTANCE = new ModManualScreenStyle(); + + @Override + public ResourceLocation getWindowBackground() { + return new ResourceLocation(API.MOD_ID, "textures/gui/manual/manual.png"); + } + + @Override + public ResourceLocation getScrollButtonTexture() { + return new ResourceLocation(API.MOD_ID, "textures/gui/manual/scroll_button.png"); + } + + @Override + public ResourceLocation getTabButtonTexture() { + return new ResourceLocation(API.MOD_ID, "textures/gui/manual/tab_button.png"); + } + + @Override + public Rectangle2d getDocumentRect() { + return new Rectangle2d(12, 12, 216, 232); + } + + @Override + public Rectangle2d getScrollBarRect() { + return new Rectangle2d(236, 8, 12, 240); + } + + @Override + public Rectangle2d getScrollButtonRect() { + return new Rectangle2d(0, 0, 12, 12); + } + + @Override + public Rectangle2d getTabAreaRect() { + return new Rectangle2d(-52, 12, 52, 232); + } + + @Override + public Rectangle2d getTabRect() { + return new Rectangle2d(0, 0, 64, 24); + } + + @Override + public int getTabOverlap() { + return 0; + } +} diff --git a/src/main/java/li/cil/oc2/client/manual/ModManualStyle.java b/src/main/java/li/cil/oc2/client/manual/ModManualStyle.java new file mode 100644 index 00000000..cc0dfd64 --- /dev/null +++ b/src/main/java/li/cil/oc2/client/manual/ModManualStyle.java @@ -0,0 +1,54 @@ +package li.cil.oc2.client.manual; + +import li.cil.manual.api.ManualStyle; +import li.cil.manual.api.render.FontRenderer; +import li.cil.oc2.client.renderer.font.TerminalFontRenderer; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.SoundEvents; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public final class ModManualStyle implements ManualStyle { + public static final ManualStyle INSTANCE = new ModManualStyle(); + + @Override + public int getRegularTextColor() { + return 0xFFDDDDDD; + } + + @Override + public int getMonospaceTextColor() { + return 0xFF37FF99; + } + + @Override + public int getRegularLinkColor() { + return 0xFF9CC6E7; + } + + @Override + public int getHoveredLinkColor() { + return 0xFFBADCF7; + } + + @Override + public int getRegularDeadLinkColor() { + return 0xFFFF3755; + } + + @Override + public int getHoveredDeadLinkColor() { + return 0xFFFF8497; + } + + @Override + public FontRenderer getMonospaceFont() { + return TerminalFontRenderer.INSTANCE; + } + + @Override + public SoundEvent getPageChangeSound() { + return SoundEvents.UI_BUTTON_CLICK; + } +} diff --git a/src/main/java/li/cil/oc2/client/manual/package-info.java b/src/main/java/li/cil/oc2/client/manual/package-info.java new file mode 100644 index 00000000..ca483892 --- /dev/null +++ b/src/main/java/li/cil/oc2/client/manual/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package li.cil.oc2.client.manual; + +import mcp.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/li/cil/oc2/client/renderer/font/TerminalFontRenderer.java b/src/main/java/li/cil/oc2/client/renderer/font/TerminalFontRenderer.java new file mode 100644 index 00000000..e42d0706 --- /dev/null +++ b/src/main/java/li/cil/oc2/client/renderer/font/TerminalFontRenderer.java @@ -0,0 +1,49 @@ +package li.cil.oc2.client.renderer.font; + +import li.cil.manual.api.prefab.renderer.BitmapFontRenderer; +import li.cil.manual.api.render.FontRenderer; +import li.cil.oc2.api.API; +import li.cil.oc2.common.vm.Terminal; +import net.minecraft.util.ResourceLocation; + +public final class TerminalFontRenderer extends BitmapFontRenderer { + public static final FontRenderer INSTANCE = new TerminalFontRenderer(); + + private static final ResourceLocation LOCATION_FONT_TEXTURE = new ResourceLocation(API.MOD_ID, "textures/font/terminus_simple.png"); + private static final String CHARS = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; + + @Override + protected CharSequence getCharacters() { + return CHARS; + } + + @Override + protected ResourceLocation getTextureLocation() { + return LOCATION_FONT_TEXTURE; + } + + @Override + protected int getResolution() { + return 128; + } + + @Override + protected int getGapU() { + return 0; + } + + @Override + protected int getGapV() { + return 0; + } + + @Override + protected int charWidth() { + return Terminal.CHAR_WIDTH; + } + + @Override + public int lineHeight() { + return Terminal.CHAR_HEIGHT; + } +} diff --git a/src/main/java/li/cil/oc2/client/renderer/font/package-info.java b/src/main/java/li/cil/oc2/client/renderer/font/package-info.java new file mode 100644 index 00000000..03728289 --- /dev/null +++ b/src/main/java/li/cil/oc2/client/renderer/font/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package li.cil.oc2.client.renderer.font; + +import mcp.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/li/cil/oc2/common/Main.java b/src/main/java/li/cil/oc2/common/Main.java index dacacc93..a05d8bd5 100644 --- a/src/main/java/li/cil/oc2/common/Main.java +++ b/src/main/java/li/cil/oc2/common/Main.java @@ -3,6 +3,7 @@ package li.cil.oc2.common; import li.cil.ceres.Ceres; import li.cil.oc2.api.API; import li.cil.oc2.client.ClientSetup; +import li.cil.oc2.client.manual.Manuals; import li.cil.oc2.common.block.Blocks; import li.cil.oc2.common.bus.device.DeviceTypes; import li.cil.oc2.common.bus.device.data.BlockDeviceDataRegistration; @@ -16,6 +17,7 @@ import li.cil.oc2.common.serialization.serializers.Serializers; import li.cil.oc2.common.tags.BlockTags; import li.cil.oc2.common.tags.ItemTags; import li.cil.oc2.common.tileentity.TileEntities; +import li.cil.oc2.common.util.RegistryUtils; import li.cil.oc2.common.util.SoundEvents; import li.cil.sedna.Sedna; import net.minecraftforge.api.distmarker.Dist; @@ -50,6 +52,8 @@ public final class Main { BlockDeviceDataRegistration.initialize(); Firmwares.initialize(); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> Manuals::initialize); + RegistryUtils.finish(); FMLJavaModLoadingContext.get().getModEventBus().register(CommonSetup.class); diff --git a/src/main/java/li/cil/oc2/common/item/Items.java b/src/main/java/li/cil/oc2/common/item/Items.java index ad42037c..868753fb 100644 --- a/src/main/java/li/cil/oc2/common/item/Items.java +++ b/src/main/java/li/cil/oc2/common/item/Items.java @@ -33,6 +33,7 @@ public final class Items { /////////////////////////////////////////////////////////////////// public static final RegistryObject WRENCH = register("wrench", WrenchItem::new); + public static final RegistryObject MANUAL = register("manual", ManualItem::new); public static final RegistryObject NETWORK_CABLE = register("network_cable", NetworkCableItem::new); public static final RegistryObject ROBOT = register("robot", RobotItem::new); diff --git a/src/main/java/li/cil/oc2/common/item/ManualItem.java b/src/main/java/li/cil/oc2/common/item/ManualItem.java new file mode 100644 index 00000000..0c2d51c2 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/item/ManualItem.java @@ -0,0 +1,53 @@ +package li.cil.oc2.common.item; + +import li.cil.manual.api.ManualModel; +import li.cil.manual.api.ManualScreenStyle; +import li.cil.manual.api.ManualStyle; +import li.cil.manual.api.prefab.item.AbstractManualItem; +import li.cil.oc2.client.manual.Manuals; +import li.cil.oc2.client.manual.ModManualScreenStyle; +import li.cil.oc2.client.manual.ModManualStyle; +import li.cil.oc2.common.util.TooltipUtils; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nullable; +import java.util.List; + +public final class ManualItem extends AbstractManualItem { + public ManualItem() { + super(new Properties().tab(ItemGroup.COMMON)); + } + + /////////////////////////////////////////////////////////////////// + + @OnlyIn(Dist.CLIENT) + @Override + public void appendHoverText(final ItemStack stack, @Nullable final World world, final List tooltip, final ITooltipFlag flag) { + super.appendHoverText(stack, world, tooltip, flag); + TooltipUtils.tryAddDescription(stack, tooltip); + } + + /////////////////////////////////////////////////////////////////// + + @Override + protected ManualModel getManualModel() { + return Manuals.MANUAL.get(); + } + + @OnlyIn(Dist.CLIENT) + @Override + protected ManualStyle getManualStyle() { + return ModManualStyle.INSTANCE; + } + + @OnlyIn(Dist.CLIENT) + @Override + protected ManualScreenStyle getScreenStyle() { + return ModManualScreenStyle.INSTANCE; + } +} diff --git a/src/main/java/li/cil/oc2/data/ModItemModelProvider.java b/src/main/java/li/cil/oc2/data/ModItemModelProvider.java index d1be7827..821f4f9e 100644 --- a/src/main/java/li/cil/oc2/data/ModItemModelProvider.java +++ b/src/main/java/li/cil/oc2/data/ModItemModelProvider.java @@ -19,6 +19,7 @@ public final class ModItemModelProvider extends ItemModelProvider { @Override protected void registerModels() { simple(Items.WRENCH); + simple(Items.MANUAL); simple(Items.NETWORK_CABLE); diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 9045c48f..c915d567 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -31,4 +31,9 @@ modId = "oc2-sedna" mandatory = true versionRange = "[${oc2_sedna_version_min},)" ordering = "NONE" -side = "BOTH" \ No newline at end of file +side = "BOTH" +[[dependencies.oc2]] +modId = "markdown_manual" +mandatory = true +versionRange = "[${manual_version_min},)" +side = "CLIENT" \ No newline at end of file diff --git a/src/main/resources/assets/oc2/doc/en_us/index.md b/src/main/resources/assets/oc2/doc/en_us/index.md new file mode 100644 index 00000000..3ef361d0 --- /dev/null +++ b/src/main/resources/assets/oc2/doc/en_us/index.md @@ -0,0 +1,15 @@ +# Manual +Content pending... + +- this is a list. lorem ipsum dolor sit amet and so on and so forth, just want to get a line break. +- end of list + +![block test](block:oc2:computer) + +Some `inline code` test. + +`local d = require('devices')` +`local r = d:find("redstone")` +`r:setRedstoneOutput("left", 15)` + +And finally, a [dead link](dead.md) and a [working one](index.md). diff --git a/src/main/resources/assets/oc2/lang/en_us.json b/src/main/resources/assets/oc2/lang/en_us.json index 75e4c6d6..2752a57a 100644 --- a/src/main/resources/assets/oc2/lang/en_us.json +++ b/src/main/resources/assets/oc2/lang/en_us.json @@ -17,6 +17,8 @@ "item.oc2.wrench": "Scrench", "item.oc2.wrench.desc": "Used to configure devices and to dismantle them (while sneaking).", + "item.oc2.manual": "Manual", + "item.oc2.manual.desc": "Obtain by using a book on a computer casing in the world.", "item.oc2.bus_interface": "Bus Interface", "item.oc2.bus_interface.desc": "Used to attach Bus Cables to external devices.", "item.oc2.network_cable": "Network Cable", @@ -66,6 +68,10 @@ "gui.oc2.file_chooser.confirm_button.overwrite": "Overwrite", "gui.oc2.file_chooser.cancel_button": "Cancel", + "manual.oc2.home": "Home", + "manual.oc2.blocks": "Blocks", + "manual.oc2.items": "Items", + "message.oc2.connector.error.full": "Cannot attach more cables.", "message.oc2.connector.error.too_far": "Distance between connectors is too large.", "message.oc2.connector.error.obstructed": "No clear line of sight between connectors.", diff --git a/src/main/resources/assets/oc2/models/item/manual.json b/src/main/resources/assets/oc2/models/item/manual.json new file mode 100644 index 00000000..450243b2 --- /dev/null +++ b/src/main/resources/assets/oc2/models/item/manual.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "oc2:item/manual" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/oc2/textures/font/terminus_simple.png b/src/main/resources/assets/oc2/textures/font/terminus_simple.png new file mode 100644 index 00000000..110e5a1b Binary files /dev/null and b/src/main/resources/assets/oc2/textures/font/terminus_simple.png differ diff --git a/src/main/resources/assets/oc2/textures/gui/manual/home.png b/src/main/resources/assets/oc2/textures/gui/manual/home.png new file mode 100644 index 00000000..fc2b64c2 Binary files /dev/null and b/src/main/resources/assets/oc2/textures/gui/manual/home.png differ diff --git a/src/main/resources/assets/oc2/textures/gui/manual/manual.png b/src/main/resources/assets/oc2/textures/gui/manual/manual.png new file mode 100644 index 00000000..107dbfee Binary files /dev/null and b/src/main/resources/assets/oc2/textures/gui/manual/manual.png differ diff --git a/src/main/resources/assets/oc2/textures/gui/manual/scroll_button.png b/src/main/resources/assets/oc2/textures/gui/manual/scroll_button.png new file mode 100644 index 00000000..03323244 Binary files /dev/null and b/src/main/resources/assets/oc2/textures/gui/manual/scroll_button.png differ diff --git a/src/main/resources/assets/oc2/textures/gui/manual/tab_button.png b/src/main/resources/assets/oc2/textures/gui/manual/tab_button.png new file mode 100644 index 00000000..d74d300f Binary files /dev/null and b/src/main/resources/assets/oc2/textures/gui/manual/tab_button.png differ diff --git a/src/main/resources/assets/oc2/textures/item/manual.png b/src/main/resources/assets/oc2/textures/item/manual.png new file mode 100644 index 00000000..2a9960f2 Binary files /dev/null and b/src/main/resources/assets/oc2/textures/item/manual.png differ