diff --git a/build.gradle b/build.gradle index 320aa9b2..2df87488 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,27 @@ buildscript { repositories { mavenCentral() - maven { url = "http://files.minecraftforge.net/maven" } - maven { url = "https://oss.sonatype.org/content/repositories/snapshots/" } + jcenter() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } } + + dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true } } + plugins { - id 'com.matthewprenger.cursegradle' version '1.1.2' - id "net.minecraftforge.gradle.forge" version "2.0.2" + id 'com.matthewprenger.cursegradle' version '1.2.0' } +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'idea' +apply plugin: 'eclipse' apply plugin: 'maven-publish' def build_number = 'CUSTOM' @@ -23,46 +31,96 @@ if (System.getenv('BUILD_NUMBER') != null) group = package_group archivesBaseName = mod_name -version = "${mc_version}-${mod_version}-${build_number}" +version = "${minecraft_version}-${mod_version}-${build_number}" repositories { maven { url = "http://dvs1.progwml6.com/files/maven" } } dependencies { - deobfCompile "mezz.jei:jei_${mc_version}:${jei_version}" + minecraft([ + group: "net.minecraftforge", + name: "forge", + version: "${project.minecraft_version}-${project.forge_version}" + ]) + compileOnly fg.deobf("mezz.jei:jei-${project.minecraft_version}:${project.jei_version}:api") //API for compile + runtimeOnly fg.deobf("mezz.jei:jei-${project.minecraft_version}:${project.jei_version}") //Full for runtime + //runtimeClasspath 'com.electronwill.night-config:hocon:3.6.2' +} + +sourceSets { + + main { + java { + srcDirs = ["$rootDir/src/main/java"] + } + resources { + srcDirs = [ + "$rootDir/src/main/resources" + ] + } + } } + minecraft { - version = "${mc_version}-${forge_version}" - runDir = "run" + mappings channel: "${project.mcp_channel}".toString(), version: "${project.mcp_mappings}".toString() + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + + runs { + client { + taskName 'runClient1' + main 'net.minecraftforge.userdev.LaunchTesting' + property 'forge.logging.console.level', 'debug' + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + workingDirectory project.file('run/client1').canonicalPath + + mods { + guideapi { + source sourceSets.main + } + } - replace "@VERSION@", project.version - replaceIn "GuideMod.java" - replace "@API_VERSION@", "${api_version}" - replaceIn "package-info.java" + } + server = { + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'debug' + workingDirectory project.file('run/server').canonicalPath + + mods { + guideapi { + source sourceSets.main + } + + } + } + } - if (project.hasProperty('mappings_version')) - mappings = project.mappings_version } + + processResources { - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version + inputs.property "version", project.mod_version from(sourceSets.main.resources.srcDirs) { - include '**/*.info' - include '**/*.properties' + include 'META-INF/mods.toml' - expand 'version': project.version, 'mcversion': project.minecraft.version + expand 'version': project.mod_version, 'mcversion': minecraft_version, 'forge_version': forge_version } + from(sourceSets.main.resources.srcDirs) { - exclude '**/*.info' - exclude '**/*.properties' + exclude 'META-INF/mods.toml' } } jar { + //Keep the jar as clean as possible + includeEmptyDirs = false + + from sourceSets.main.output.classesDirs + from sourceSets.main.output.resourcesDir + classifier = '' manifest.mainAttributes( "Built-By": System.getProperty('user.name'), @@ -73,15 +131,7 @@ jar { exclude 'amerifrance/guideapi/test/**/*' } -// API jar -task apiJar(type: Jar) { - from sourceSets.main.allSource - from sourceSets.main.output - include 'amerifrance/guideapi/api/**/*' - classifier = 'api' -} -tasks.build.dependsOn apiJar tasks.withType(JavaCompile) { task -> task.options.encoding = 'UTF-8' @@ -92,7 +142,6 @@ publishing { publications { mavenJava(MavenPublication) { artifact jar - artifact sourceJar } } repositories { @@ -140,6 +189,14 @@ curseforge { changelog = getChangelogText() releaseType = 'beta' - addArtifact sourceJar + } +} + +idea { + module { + for (String excludeDirName in ["run", "out", "logs", "gradle"]) { + File excludeDir = new File(projectDir, excludeDirName) + excludeDirs.add(excludeDir) + } } } diff --git a/gradle.properties b/gradle.properties index 4993b1f2..78c79a4e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,16 @@ +org.gradle.daemon=false +org.gradle.jvmargs=-Xmx3G + mod_name=Guide-API package_group=info.amerifrance.guideapi -mc_version=1.12 -forge_version=14.21.1.2443 -mappings_version=snapshot_20170819 +minecraft_version=1.14.4 +forge_version=28.2.0 +mcp_mappings=58-1.14.4 +mcp_channel=stable -mod_version=2.1.8 -api_version=2.0.0 +mod_version=2.2.0 +api_version=2.2.0 curse_id=228832 -jei_version=4.7.1.69 +jei_version=6.0.0.13 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1e9b8635..f5095af5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip diff --git a/src/main/java/amerifrance/guideapi/ConfigHandler.java b/src/main/java/amerifrance/guideapi/ConfigHandler.java deleted file mode 100644 index e2e6c16e..00000000 --- a/src/main/java/amerifrance/guideapi/ConfigHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -package amerifrance.guideapi; - -import amerifrance.guideapi.api.GuideAPI; -import amerifrance.guideapi.api.impl.Book; -import com.google.common.collect.Maps; -import net.minecraftforge.common.config.Configuration; - -import java.io.File; -import java.util.Map; - -public class ConfigHandler { - - public static final Map SPAWN_BOOKS = Maps.newHashMap(); - - public static Configuration config; - - // Settings - public static boolean enableLogging; - public static boolean canSpawnWithBooks; - - public static void init(File file) { - config = new Configuration(file); - syncConfig(); - } - - public static void syncConfig() { - String category; - - category = "Books"; - config.addCustomCategoryComment(category, "All settings related to Books."); - canSpawnWithBooks = config.getBoolean("canSpawnWithBooks", category, true, "Allows books to spawn with new players.\nThis is a global override for all books."); - - category = "General"; - config.addCustomCategoryComment(category, "Miscellaneous settings."); - enableLogging = config.getBoolean("enableLogging", category, true, "Enables extra information being printed to the console."); - - config.save(); - } - - public static void handleBookConfigs() { - for (Book book : GuideAPI.getBooks().values()) - SPAWN_BOOKS.put(book, config.getBoolean(book.getRegistryName().toString(), "Books.Spawn", book.shouldSpawnWithBook(), "")); - - config.setCategoryComment("Books.Spawn", "If true, the user will spawn with the book.\nThis defaults to the value the book owner has set and is overridden by this config."); - config.save(); - } -} diff --git a/src/main/java/amerifrance/guideapi/GuideConfig.java b/src/main/java/amerifrance/guideapi/GuideConfig.java new file mode 100644 index 00000000..f37dec0c --- /dev/null +++ b/src/main/java/amerifrance/guideapi/GuideConfig.java @@ -0,0 +1,52 @@ +package amerifrance.guideapi; + + +import amerifrance.guideapi.api.GuideAPI; +import amerifrance.guideapi.api.impl.Book; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.HashMap; +import java.util.Map; + +public class GuideConfig { + + /** + * For side independent configuration. Not synced. + * Loaded after registry events but before setup + */ + public static Common COMMON; + + public static class Common { + + public final ForgeConfigSpec.BooleanValue canSpawnWithBook; + + public final ForgeConfigSpec.BooleanValue enableLogging; + public final Map SPAWN_BOOKS = new HashMap<>(); + + + Common(ForgeConfigSpec.Builder builder) { + builder.comment("Common configurations settings").push("common"); + enableLogging = builder.comment("Enables extra information being printed to the console.").define("enableLogging", true); + canSpawnWithBook = builder.comment("Allows books to spawn with new players.\nThis is a global override for all books if set to false.").define("canSpawnWithBook", true); + builder.comment("If the player should spawn with this book").push("spawnBook"); + for (Book book : GuideAPI.getBooks().values()) { + SPAWN_BOOKS.put(book, builder.define(book.getRegistryName().getNamespace() + "-" + book.getRegistryName().getPath(), book.shouldSpawnWithBook())); + } + builder.pop(); + builder.pop(); + } + } + + public static void buildConfiguration() { + final Pair specPair = new ForgeConfigSpec.Builder().configure(Common::new); + ForgeConfigSpec commonSpec = specPair.getRight(); + COMMON = specPair.getLeft(); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, commonSpec); + FMLJavaModLoadingContext.get().getModEventBus().register(GuideConfig.class); + } + +} diff --git a/src/main/java/amerifrance/guideapi/GuideMod.java b/src/main/java/amerifrance/guideapi/GuideMod.java index ce707df2..29f9efef 100644 --- a/src/main/java/amerifrance/guideapi/GuideMod.java +++ b/src/main/java/amerifrance/guideapi/GuideMod.java @@ -4,61 +4,67 @@ import amerifrance.guideapi.api.IGuideBook; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.network.PacketHandler; +import amerifrance.guideapi.proxy.ClientProxy; import amerifrance.guideapi.proxy.CommonProxy; import amerifrance.guideapi.util.AnnotationHandler; -import net.minecraft.launchwrapper.Launch; +import amerifrance.guideapi.util.ReloadCommand; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.discovery.ASMDataTable; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.commons.lang3.tuple.Pair; -import java.io.File; - -@Mod(modid = GuideMod.ID, name = GuideMod.NAME, version = GuideMod.VERSION) +@Mod(value = GuideMod.ID) public class GuideMod { public static final String NAME = "Guide-API"; public static final String ID = "guideapi"; public static final String CHANNEL = "GuideAPI"; public static final String VERSION = "@VERSION@"; - public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + public static boolean inDev = false; - @Mod.Instance(ID) public static GuideMod INSTANCE; - @SidedProxy(clientSide = "amerifrance.guideapi.proxy.ClientProxy", serverSide = "amerifrance.guideapi.proxy.CommonProxy") - public static CommonProxy PROXY; - - public static File configDir; - public static ASMDataTable dataTable; - - @Mod.EventHandler - public void preInit(FMLPreInitializationEvent event) { - configDir = new File(event.getModConfigurationDirectory(), NAME); - configDir.mkdirs(); - ConfigHandler.init(new File(configDir, NAME + ".cfg")); + public static CommonProxy PROXY = DistExecutor.runForDist(() -> ClientProxy::new, () -> CommonProxy::new); + public GuideMod() { + INSTANCE = this; + checkDevEnv(); GuideAPI.initialize(); - dataTable = event.getAsmData(); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::loadComplete); + MinecraftForge.EVENT_BUS.addListener(this::onServerStarting); + } - NetworkRegistry.INSTANCE.registerGuiHandler(this, PROXY); + private void setup(final FMLCommonSetupEvent event) { + if (GuideConfig.COMMON == null) { + throw new IllegalStateException("Did not build configuration, before configuration load. Make sure to call GuideConfig#buildConfiguration during one of the registry events"); + } PacketHandler.registerPackets(); } - @Mod.EventHandler - public void init(FMLInitializationEvent event) { + private void loadComplete(final FMLLoadCompleteEvent event) { PROXY.initColors(); - } - - @Mod.EventHandler - public void postInit(FMLPostInitializationEvent event) { - ConfigHandler.handleBookConfigs(); for (Pair guide : AnnotationHandler.BOOK_CLASSES) guide.getRight().handlePost(GuideAPI.getStackFromBook(guide.getLeft())); } + + private void checkDevEnv() { + String launchTarget = System.getenv().get("target"); + if (launchTarget != null && launchTarget.contains("dev")) { + inDev = true; + } + } + + private void onServerStarting(FMLServerStartingEvent event) { + if (inDev) { + event.getCommandDispatcher().register(LiteralArgumentBuilder.literal("guide-api").then(ReloadCommand.register())); + } + } } diff --git a/src/main/java/amerifrance/guideapi/RegistrarGuideAPI.java b/src/main/java/amerifrance/guideapi/RegistrarGuideAPI.java index 3e035056..84f42719 100644 --- a/src/main/java/amerifrance/guideapi/RegistrarGuideAPI.java +++ b/src/main/java/amerifrance/guideapi/RegistrarGuideAPI.java @@ -2,40 +2,34 @@ import amerifrance.guideapi.api.GuideAPI; import amerifrance.guideapi.api.IGuideBook; -import amerifrance.guideapi.api.IPage; import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.item.ItemGuideBook; -import amerifrance.guideapi.page.PageJsonRecipe; import amerifrance.guideapi.util.APISetter; import amerifrance.guideapi.util.AnnotationHandler; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.world.biome.Biome; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.tuple.Pair; -@Mod.EventBusSubscriber +@Mod.EventBusSubscriber(modid = "guideapi", bus = Mod.EventBusSubscriber.Bus.MOD) public class RegistrarGuideAPI { - /* - * Why Register? Well, that's an easy one. We need to register our items during the registry event phase so they - * can be properly used during init and beyond. However, we cannot handle it during Register because any mods - * using @ObjectHolder will not have their Item fields populated. Thus, we must use an event that fires *after* - * Item object holders are populated, but *before* the recipe registry. Since the events are fired in alphabetical order, - * we just pick one that starts with a letter before "r". - */ - @SubscribeEvent - public static void registerItemsInADifferentRegistryEventBecauseLoadOrderingAndObjectHoldersAreImportant(RegistryEvent.Register event) { - AnnotationHandler.gatherBooks(GuideMod.dataTable); + @SubscribeEvent + public static void registerItems(RegistryEvent.Register event) { + AnnotationHandler.gatherBooks(); + GuideConfig.buildConfiguration();//Build configuration now that we know all added books for (Book book : GuideAPI.getBooks().values()) { Item guideBook = new ItemGuideBook(book); guideBook.setRegistryName(book.getRegistryName().toString().replace(":", "-")); @@ -44,25 +38,33 @@ public static void registerItemsInADifferentRegistryEventBecauseLoadOrderingAndO } } - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void registerRecipes(RegistryEvent.Register event) { + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public static void registerModels(ModelRegistryEvent event) { for (Pair guide : AnnotationHandler.BOOK_CLASSES) { - IRecipe recipe = guide.getRight().getRecipe(GuideAPI.getStackFromBook(guide.getLeft())); - if (recipe != null) - event.getRegistry().register(recipe); + ResourceLocation loc = guide.getRight().getModel(); + if (loc != null) { + ModelLoader.addSpecialModel(new ModelResourceLocation(loc, "inventory")); + } } - - for (Book book : GuideAPI.getBooks().values()) - for (CategoryAbstract cat : book.getCategoryList()) - for (EntryAbstract entry : cat.entries.values()) - for (IPage page : entry.pageList) - if (page instanceof PageJsonRecipe) - ((PageJsonRecipe) page).init(); } @SubscribeEvent - public static void registerModels(ModelRegistryEvent event) { - for (Pair guide : AnnotationHandler.BOOK_CLASSES) - guide.getRight().handleModel(GuideAPI.getStackFromBook(guide.getLeft())); + @OnlyIn(Dist.CLIENT) + public static void bakeModel(ModelBakeEvent event) { + for (Pair guide : AnnotationHandler.BOOK_CLASSES) { + ResourceLocation loc = guide.getRight().getModel(); + if (loc != null) { + ModelResourceLocation newMrl = new ModelResourceLocation(loc, "inventory"); + Item bookItem = GuideAPI.getStackFromBook(guide.getLeft()).getItem(); + ModelResourceLocation oldMrl = new ModelResourceLocation(bookItem.getRegistryName(), "inventory"); + IBakedModel model = event.getModelRegistry().get(newMrl); + + event.getModelRegistry().put(oldMrl, model); + + } + } + } } diff --git a/src/main/java/amerifrance/guideapi/api/BookEvent.java b/src/main/java/amerifrance/guideapi/api/BookEvent.java index afc73355..f2bb5c32 100644 --- a/src/main/java/amerifrance/guideapi/api/BookEvent.java +++ b/src/main/java/amerifrance/guideapi/api/BookEvent.java @@ -1,20 +1,20 @@ package amerifrance.guideapi.api; import amerifrance.guideapi.api.impl.Book; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.Style; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; import javax.annotation.Nonnull; /** * Base class for all {@link Book} related events. - * + *

* {@link #book} is the book being opened. * {@link #stack} is the ItemStack of the Book. * {@link #player} is the player opening the book. @@ -23,9 +23,9 @@ public class BookEvent extends Event { private final Book book; private final ItemStack stack; - private final EntityPlayer player; + private final PlayerEntity player; - protected BookEvent(Book book, ItemStack stack, EntityPlayer player) { + protected BookEvent(Book book, ItemStack stack, PlayerEntity player) { this.book = book; this.stack = stack; this.player = player; @@ -39,23 +39,23 @@ public ItemStack getStack() { return stack; } - public EntityPlayer getPlayer() { + public PlayerEntity getPlayer() { return player; } /** - * Called whenever a book is opened. - * + * Called client side whenever a book is opened. + *

* {@link #canceledText} is a status message sent to the player when the book fails to open. */ @Cancelable public static class Open extends BookEvent { - private static final ITextComponent DEFAULT_CANCEL = new TextComponentTranslation("text.open.failed").setStyle(new Style().setColor(TextFormatting.RED)); + private static final ITextComponent DEFAULT_CANCEL = new TranslationTextComponent("text.open.failed").setStyle(new Style().setColor(TextFormatting.RED)); private ITextComponent canceledText = DEFAULT_CANCEL; - public Open(Book book, ItemStack stack, EntityPlayer player) { + public Open(Book book, ItemStack stack, PlayerEntity player) { super(book, stack, player); } diff --git a/src/main/java/amerifrance/guideapi/api/GuideAPI.java b/src/main/java/amerifrance/guideapi/api/GuideAPI.java index 2022f87a..84a80f5a 100644 --- a/src/main/java/amerifrance/guideapi/api/GuideAPI.java +++ b/src/main/java/amerifrance/guideapi/api/GuideAPI.java @@ -3,12 +3,8 @@ import amerifrance.guideapi.api.impl.Book; import com.google.common.collect.*; import net.minecraft.block.Block; -import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; import java.util.Map; @@ -38,47 +34,12 @@ public static ItemStack getStackFromBook(Book book) { */ public static void registerInfoRenderer(Book book, IInfoRenderer infoRenderer, Class... blockClasses) { if (!INFO_RENDERERS.containsKey(book)) - INFO_RENDERERS.put(book, ArrayListMultimap., IInfoRenderer>create()); + INFO_RENDERERS.put(book, ArrayListMultimap.create()); for (Class blockClass : blockClasses) INFO_RENDERERS.get(book).put(blockClass, infoRenderer); } - /** - * Helper method for setting a model for your book. - *

- * Use if you wish to use a custom model. - *

- * Only call AFTER you have registered your book. - * - * @param book - Book to set model for - * @param modelLoc - Location of the model file - * @param variantName - Variant to use - */ - @SideOnly(Side.CLIENT) - public static void setModel(Book book, ResourceLocation modelLoc, String variantName) { - ModelResourceLocation mrl = new ModelResourceLocation(modelLoc, variantName); - ModelLoader.setCustomModelResourceLocation( - getStackFromBook(book).getItem(), - 0, - mrl - ); - } - - /** - * Helper method for setting a model for your book. - *

- * Use if you wish to use the default model with color. - *

- * Only call AFTER you have registered your book. - * - * @param book - Book to set model for - */ - @SideOnly(Side.CLIENT) - public static void setModel(Book book) { - setModel(book, new ResourceLocation("guideapi", "ItemGuideBook"), "inventory"); - } - public static void initialize() { // No-op. Just here to initialize fields. } diff --git a/src/main/java/amerifrance/guideapi/api/GuideBook.java b/src/main/java/amerifrance/guideapi/api/GuideBook.java index a2a12c29..97890413 100644 --- a/src/main/java/amerifrance/guideapi/api/GuideBook.java +++ b/src/main/java/amerifrance/guideapi/api/GuideBook.java @@ -1,6 +1,7 @@ package amerifrance.guideapi.api; -import net.minecraftforge.fml.common.eventhandler.EventPriority; + +import net.minecraftforge.eventbus.api.EventPriority; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/amerifrance/guideapi/api/IGuideBook.java b/src/main/java/amerifrance/guideapi/api/IGuideBook.java index 21c6da38..e414994c 100644 --- a/src/main/java/amerifrance/guideapi/api/IGuideBook.java +++ b/src/main/java/amerifrance/guideapi/api/IGuideBook.java @@ -2,9 +2,9 @@ import amerifrance.guideapi.api.impl.Book; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -21,23 +21,12 @@ public interface IGuideBook { Book buildBook(); /** - * Use this to handle setting the model of your book. Only exists on the client. - * - * @param bookStack - The ItemStack assigned to your book. - */ - @SideOnly(Side.CLIENT) - default void handleModel(@Nonnull ItemStack bookStack) { - GuideAPI.setModel(((IGuideItem) bookStack.getItem()).getBook(bookStack)); - } - - /** - * An IRecipe to use for your book. Called from {@link net.minecraftforge.event.RegistryEvent.Register} - * - * @return an IRecipe to register for your book or null to not include one. + * @return The resource location of your own model or null if you want handle rendering yourself somehow */ @Nullable - default IRecipe getRecipe(@Nonnull ItemStack bookStack) { - return null; + @OnlyIn(Dist.CLIENT) + default ResourceLocation getModel() { + return new ResourceLocation("guideapi", "guidebook"); } /** diff --git a/src/main/java/amerifrance/guideapi/api/IGuideLinked.java b/src/main/java/amerifrance/guideapi/api/IGuideLinked.java index 3d94d0a4..f1a3a772 100644 --- a/src/main/java/amerifrance/guideapi/api/IGuideLinked.java +++ b/src/main/java/amerifrance/guideapi/api/IGuideLinked.java @@ -1,6 +1,6 @@ package amerifrance.guideapi.api; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -18,5 +18,5 @@ public interface IGuideLinked { * @return the key of the entry to open or null if no entry should be opened */ @Nullable - ResourceLocation getLinkedEntry(World world, BlockPos pos, EntityPlayer player, ItemStack stack); + ResourceLocation getLinkedEntry(World world, BlockPos pos, PlayerEntity player, ItemStack stack); } diff --git a/src/main/java/amerifrance/guideapi/api/IInfoRenderer.java b/src/main/java/amerifrance/guideapi/api/IInfoRenderer.java index 401ad6ed..fb7137ce 100644 --- a/src/main/java/amerifrance/guideapi/api/IInfoRenderer.java +++ b/src/main/java/amerifrance/guideapi/api/IInfoRenderer.java @@ -1,8 +1,8 @@ package amerifrance.guideapi.api; import amerifrance.guideapi.api.impl.Book; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; @@ -14,7 +14,7 @@ * Used to render information on screen about a block while a player is looking at and holding the guide. This is only * called on the client. *

- * Use {@link GuideAPI#registerInfoRenderer(amerifrance.guideapi.api.impl.Book, IInfoRenderer, Class...)} to register your + * Use {@link GuideAPI#registerInfoRenderer(Book, IInfoRenderer, Class...)} to register your * handler. You can also implement {@link Block} on a block. *

* Some example usages can be found in {@link amerifrance.guideapi.info} @@ -33,7 +33,7 @@ public interface IInfoRenderer { * @param rayTrace - A RayTraceResult containing data about the block currently looked at * @param player - The player looking at the block */ - void drawInformation(Book book, World world, BlockPos pos, IBlockState state, RayTraceResult rayTrace, EntityPlayer player); + void drawInformation(Book book, World world, BlockPos pos, BlockState state, RayTraceResult rayTrace, PlayerEntity player); interface Block { @@ -49,7 +49,7 @@ interface Block { * @return an IInfoRenderer for this block. If no IInfoRenderer is needed, return null. */ @Nullable - IInfoRenderer getInfoRenderer(Book book, World world, BlockPos pos, IBlockState state, RayTraceResult rayTrace, EntityPlayer player); + IInfoRenderer getInfoRenderer(Book book, World world, BlockPos pos, BlockState state, RayTraceResult rayTrace, PlayerEntity player); /** * @return returns the book required to display information. diff --git a/src/main/java/amerifrance/guideapi/api/IPage.java b/src/main/java/amerifrance/guideapi/api/IPage.java index 317433d9..dfe0633e 100644 --- a/src/main/java/amerifrance/guideapi/api/IPage.java +++ b/src/main/java/amerifrance/guideapi/api/IPage.java @@ -3,30 +3,30 @@ import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiEntry; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.EntryScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public interface IPage { - @SideOnly(Side.CLIENT) - void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj); + @OnlyIn(Dist.CLIENT) + void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj); - @SideOnly(Side.CLIENT) - void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj); + @OnlyIn(Dist.CLIENT) + void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj); - boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack, GuiEntry guiEntry); + boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry); - @SideOnly(Side.CLIENT) - void onLeftClicked(Book book, CategoryAbstract category, EntryAbstract entry, int mouseX, int mouseY, EntityPlayer player, GuiEntry guiEntry); + @OnlyIn(Dist.CLIENT) + void onLeftClicked(Book book, CategoryAbstract category, EntryAbstract entry, double mouseX, double mouseY, PlayerEntity player, EntryScreen guiEntry); - @SideOnly(Side.CLIENT) - void onRightClicked(Book book, CategoryAbstract category, EntryAbstract entry, int mouseX, int mouseY, EntityPlayer player, GuiEntry guiEntry); + @OnlyIn(Dist.CLIENT) + void onRightClicked(Book book, CategoryAbstract category, EntryAbstract entry, double mouseX, double mouseY, PlayerEntity player, EntryScreen guiEntry); - @SideOnly(Side.CLIENT) - void onInit(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack, GuiEntry guiEntry); + @OnlyIn(Dist.CLIENT) + void onInit(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry); } diff --git a/src/main/java/amerifrance/guideapi/api/IRecipeRenderer.java b/src/main/java/amerifrance/guideapi/api/IRecipeRenderer.java index 786bd66e..bb7954df 100644 --- a/src/main/java/amerifrance/guideapi/api/IRecipeRenderer.java +++ b/src/main/java/amerifrance/guideapi/api/IRecipeRenderer.java @@ -3,35 +3,39 @@ import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.api.util.IngredientCycler; +import amerifrance.guideapi.gui.BaseScreen; import com.google.common.collect.Lists; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.List; public interface IRecipeRenderer { - @SideOnly(Side.CLIENT) - void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj); + @OnlyIn(Dist.CLIENT) + void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj, IngredientCycler cycler); - @SideOnly(Side.CLIENT) - void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj); + @OnlyIn(Dist.CLIENT) + void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj); - abstract class RecipeRendererBase implements IRecipeRenderer { + abstract class RecipeRendererBase> implements IRecipeRenderer { protected T recipe; - protected List tooltips = Lists.newArrayList(); + protected List tooltips = Lists.newArrayList(); + public RecipeRendererBase(T recipe) { this.recipe = recipe; } + @Override - public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - guiBase.drawHoveringText(tooltips, mouseX, mouseY); + public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + guiBase.drawHoveringTextComponents(tooltips, mouseX, mouseY); tooltips.clear(); } } diff --git a/src/main/java/amerifrance/guideapi/api/SubTexture.java b/src/main/java/amerifrance/guideapi/api/SubTexture.java index e40d2451..744c9a6e 100644 --- a/src/main/java/amerifrance/guideapi/api/SubTexture.java +++ b/src/main/java/amerifrance/guideapi/api/SubTexture.java @@ -1,13 +1,13 @@ package amerifrance.guideapi.api; +import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class SubTexture { @@ -55,23 +55,23 @@ public SubTexture(ResourceLocation textureLocation, int xPos, int yPos, int widt this.height = height; } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public void draw(int drawX, int drawY, double zLevel) { final float someMagicValueFromMojang = 0.00390625F; - Minecraft.getMinecraft().renderEngine.bindTexture(textureLocation); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getInstance().getTextureManager().bindTexture(textureLocation); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder vertexbuffer = tessellator.getBuffer(); vertexbuffer.begin(7, DefaultVertexFormats.POSITION_TEX); - vertexbuffer.pos((double) drawX, (double) (drawY + height), zLevel).tex((double) ((float) xPos * someMagicValueFromMojang), (double) ((float) (yPos + height) * someMagicValueFromMojang)).endVertex(); - vertexbuffer.pos((double) (drawX + width), (double) (drawY + height), zLevel).tex((double) ((float) (xPos + width) * someMagicValueFromMojang), (double) ((float) (yPos + height) * someMagicValueFromMojang)).endVertex(); - vertexbuffer.pos((double) (drawX + width), (double) drawY, zLevel).tex((double) ((float) (xPos + width) * someMagicValueFromMojang), (double) ((float) yPos * someMagicValueFromMojang)).endVertex(); - vertexbuffer.pos((double) drawX, (double) drawY, zLevel).tex((double) ((float) xPos * someMagicValueFromMojang), (double) ((float) yPos * someMagicValueFromMojang)).endVertex(); + vertexbuffer.pos(drawX, drawY + height, zLevel).tex((float) xPos * someMagicValueFromMojang, (float) (yPos + height) * someMagicValueFromMojang).endVertex(); + vertexbuffer.pos(drawX + width, drawY + height, zLevel).tex((float) (xPos + width) * someMagicValueFromMojang, (float) (yPos + height) * someMagicValueFromMojang).endVertex(); + vertexbuffer.pos(drawX + width, drawY, zLevel).tex((float) (xPos + width) * someMagicValueFromMojang, (float) yPos * someMagicValueFromMojang).endVertex(); + vertexbuffer.pos(drawX, drawY, zLevel).tex((float) xPos * someMagicValueFromMojang, (float) yPos * someMagicValueFromMojang).endVertex(); tessellator.draw(); } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) public void draw(int drawX, int drawY) { draw(drawX, drawY, 0.1D); } diff --git a/src/main/java/amerifrance/guideapi/api/button/ButtonGuideAPI.java b/src/main/java/amerifrance/guideapi/api/button/ButtonGuideAPI.java index bf00f201..62787bc6 100644 --- a/src/main/java/amerifrance/guideapi/api/button/ButtonGuideAPI.java +++ b/src/main/java/amerifrance/guideapi/api/button/ButtonGuideAPI.java @@ -1,14 +1,14 @@ package amerifrance.guideapi.api.button; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.client.gui.GuiButton; +import amerifrance.guideapi.gui.BaseScreen; +import net.minecraft.client.gui.widget.button.Button; -public class ButtonGuideAPI extends GuiButton { +public class ButtonGuideAPI extends Button { - public GuiBase guiBase; + public BaseScreen guiBase; - public ButtonGuideAPI(int id, int x, int y, GuiBase guiBase) { - super(id, x, y, ""); + public ButtonGuideAPI(int widthIn, int heightIn, int width, int height, Button.IPressable onPress, BaseScreen guiBase) { + super(widthIn, heightIn, width, height, "", onPress); this.guiBase = guiBase; } } diff --git a/src/main/java/amerifrance/guideapi/api/impl/Book.java b/src/main/java/amerifrance/guideapi/api/impl/Book.java index a7b12e24..6f0e88e8 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/Book.java +++ b/src/main/java/amerifrance/guideapi/api/impl/Book.java @@ -1,57 +1,65 @@ package amerifrance.guideapi.api.impl; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.util.TextHelper; +import amerifrance.guideapi.util.LogHelper; import com.google.common.base.Joiner; -import com.google.common.collect.Lists; -import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.util.ResourceLocation; import org.apache.commons.lang3.builder.ToStringBuilder; -import java.awt.Color; +import java.awt.*; +import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public class Book { - private static final String GUITEXLOC = "guideapi:textures/gui/"; - - private List categories = Lists.newArrayList(); - private String title = "item.GuideBook.name"; - private String header = title; - private String itemName = title; - private String author; - private ResourceLocation pageTexture = new ResourceLocation(GUITEXLOC + "book_colored.png"); - private ResourceLocation outlineTexture = new ResourceLocation(GUITEXLOC + "book_greyscale.png"); - private boolean customModel; - private Color color = new Color(171, 70, 30); - private boolean spawnWithBook; - private ResourceLocation registryName; - private CreativeTabs creativeTab = CreativeTabs.MISC; - - /** - * @deprecated see {@link BookBinder}. To be made package private in 1.13. - */ - @Deprecated - public Book(List categoryList, String title, String header, String displayName, String author, ResourceLocation pageTexture, ResourceLocation outlineTexture, boolean customModel, Color color, boolean spawnWithBook, ResourceLocation registryName, CreativeTabs creativeTab) { - this.categories = categoryList; + private final List categories = new ArrayList<>(); + private final Consumer> contentProvider; + private final String title; + private final String header; + private final String itemName; + private final String author; + private final ResourceLocation pageTexture; + private final ResourceLocation outlineTexture; + private final Color color; + private final boolean spawnWithBook; + private final ResourceLocation registryName; + private final ItemGroup creativeTab; + private boolean isInitialized; + + + protected Book(Consumer> contentProvider, String title, String header, String displayName, String author, ResourceLocation pageTexture, ResourceLocation outlineTexture, Color color, boolean spawnWithBook, ResourceLocation registryName, ItemGroup creativeTab) { + this.contentProvider = contentProvider; this.title = title; this.header = header; this.itemName = displayName; this.author = author; this.pageTexture = pageTexture; this.outlineTexture = outlineTexture; - this.customModel = customModel; this.color = color; this.spawnWithBook = spawnWithBook; this.registryName = registryName; this.creativeTab = creativeTab; } + public void initializeContent() { + if (!isInitialized) { + LogHelper.debug("Opening book " + registryName.toString() + " for the first time -> Initializing content"); + contentProvider.accept(categories); + isInitialized = true; + } + } + /** - * @deprecated see {@link BookBinder}. To be removed in 1.13. + * Can be used to force content initialisation independent of first use regardless of if it was initialized previously. + * Use at own risk. Might cause crashes if the book is currently open. */ - @Deprecated - public Book() { + public void forceInitializeContent() { + LogHelper.info("Force initializing book content " + registryName.toString()); + categories.clear(); + isInitialized = false; + initializeContent(); } public List getCategoryList() { @@ -82,10 +90,6 @@ public ResourceLocation getOutlineTexture() { return this.outlineTexture; } - public boolean hasCustomModel() { - return this.customModel; - } - public Color getColor() { return this.color; } @@ -98,207 +102,10 @@ public ResourceLocation getRegistryName() { return this.registryName; } - public CreativeTabs getCreativeTab() { + public ItemGroup getCreativeTab() { return this.creativeTab; } - /** - * @deprecated see {@link #getItemName()}. To be removed in 1.13. - */ - @Deprecated - public String getDisplayName() { - return this.itemName; - } - - /** - * @deprecated see {@link #getHeader()}. To be removed in 1.13. - */ - @Deprecated - public String getWelcomeMessage() { - return this.header; - } - - /** - * @deprecated see {@link #hasCustomModel()}. To be removed in 1.13. - */ - @Deprecated - public boolean isCustomModel() { - return this.customModel; - } - - /** - * @deprecated see {@link #shouldSpawnWithBook()}. To be removed in 1.13. - */ - @Deprecated - public boolean isSpawnWithBook() { - return this.spawnWithBook; - } - - /** - * @deprecated see {@link BookBinder#addCategory(CategoryAbstract)}. To be removed in 1.13. - */ - @Deprecated - public void setCategoryList(List categoryList) { - this.categories = categoryList; - } - - /** - * @deprecated see {@link BookBinder#setGuideTitle(String)}. To be removed in 1.13. - */ - @Deprecated - public void setTitle(String title) { - this.title = title; - } - - /** - * @deprecated see {@link BookBinder#setHeader(String)}. To be removed in 1.13. - */ - @Deprecated - public void setWelcomeMessage(String header) { - this.header = header; - } - - /** - * @deprecated see {@link BookBinder#setItemName(String)}. To be removed in 1.13. - */ - @Deprecated - public void setDisplayName(String displayName) { - this.itemName = displayName; - } - - /** - * @deprecated see {@link BookBinder#setAuthor(String)}. To be removed in 1.13. - */ - @Deprecated - public void setAuthor(String author) { - this.author = author; - } - - /** - * @deprecated see {@link BookBinder#setSpawnWithBook()}. To be removed in 1.13. - */ - @Deprecated - public void setSpawnWithBook(boolean spawnWithBook) { - this.spawnWithBook = spawnWithBook; - } - - /** - * @deprecated see {@link BookBinder#setPageTexture(ResourceLocation)}. To be removed in 1.13. - */ - @Deprecated - public void setPageTexture(ResourceLocation pageTexture) { - this.pageTexture = pageTexture; - } - - /** - * @deprecated see {@link BookBinder#setOutlineTexture(ResourceLocation)}. To be removed in 1.13. - */ - @Deprecated - public void setOutlineTexture(ResourceLocation outlineTexture) { - this.outlineTexture = outlineTexture; - } - - /** - * @deprecated see {@link BookBinder#setHasCustomModel()}. To be removed in 1.13. - */ - @Deprecated - public void setCustomModel(boolean customModel) { - this.customModel = customModel; - } - - /** - * @deprecated see {@link BookBinder#setColor(int)}. To be removed in 1.13. - */ - @Deprecated - public void setColor(Color color) { - this.color = color; - } - - /** - * @deprecated see {@link BookBinder#BookBinder(ResourceLocation)}. To be removed in 1.13. - */ - @Deprecated - public void setRegistryName(ResourceLocation registryName) { - this.registryName = registryName; - } - - /** - * @deprecated see {@link BookBinder#setCreativeTab(CreativeTabs)}. To be removed in 1.13. - */ - @Deprecated - public void setCreativeTab(CreativeTabs creativeTab) { - this.creativeTab = creativeTab; - } - - /** - * @deprecated see {@link BookBinder#addCategory(CategoryAbstract)}. To be removed in 1.13. - * - * @param category - Add this category - */ - @Deprecated - public void addCategory(CategoryAbstract category) { - this.categories.add(category); - } - - /** - * @deprecated see {@link BookBinder}. To be removed in 1.13. - * - * @param category - Remove this category - */ - @Deprecated - public void removeCategory(CategoryAbstract category) { - this.categories.remove(category); - } - - /** - * @deprecated see {@link BookBinder#addCategory(CategoryAbstract)}. To be removed in 1.13. - * - * @param categories - Add these categories - */ - @Deprecated - public void addCategoryList(List categories) { - this.categories.addAll(categories); - } - - /** - * @deprecated see {@link BookBinder}. To be removed in 1.13. - * - * @param categories - Remove these categories - */ - @Deprecated - public void removeCategoryList(List categories) { - this.categories.removeAll(categories); - } - - /** - * @deprecated localize yourself with {@link #getTitle()}. To be removed in 1.13. - * - * @return - Localized book title - */ - @Deprecated - public String getLocalizedBookTitle() { - return TextHelper.localizeEffect(getTitle()); - } - - /** - * @deprecated localize yourself with {@link #getHeader()}. To be removed in 1.13. - * - * @return - Localized welcome message - */ - @Deprecated - public String getLocalizedWelcomeMessage() { - return TextHelper.localizeEffect(getHeader()); - } - - /** - * @deprecated localize yourself with {@link #getDisplayName()}. To be removed in 1.13. - * - * @return - Localized item display name - */ - @Deprecated - public String getLocalizedDisplayName() { - return TextHelper.localize(getDisplayName()); - } @Override public String toString() { @@ -310,7 +117,6 @@ public String toString() { .append("author", author) .append("pageTexture", pageTexture) .append("outlineTexture", outlineTexture) - .append("customModel", customModel) .append("color", color) .append("spawnWithBook", spawnWithBook) .append("registryName", registryName) diff --git a/src/main/java/amerifrance/guideapi/api/impl/BookBinder.java b/src/main/java/amerifrance/guideapi/api/impl/BookBinder.java index 288469c6..2649bec4 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/BookBinder.java +++ b/src/main/java/amerifrance/guideapi/api/impl/BookBinder.java @@ -2,28 +2,29 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemGroup; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.forgespi.language.IModInfo; -import java.awt.Color; +import java.awt.*; import java.util.List; +import java.util.function.Consumer; public class BookBinder { private final ResourceLocation registryName; - private final List categories = Lists.newArrayList(); - private String guideTitle = "item.guideapi.book.name"; + private Consumer> contentProvider; + private String guideTitle = "item.guideapi.book"; private String header; private String itemName; private String author; private ResourceLocation pageTexture = new ResourceLocation("guideapi", "textures/gui/book_colored.png"); private ResourceLocation outlineTexture = new ResourceLocation("guideapi", "textures/gui/book_greyscale.png"); - private boolean hasCustomModel; private Color color = new Color(171, 70, 30); private boolean spawnWithBook; - private CreativeTabs creativeTab = CreativeTabs.MISC; + private ItemGroup creativeTab = ItemGroup.MISC; /** * Creates a new {@link Book} builder which will provide a much more user-friendly interface for creating books. @@ -34,17 +35,16 @@ public BookBinder(ResourceLocation registryName) { this.registryName = registryName; } + /** - * Adds a new {@link CategoryAbstract} to this book. You should either pre-build or keep a reference of this category - * so you may populate it with entries. - * - * Categories are displayed in the order they are added. + * Set a consumer (method) that will generate the content for your book and add it to the provided list + * This will be called on client side when the book is opened for the first time. * - * @param category The category to add to this book. + * @param contentProvider The consumer. Categories are displayed in which they are added to the provided list * @return the builder instance for chaining. */ - public BookBinder addCategory(CategoryAbstract category) { - this.categories.add(category); + public BookBinder setContentProvider(Consumer> contentProvider) { + this.contentProvider = contentProvider; return this; } @@ -61,7 +61,7 @@ public BookBinder setGuideTitle(String guideTitle) { /** * Sets the header text of this book. The header is displayed at the top of the home page above the category listing. - * + *

* By default, this is the same as {@link #guideTitle}. * * @param header The header text to display. @@ -74,7 +74,7 @@ public BookBinder setHeader(String header) { /** * Sets the unlocalized name for the item containing this book. - * + *

* By default, this is the same as {@link #guideTitle}. * * @param itemName The unlocalized name for this item. @@ -88,7 +88,7 @@ public BookBinder setItemName(String itemName) { /** * The author of this book. If your books are lore-heavy, using an actual author name is acceptable. If not, you can * just use your mod name. - * + *

* By default, this uses the name of the mod container obtained from looking up the domain of {@link #registryName}. * * @param author The author of this book. @@ -102,7 +102,7 @@ public BookBinder setAuthor(String author) { /** * The texture to use for the pages themselves. These are un-colored and drawn just how they appear in the texture file. * The dimensions should remain the same as the default texture. - * + *

* By default, this uses the same page texture as vanilla books. * * @param pageTexture The page texture to use for this guide. @@ -116,7 +116,7 @@ public BookBinder setPageTexture(ResourceLocation pageTexture) { /** * The texture to use for the border of the book. These are colored with {@link #color}. The dimensions should remain * the same as the default texture. - * + *

* By default, this uses a greyscale version of the outline of vanilla books. * * @param outlineTexture The outline texture to use for this guide. @@ -127,21 +127,9 @@ public BookBinder setOutlineTexture(ResourceLocation outlineTexture) { return this; } - /** - * Indicates that the item containing this book has a custom model that you will manually register. - * - * By default, a generic book model will be registered and colored with {@link #color}. - * - * @return the builder instance for chaining. - */ - public BookBinder setHasCustomModel() { - this.hasCustomModel = true; - return this; - } - /** * Sets the color to overlay on the book model and GUI border. - * + *

* By default, this is a reddish-brown color. * * @param color The color to overlay with. @@ -155,10 +143,9 @@ public BookBinder setColor(Color color) { /** * An overload that takes an RGB color instead of a {@link Color} instance. * - * @see #setColor(int) - * * @param color The color to overlay with. * @return the builder instance for chaining. + * @see #setColor(int) */ public BookBinder setColor(int color) { return setColor(new Color(color)); @@ -167,7 +154,7 @@ public BookBinder setColor(int color) { /** * Sets the default config option for whether new players should spawn with this book in their inventory. Players may * override this in the config if they wish. - * + *

* By default, books will not spawn in the player's inventory. * * @return the builder instance for chaining. @@ -179,24 +166,25 @@ public BookBinder setSpawnWithBook() { /** * Sets the Creative Tab this book should appear in. - * - * By default, all books will appear in {@link CreativeTabs#MISC}. + *

+ * By default, all books will appear in {@link ItemGroup#MISC}. * * @param creativeTab The creative tab this book should display in. * @return the builder instance for chaining. */ - public BookBinder setCreativeTab(CreativeTabs creativeTab) { + public BookBinder setCreativeTab(ItemGroup creativeTab) { this.creativeTab = creativeTab; return this; } /** * Constructs a book from the given data. Will modify specific values if not set so they have defaults. + * * @return a constructed book. */ public Book build() { if (Strings.isNullOrEmpty(author)) - this.author = Loader.instance().getIndexedModList().getOrDefault(registryName.getResourceDomain(), Loader.instance().getMinecraftModContainer()).getName(); + this.author = ModList.get().getModContainerById(registryName.getNamespace()).map(ModContainer::getModInfo).map(IModInfo::getDisplayName).orElse("Unknown"); if (header == null) this.header = guideTitle; @@ -204,6 +192,10 @@ public Book build() { if (this.itemName == null) this.itemName = guideTitle.substring(5); - return new Book(categories, guideTitle, header, itemName, author, pageTexture, outlineTexture, hasCustomModel, color, spawnWithBook, registryName, creativeTab); + if (contentProvider == null) { + throw new IllegalStateException("Content supplier of book " + registryName.toString() + " must be provided"); + } + + return new Book(contentProvider, guideTitle, header, itemName, author, pageTexture, outlineTexture, color, spawnWithBook, registryName, creativeTab); } } diff --git a/src/main/java/amerifrance/guideapi/api/impl/Category.java b/src/main/java/amerifrance/guideapi/api/impl/Category.java index 9544594e..d3166a2c 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/Category.java +++ b/src/main/java/amerifrance/guideapi/api/impl/Category.java @@ -2,16 +2,16 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiCategory; -import amerifrance.guideapi.gui.GuiHome; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.CategoryScreen; +import amerifrance.guideapi.gui.HomeScreen; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderItem; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.Map; @@ -26,33 +26,33 @@ public Category(String name) { } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem) { + @OnlyIn(Dist.CLIENT) + public void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem) { } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem) { } @Override - public boolean canSee(EntityPlayer player, ItemStack bookStack) { + public boolean canSee(PlayerEntity player, ItemStack bookStack) { return true; } @Override - @SideOnly(Side.CLIENT) - public void onLeftClicked(Book book, int mouseX, int mouseY, EntityPlayer player, ItemStack bookStack) { - Minecraft.getMinecraft().displayGuiScreen(new GuiCategory(book, this, player, bookStack, null)); + @OnlyIn(Dist.CLIENT) + public void onLeftClicked(Book book, double mouseX, double mouseY, PlayerEntity player, ItemStack bookStack) { + Minecraft.getInstance().displayGuiScreen(new CategoryScreen(book, this, player, bookStack, null)); } @Override - @SideOnly(Side.CLIENT) - public void onRightClicked(Book book, int mouseX, int mouseY, EntityPlayer player, ItemStack bookStack) { + @OnlyIn(Dist.CLIENT) + public void onRightClicked(Book book, double mouseX, double mouseY, PlayerEntity player, ItemStack bookStack) { } @Override - @SideOnly(Side.CLIENT) - public void onInit(Book book, GuiHome guiHome, EntityPlayer player, ItemStack bookStack) { + @OnlyIn(Dist.CLIENT) + public void onInit(Book book, HomeScreen guiHome, PlayerEntity player, ItemStack bookStack) { } } diff --git a/src/main/java/amerifrance/guideapi/api/impl/Entry.java b/src/main/java/amerifrance/guideapi/api/impl/Entry.java index 0cdc6ed0..126c5c83 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/Entry.java +++ b/src/main/java/amerifrance/guideapi/api/impl/Entry.java @@ -4,32 +4,24 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiCategory; -import amerifrance.guideapi.gui.GuiEntry; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.CategoryScreen; +import amerifrance.guideapi.gui.EntryScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; -import java.awt.Color; -import java.util.Collections; +import java.awt.*; import java.util.List; public class Entry extends EntryAbstract { - public Entry(List pageList, String name, boolean unicode) { - super(pageList, name, unicode); - } public Entry(List pageList, String name) { - super(pageList, name, false); - } - - public Entry(String name, boolean unicode) { - super(name, unicode); + super(pageList, name); } public Entry(String name) { @@ -37,13 +29,9 @@ public Entry(String name) { } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - - boolean startFlag = fontRendererObj.getUnicodeFlag(); + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { - if (unicode) - fontRendererObj.setUnicodeFlag(true); // Cutting code ripped from GuiButtonExt#drawButton(...) String entryName = getLocalizedName(); @@ -60,15 +48,13 @@ public void draw(Book book, CategoryAbstract category, int entryX, int entryY, i fontRendererObj.drawString(entryName, entryX + 12, entryY, 0); } - if (unicode && !startFlag) - fontRendererObj.setUnicodeFlag(false); + } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - boolean startFlag = fontRendererObj.getUnicodeFlag(); - fontRendererObj.setUnicodeFlag(false); + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + // Cutting code ripped from GuiButtonExt#drawButton(...) int strWidth = fontRendererObj.getStringWidth(getLocalizedName()); @@ -78,32 +64,30 @@ public void drawExtras(Book book, CategoryAbstract category, int entryX, int ent cutString = true; if (GuiHelper.isMouseBetween(mouseX, mouseY, entryX, entryY, entryWidth, entryHeight) && cutString) { - - guiBase.drawHoveringText(Collections.singletonList(getLocalizedName()), entryX, entryY + 12); - fontRendererObj.setUnicodeFlag(unicode); + guiBase.renderTooltip(getLocalizedName(), entryX, entryY + 12); } - fontRendererObj.setUnicodeFlag(startFlag); + } @Override - public boolean canSee(EntityPlayer player, ItemStack bookStack) { + public boolean canSee(PlayerEntity player, ItemStack bookStack) { return true; } @Override - @SideOnly(Side.CLIENT) - public void onLeftClicked(Book book, CategoryAbstract category, int mouseX, int mouseY, EntityPlayer player, GuiCategory guiCategory) { - Minecraft.getMinecraft().displayGuiScreen(new GuiEntry(book, category, this, player, guiCategory.bookStack)); + @OnlyIn(Dist.CLIENT) + public void onLeftClicked(Book book, CategoryAbstract category, double mouseX, double mouseY, PlayerEntity player, CategoryScreen guiCategory) { + Minecraft.getInstance().displayGuiScreen(new EntryScreen(book, category, this, player, guiCategory.bookStack)); } @Override - @SideOnly(Side.CLIENT) - public void onRightClicked(Book book, CategoryAbstract category, int mouseX, int mouseY, EntityPlayer player, GuiCategory guiCategory) { + @OnlyIn(Dist.CLIENT) + public void onRightClicked(Book book, CategoryAbstract category, double mouseX, double mouseY, PlayerEntity player, CategoryScreen guiCategory) { } @Override - @SideOnly(Side.CLIENT) - public void onInit(Book book, CategoryAbstract category, GuiCategory guiCategory, EntityPlayer player, ItemStack bookStack) { + @OnlyIn(Dist.CLIENT) + public void onInit(Book book, CategoryAbstract category, CategoryScreen guiCategory, PlayerEntity player, ItemStack bookStack) { } } \ No newline at end of file diff --git a/src/main/java/amerifrance/guideapi/api/impl/Page.java b/src/main/java/amerifrance/guideapi/api/impl/Page.java index 86b4ffdb..604ae24d 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/Page.java +++ b/src/main/java/amerifrance/guideapi/api/impl/Page.java @@ -3,57 +3,50 @@ import amerifrance.guideapi.api.IPage; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiEntry; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.EntryScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class Page implements IPage { - protected boolean unicode; - @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { } @Override - public boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack, GuiEntry guiEntry) { + public boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry) { return true; } @Override - @SideOnly(Side.CLIENT) - public void onLeftClicked(Book book, CategoryAbstract category, EntryAbstract entry, int mouseX, int mouseY, EntityPlayer player, GuiEntry guiEntry) { + @OnlyIn(Dist.CLIENT) + public void onLeftClicked(Book book, CategoryAbstract category, EntryAbstract entry, double mouseX, double mouseY, PlayerEntity player, EntryScreen guiEntry) { } @Override - @SideOnly(Side.CLIENT) - public void onRightClicked(Book book, CategoryAbstract category, EntryAbstract entry, int mouseX, int mouseY, EntityPlayer player, GuiEntry guiEntry) { + @OnlyIn(Dist.CLIENT) + public void onRightClicked(Book book, CategoryAbstract category, EntryAbstract entry, double mouseX, double mouseY, PlayerEntity player, EntryScreen guiEntry) { } @Override - @SideOnly(Side.CLIENT) - public void onInit(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack, GuiEntry guiEntry) { - } - - public void setUnicodeFlag(boolean flag) { - this.unicode = flag; + @OnlyIn(Dist.CLIENT) + public void onInit(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry) { } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null) return false; - if (getClass() != o.getClass()) return false; - return true; + return getClass() == o.getClass(); } } diff --git a/src/main/java/amerifrance/guideapi/api/impl/abstraction/CategoryAbstract.java b/src/main/java/amerifrance/guideapi/api/impl/abstraction/CategoryAbstract.java index 460774ba..f99f1805 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/abstraction/CategoryAbstract.java +++ b/src/main/java/amerifrance/guideapi/api/impl/abstraction/CategoryAbstract.java @@ -2,17 +2,17 @@ import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiHome; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.HomeScreen; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.minecraft.client.renderer.RenderItem; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.List; import java.util.Map; @@ -29,7 +29,7 @@ public CategoryAbstract(Map entries, String nam } public CategoryAbstract(String name) { - this(Maps.newLinkedHashMap(), name); + this(Maps.newLinkedHashMap(), name); } /** @@ -67,8 +67,7 @@ public void addEntries(Map entries) { public void removeEntries(List keys) { for (ResourceLocation key : keys) - if (entries.containsKey(key)) - entries.remove(key); + entries.remove(key); } /** @@ -133,22 +132,22 @@ public List getTooltip() { return Lists.newArrayList(getLocalizedName()); } - @SideOnly(Side.CLIENT) - public abstract void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem); + @OnlyIn(Dist.CLIENT) + public abstract void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem); - @SideOnly(Side.CLIENT) - public abstract void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem); + @OnlyIn(Dist.CLIENT) + public abstract void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem); - public abstract boolean canSee(EntityPlayer player, ItemStack bookStack); + public abstract boolean canSee(PlayerEntity player, ItemStack bookStack); - @SideOnly(Side.CLIENT) - public abstract void onLeftClicked(Book book, int mouseX, int mouseY, EntityPlayer player, ItemStack bookStack); + @OnlyIn(Dist.CLIENT) + public abstract void onLeftClicked(Book book, double mouseX, double mouseY, PlayerEntity player, ItemStack bookStack); - @SideOnly(Side.CLIENT) - public abstract void onRightClicked(Book book, int mouseX, int mouseY, EntityPlayer player, ItemStack bookStack); + @OnlyIn(Dist.CLIENT) + public abstract void onRightClicked(Book book, double mouseX, double mouseY, PlayerEntity player, ItemStack bookStack); - @SideOnly(Side.CLIENT) - public abstract void onInit(Book book, GuiHome guiHome, EntityPlayer player, ItemStack bookStack); + @OnlyIn(Dist.CLIENT) + public abstract void onInit(Book book, HomeScreen guiHome, PlayerEntity player, ItemStack bookStack); @Override public boolean equals(Object o) { @@ -157,10 +156,7 @@ public boolean equals(Object o) { CategoryAbstract that = (CategoryAbstract) o; if (entries != null ? !entries.equals(that.entries) : that.entries != null) return false; - if (name != null ? !name.equals(that.name) : that.name != null) - return false; - - return true; + return name != null ? name.equals(that.name) : that.name == null; } @Override diff --git a/src/main/java/amerifrance/guideapi/api/impl/abstraction/EntryAbstract.java b/src/main/java/amerifrance/guideapi/api/impl/abstraction/EntryAbstract.java index c2a0827e..373735ce 100644 --- a/src/main/java/amerifrance/guideapi/api/impl/abstraction/EntryAbstract.java +++ b/src/main/java/amerifrance/guideapi/api/impl/abstraction/EntryAbstract.java @@ -3,14 +3,14 @@ import amerifrance.guideapi.api.IPage; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiCategory; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.CategoryScreen; import com.google.common.collect.Lists; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.List; @@ -18,26 +18,17 @@ public abstract class EntryAbstract { public final List pageList; public final String name; - public boolean unicode; - public EntryAbstract(List pageList, String name, boolean unicode) { + public EntryAbstract(List pageList, String name) { this.pageList = pageList; this.name = name; - this.unicode = unicode; - } - - public EntryAbstract(List pageList, String name) { - this(pageList, name, false); - } - - public EntryAbstract(String name, boolean unicode) { - this(Lists.newArrayList(), name, unicode); } public EntryAbstract(String name) { - this(name, false); + this(Lists.newArrayList(), name); } + public void addPage(IPage page) { this.pageList.add(page); } @@ -58,22 +49,22 @@ public String getLocalizedName() { return TextHelper.localizeEffect(name); } - @SideOnly(Side.CLIENT) - public abstract void draw(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer renderer); + @OnlyIn(Dist.CLIENT) + public abstract void draw(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer renderer); - @SideOnly(Side.CLIENT) - public abstract void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer renderer); + @OnlyIn(Dist.CLIENT) + public abstract void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer renderer); - public abstract boolean canSee(EntityPlayer player, ItemStack bookStack); + public abstract boolean canSee(PlayerEntity player, ItemStack bookStack); - @SideOnly(Side.CLIENT) - public abstract void onLeftClicked(Book book, CategoryAbstract category, int mouseX, int mouseY, EntityPlayer player, GuiCategory guiCategory); + @OnlyIn(Dist.CLIENT) + public abstract void onLeftClicked(Book book, CategoryAbstract category, double mouseX, double mouseY, PlayerEntity player, CategoryScreen guiCategory); - @SideOnly(Side.CLIENT) - public abstract void onRightClicked(Book book, CategoryAbstract category, int mouseX, int mouseY, EntityPlayer player, GuiCategory guiCategory); + @OnlyIn(Dist.CLIENT) + public abstract void onRightClicked(Book book, CategoryAbstract category, double mouseX, double mouseY, PlayerEntity player, CategoryScreen guiCategory); - @SideOnly(Side.CLIENT) - public abstract void onInit(Book book, CategoryAbstract category, GuiCategory guiCategory, EntityPlayer player, ItemStack bookStack); + @OnlyIn(Dist.CLIENT) + public abstract void onInit(Book book, CategoryAbstract category, CategoryScreen guiCategory, PlayerEntity player, ItemStack bookStack); @Override public boolean equals(Object o) { @@ -82,10 +73,7 @@ public boolean equals(Object o) { EntryAbstract that = (EntryAbstract) o; if (pageList != null ? !pageList.equals(that.pageList) : that.pageList != null) return false; - if (name != null ? !name.equals(that.name) : that.name != null) - return false; - - return true; + return name != null ? name.equals(that.name) : that.name == null; } @Override diff --git a/src/main/java/amerifrance/guideapi/api/package-info.java b/src/main/java/amerifrance/guideapi/api/package-info.java index 2eb9dd9b..e757efb4 100644 --- a/src/main/java/amerifrance/guideapi/api/package-info.java +++ b/src/main/java/amerifrance/guideapi/api/package-info.java @@ -1,4 +1,2 @@ -@API(owner = "guideapi", apiVersion = "@API_VERSION@", provides = "Guide-API|API") package amerifrance.guideapi.api; -import net.minecraftforge.fml.common.API; \ No newline at end of file diff --git a/src/main/java/amerifrance/guideapi/api/util/GuiHelper.java b/src/main/java/amerifrance/guideapi/api/util/GuiHelper.java index 8e863192..8b719c0d 100644 --- a/src/main/java/amerifrance/guideapi/api/util/GuiHelper.java +++ b/src/main/java/amerifrance/guideapi/api/util/GuiHelper.java @@ -1,22 +1,24 @@ package amerifrance.guideapi.api.util; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.util.ITooltipFlag.TooltipFlags; import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import org.lwjgl.opengl.GL11; import java.awt.Color; import java.util.List; -import static net.minecraft.client.renderer.GlStateManager.*; +import static com.mojang.blaze3d.platform.GlStateManager.*; + public class GuiHelper { - private static final RenderItem render = Minecraft.getMinecraft().getRenderItem(); + private static final ItemRenderer render = Minecraft.getInstance().getItemRenderer(); /** * @param mouseX - Position of the mouse on the x-axiq @@ -27,7 +29,7 @@ public class GuiHelper { * @param height - Height of the rectangle * @return whether or not the mouse is in the rectangle */ - public static boolean isMouseBetween(int mouseX, int mouseY, int x, int y, int width, int height) { + public static boolean isMouseBetween(double mouseX, double mouseY, int x, int y, int width, int height) { int xSize = x + width; int ySize = y + height; return (mouseX >= x && mouseX <= xSize && mouseY >= y && mouseY <= ySize); @@ -44,9 +46,9 @@ public static void drawItemStack(ItemStack stack, int x, int y) { blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); RenderHelper.enableGUIStandardItemLighting(); enableRescaleNormal(); - enableDepth(); + enableDepthTest(); render.renderItemAndEffectIntoGUI(stack, x, y); - render.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, stack, x, y, null); + render.renderItemOverlayIntoGUI(Minecraft.getInstance().fontRenderer, stack, x, y, null); RenderHelper.disableStandardItemLighting(); popMatrix(); disableLighting(); @@ -62,10 +64,10 @@ public static void drawScaledItemStack(ItemStack stack, int x, int y, float scal pushMatrix(); enableBlend(); blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - scale(scale, scale, 1.0F); + scalef(scale, scale, 1.0F); RenderHelper.enableGUIStandardItemLighting(); enableRescaleNormal(); - enableDepth(); + enableDepthTest();//enableDepth? render.renderItemAndEffectIntoGUI(stack, (int) (x / scale), (int) (y / scale)); RenderHelper.disableStandardItemLighting(); popMatrix(); @@ -85,7 +87,7 @@ public static void drawIconWithoutColor(int x, int y, int width, int height, flo RenderHelper.enableGUIStandardItemLighting(); disableLighting(); enableRescaleNormal(); - enableDepth(); + enableDepthTest(); Tessellator tessellator = Tessellator.getInstance(); tessellator.getBuffer().begin(7, DefaultVertexFormats.POSITION_TEX); tessellator.getBuffer().pos(x, y + height, zLevel).tex(0D, 1D).endVertex(); @@ -112,8 +114,8 @@ public static void drawIconWithColor(int x, int y, int width, int height, float RenderHelper.enableGUIStandardItemLighting(); disableLighting(); enableRescaleNormal(); - enableDepth(); - color((float) color.getRed() / 255F, (float) color.getGreen() / 255F, (float) color.getBlue() / 255F, (float) color.getAlpha() / 255F); + enableDepthTest(); + color4f((float) color.getRed() / 255F, (float) color.getGreen() / 255F, (float) color.getBlue() / 255F, (float) color.getAlpha() / 255F); Tessellator tessellator = Tessellator.getInstance(); tessellator.getBuffer().begin(7, DefaultVertexFormats.POSITION_TEX); tessellator.getBuffer().pos(x, y + height, zLevel).tex(0D, 1D).endVertex(); @@ -122,7 +124,7 @@ public static void drawIconWithColor(int x, int y, int width, int height, float tessellator.getBuffer().pos(x, y, zLevel).tex(0D, 0D).endVertex(); tessellator.draw(); RenderHelper.disableStandardItemLighting(); - color(1.0F, 1.0F, 1.0F, 1.0F); + color4f(1.0F, 1.0F, 1.0F, 1.0F); popMatrix(); } @@ -137,13 +139,13 @@ public static void drawSizedIconWithoutColor(int x, int y, int width, int height pushMatrix(); enableBlend(); blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - color(1F, 1F, 1F, 1F); - scale(0.5D, 0.5D, 0.5D); - translate(x, y, zLevel); + color4f(1F, 1F, 1F, 1F); + scaled(0.5D, 0.5D, 0.5D); + translated(x, y, zLevel); RenderHelper.enableGUIStandardItemLighting(); disableLighting(); enableRescaleNormal(); - enableDepth(); + enableDepthTest(); Tessellator tessellator = Tessellator.getInstance(); tessellator.getBuffer().begin(7, DefaultVertexFormats.POSITION_TEX); tessellator.getBuffer().pos(x, y + height, zLevel).tex(0D, 1D).endVertex(); @@ -166,13 +168,13 @@ public static void drawSizedIconWithColor(int x, int y, int width, int height, f pushMatrix(); enableBlend(); blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - scale(0.5D, 0.5D, 0.5D); - color((float) color.getRed() / 255F, (float) color.getGreen() / 255F, (float) color.getBlue() / 255F, (float) color.getAlpha() / 255F); - translate(x, y, zLevel); + scaled(0.5D, 0.5D, 0.5D); + color4f((float) color.getRed() / 255F, (float) color.getGreen() / 255F, (float) color.getBlue() / 255F, (float) color.getAlpha() / 255F); + translated(x, y, zLevel); RenderHelper.enableGUIStandardItemLighting(); disableLighting(); enableRescaleNormal(); - enableDepth(); + enableDepthTest(); Tessellator tessellator = Tessellator.getInstance(); tessellator.getBuffer().begin(7, DefaultVertexFormats.POSITION_TEX); tessellator.getBuffer().pos(x, y + height, zLevel).tex(0D, 1D).endVertex(); @@ -185,14 +187,14 @@ public static void drawSizedIconWithColor(int x, int y, int width, int height, f } @SuppressWarnings("unchecked") - public static List getTooltip(ItemStack stack) { - Minecraft mc = Minecraft.getMinecraft(); - List list = stack.getTooltip(mc.player, mc.gameSettings.advancedItemTooltips ? TooltipFlags.ADVANCED : TooltipFlags.NORMAL); + public static List getTooltip(ItemStack stack) { + Minecraft mc = Minecraft.getInstance(); + List list = stack.getTooltip(mc.player, mc.gameSettings.advancedItemTooltips ? TooltipFlags.ADVANCED : TooltipFlags.NORMAL); for (int k = 0; k < list.size(); ++k) { if (k == 0) { - list.set(k, stack.getRarity().rarityColor + list.get(k)); + list.get(k).applyTextStyle(stack.getRarity().color); } else { - list.set(k, TextFormatting.GRAY + list.get(k)); + list.get(k).applyTextStyle(TextFormatting.GRAY); } } return list; diff --git a/src/main/java/amerifrance/guideapi/api/util/IngredientCycler.java b/src/main/java/amerifrance/guideapi/api/util/IngredientCycler.java new file mode 100644 index 00000000..cb3722da --- /dev/null +++ b/src/main/java/amerifrance/guideapi/api/util/IngredientCycler.java @@ -0,0 +1,51 @@ +package amerifrance.guideapi.api.util; + + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.Random; + + +/** + * Allows convenient consistent cycling through all matching stacks of an ingredient + */ +public class IngredientCycler { + + private long lastCycle = -1; + private int cycleIdx = 0; + private Random rand = new Random(); + + public void tick(@Nonnull Minecraft mc) { + long time = mc.world != null ? mc.world.getGameTime() : 0; + if (lastCycle < 0 || lastCycle < time - 20) { + if (lastCycle > 0) { + cycleIdx++; + cycleIdx = Math.max(0, cycleIdx); + } + lastCycle = time; + } + } + + /** + * Retrieves a itemstack that matches the ingredient. + * Cycles though all matching stacks. + * Must call {@link IngredientCycler#tick(Minecraft)} before (e.g. once per onDraw) + * + * @param ingredient The ingredient + * @param index An "unique" id for this ingredient, so multiple ingredients can be cycled independently + * @return Optional. Can be empty if ingredient is invalid and has no matching stacks + */ + public Optional getCycledIngredientStack(@Nonnull Ingredient ingredient, int index) { + ItemStack[] itemStacks = ingredient.getMatchingStacks(); + if (itemStacks.length > 0) { + rand.setSeed(index); + int id = (index + rand.nextInt(itemStacks.length) + cycleIdx) % itemStacks.length; + return Optional.of(itemStacks[id]); + } + return Optional.empty(); + } +} diff --git a/src/main/java/amerifrance/guideapi/api/util/PageHelper.java b/src/main/java/amerifrance/guideapi/api/util/PageHelper.java index f4cf31ea..c48b3df7 100644 --- a/src/main/java/amerifrance/guideapi/api/util/PageHelper.java +++ b/src/main/java/amerifrance/guideapi/api/util/PageHelper.java @@ -1,8 +1,7 @@ package amerifrance.guideapi.api.util; import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.Page; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import amerifrance.guideapi.page.PageItemStack; import amerifrance.guideapi.page.PageText; import net.minecraft.block.Block; @@ -11,52 +10,77 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.Ingredient; import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class PageHelper { - public static List setPagesToUnicode(List pages) { - for (IPage page : pages) - if (page instanceof Page) - ((Page) page).setUnicodeFlag(true); - return pages; - } + /** + * Split the given text into multiple section if it does not fit one page. + * The first page can have a different number of lines than the subsequent ones if desired + * Insert new line characters to wrap the text to the available line width. + * + * @param locText Text to process + * @param lineWidth Available width (pixel) + * @param firstHeight Available height on the first page (pixel) + * @param subsequentHeight Available height on subsequent pages (pixel) + * @return Each list element should be drawn on a individual page. Lines are wrapped using '\n' + */ + public static List prepareForLongText(String locText, int lineWidth, int firstHeight, int subsequentHeight) { + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; + int firstCount = firstHeight / fontRenderer.FONT_HEIGHT; + int count = subsequentHeight / fontRenderer.FONT_HEIGHT; + List lines = new ArrayList<>(); + Arrays.stream(locText.split("\n")).forEach(l -> lines.addAll(fontRenderer.listFormattedStringToWidth(l, lineWidth))); //Make sure to also split at manually specified newlines + List pages = new ArrayList<>(); - public static List pagesForLongText(String locText, int maxLength) { - List pageList = new ArrayList(); - for (String s : WordUtils.wrap(locText, maxLength, "/cut", false).split("/cut")) pageList.add(new PageText(s)); - return pageList; + List pageLines = lines.size() > firstCount ? lines.subList(0, firstCount) : lines; + pages.add(StringUtils.join(pageLines, "\n")); + pageLines.clear(); + while (lines.size() > 0) { + pageLines = lines.size() > count ? lines.subList(0, count) : lines; + pages.add(StringUtils.join(pageLines, "\n")); + pageLines.clear(); + } + return pages; } /** - * @param locText - Text - * @return a list of IPages with the text cut to fit on page + * Spread the text over multiple pages if necessary. Display ingredient at first page */ - public static List pagesForLongText(String locText) { - return pagesForLongText(locText, 450); + public static List pagesForLongText(String locText, Ingredient ingredient) { + List pageText = prepareForLongText(locText, 164, 81, 120); + List pageList = new ArrayList<>(); + for (int i = 0; i < pageText.size(); i++) { + if (i == 0) { + pageList.add(new PageItemStack(pageText.get(i), ingredient)); + } else { + pageList.add(new PageText(pageText.get(i))); + } + } + return pageList; } - public static List pagesForLongText(String locText, ItemStack stack) { - List pageList = new ArrayList(); - String[] strings = WordUtils.wrap(locText, 450, "/cut", false).split("/cut"); - for (int i = 0; i < strings.length; i++) { - if (i == 0) pageList.add(new PageItemStack(strings[i], stack)); - else pageList.add(new PageText(strings[i])); - } + + public static List pagesForLongText(String locText) { + List pageList = new ArrayList<>(); + prepareForLongText(locText, 164, 126, 126).forEach(t -> pageList.add(new PageText(t))); return pageList; } - public static void drawFormattedText(int x, int y, GuiBase guiBase, String toDraw) { - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + + public static void drawFormattedText(int x, int y, BaseScreen guiBase, String toDraw) { + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; toDraw = StringEscapeUtils.unescapeJava(toDraw).replaceAll("\\t", " "); String[] lines = toDraw.split("\n"); for (String line : lines) { - List cutLines = fontRenderer.listFormattedStringToWidth(line, 3 * guiBase.xSize / 5); + List cutLines = fontRenderer.listFormattedStringToWidth(line, 170); for (String cut : cutLines) { fontRenderer.drawString(cut, x, y, 0); y += 10; @@ -82,6 +106,15 @@ public static List pagesForLongText(String locText, Block block) { return pagesForLongText(locText, new ItemStack(block)); } + /** + * @param locText - Text + * @param item - The stack to put on the first page + * @return a list of IPages with the text cut to fit on page + */ + public static List pagesForLongText(String locText, ItemStack item) { + return pagesForLongText(locText, Ingredient.fromStacks(item)); + } + /** * @param recipe1 - The first IRecipe to compare * @param recipe2 - The second IRecipe to compare @@ -91,8 +124,7 @@ public static boolean areIRecipesEqual(IRecipe recipe1, IRecipe recipe2) { if (recipe1 == recipe2) return true; if (recipe1 == null || recipe2 == null || recipe1.getClass() != recipe2.getClass()) return false; if (recipe1.equals(recipe2)) return true; - if (!recipe1.getRecipeOutput().isItemEqual(recipe2.getRecipeOutput())) return false; + return recipe1.getRecipeOutput().isItemEqual(recipe2.getRecipeOutput()); // if (recipe1.getRecipeSize() != recipe2.getRecipeSize()) return false;//FN was removed, there is no size now - return true; } } diff --git a/src/main/java/amerifrance/guideapi/api/util/TextHelper.java b/src/main/java/amerifrance/guideapi/api/util/TextHelper.java index 2f225549..bf6a6c34 100644 --- a/src/main/java/amerifrance/guideapi/api/util/TextHelper.java +++ b/src/main/java/amerifrance/guideapi/api/util/TextHelper.java @@ -1,6 +1,6 @@ package amerifrance.guideapi.api.util; -import net.minecraft.util.text.translation.I18n; +import net.minecraftforge.fml.ForgeI18n; import org.apache.commons.lang3.text.WordUtils; import java.util.ArrayList; @@ -13,7 +13,7 @@ public static String getFormattedText(String string) { } public static String localize(String input, Object... format) { - return I18n.translateToLocalFormatted(input, format); + return ForgeI18n.parseMessage(input, format); } public static String localizeEffect(String input, Object... format) { diff --git a/src/main/java/amerifrance/guideapi/button/ButtonBack.java b/src/main/java/amerifrance/guideapi/button/ButtonBack.java index d08f1114..6c258196 100644 --- a/src/main/java/amerifrance/guideapi/button/ButtonBack.java +++ b/src/main/java/amerifrance/guideapi/button/ButtonBack.java @@ -4,36 +4,36 @@ import amerifrance.guideapi.api.button.ButtonGuideAPI; import amerifrance.guideapi.api.util.GuiHelper; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; +import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.client.config.GuiUtils; import java.util.ArrayList; import java.util.List; public class ButtonBack extends ButtonGuideAPI { - public ButtonBack(int id, int x, int y, GuiBase guiBase) { - super(id, x, y, guiBase); - width = 18; - height = 10; + public ButtonBack(int widthIn, int heightIn, Button.IPressable onPress, BaseScreen guiBase) { + super(widthIn, heightIn, 18, 10, onPress, guiBase); } @Override - public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) { + public void renderButton(int mouseX, int mouseY, float partialTicks) { if (this.visible) { RenderHelper.enableGUIStandardItemLighting(); GlStateManager.enableBlend(); GlStateManager.disableLighting(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - minecraft.getTextureManager().bindTexture(new ResourceLocation(GuideMod.ID, "textures/gui/book_colored.png")); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation(GuideMod.ID, "textures/gui/book_colored.png")); if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height)) { - this.drawTexturedModalRect(x, y + 1, 70, 201, 18, 10); - guiBase.drawHoveringText(getHoveringText(), mouseX, mouseY, Minecraft.getMinecraft().fontRenderer); + this.blit(x, y + 1, 70, 201, 18, 10); + GuiUtils.drawHoveringText(getHoveringText(), mouseX, mouseY, guiBase.width, guiBase.height, -1, Minecraft.getInstance().fontRenderer); } else { - this.drawTexturedModalRect(x, y, 94, 201, 18, 10); + this.blit(x, y, 94, 201, 18, 10); } GlStateManager.disableBlend(); RenderHelper.disableStandardItemLighting(); @@ -42,7 +42,7 @@ public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partia public List getHoveringText() { ArrayList list = new ArrayList(); - String s = TextHelper.localizeEffect("button.back.name"); + String s = TextHelper.localizeEffect("guideapi.button.back"); list.add(s); return list; } diff --git a/src/main/java/amerifrance/guideapi/button/ButtonNext.java b/src/main/java/amerifrance/guideapi/button/ButtonNext.java index ca9f2244..343e1b04 100644 --- a/src/main/java/amerifrance/guideapi/button/ButtonNext.java +++ b/src/main/java/amerifrance/guideapi/button/ButtonNext.java @@ -4,45 +4,44 @@ import amerifrance.guideapi.api.button.ButtonGuideAPI; import amerifrance.guideapi.api.util.GuiHelper; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; +import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.client.config.GuiUtils; import java.util.ArrayList; import java.util.List; public class ButtonNext extends ButtonGuideAPI { - public ButtonNext(int id, int x, int y, GuiBase guiBase) { - super(id, x, y, guiBase); - width = 18; - height = 10; + public ButtonNext(int widthIn, int heightIn, Button.IPressable onPress, BaseScreen guiBase) { + super(widthIn, heightIn, 18, 10, onPress, guiBase); } @Override - public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) { - if (this.visible) { - RenderHelper.enableGUIStandardItemLighting(); - GlStateManager.enableBlend(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GlStateManager.disableLighting(); - minecraft.getTextureManager().bindTexture(new ResourceLocation(GuideMod.ID, "textures/gui/book_colored.png")); - if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height)) { - this.drawTexturedModalRect(x, y + 1, 47, 201, 18, 10); - guiBase.drawHoveringText(getHoveringText(), mouseX, mouseY, Minecraft.getMinecraft().fontRenderer); - } else { - this.drawTexturedModalRect(x, y, 24, 201, 18, 10); - } - GlStateManager.disableBlend(); - RenderHelper.disableStandardItemLighting(); + public void renderButton(int mouseX, int mouseY, float partialTicks) { + RenderHelper.enableGUIStandardItemLighting(); + GlStateManager.enableBlend(); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.disableLighting(); + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation(GuideMod.ID, "textures/gui/book_colored.png")); + if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height)) { + this.blit(x, y + 1, 47, 201, 18, 10); + GuiUtils.drawHoveringText(getHoveringText(), mouseX, mouseY, guiBase.width, guiBase.height, -1, Minecraft.getInstance().fontRenderer); + } else { + this.blit(x, y, 24, 201, 18, 10); } + GlStateManager.disableBlend(); + RenderHelper.disableStandardItemLighting(); + } public List getHoveringText() { ArrayList list = new ArrayList(); - list.add(TextHelper.localizeEffect("button.next.name")); + list.add(TextHelper.localizeEffect("guideapi.button.next")); return list; } } diff --git a/src/main/java/amerifrance/guideapi/button/ButtonPrev.java b/src/main/java/amerifrance/guideapi/button/ButtonPrev.java index 50e9f738..97b804d4 100644 --- a/src/main/java/amerifrance/guideapi/button/ButtonPrev.java +++ b/src/main/java/amerifrance/guideapi/button/ButtonPrev.java @@ -4,36 +4,36 @@ import amerifrance.guideapi.api.button.ButtonGuideAPI; import amerifrance.guideapi.api.util.GuiHelper; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; +import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.client.config.GuiUtils; import java.util.ArrayList; import java.util.List; public class ButtonPrev extends ButtonGuideAPI { - public ButtonPrev(int id, int x, int y, GuiBase guiBase) { - super(id, x, y, guiBase); - width = 18; - height = 10; + public ButtonPrev(int widthIn, int heightIn, Button.IPressable onPress, BaseScreen guiBase) { + super(widthIn, heightIn, 18, 10, onPress, guiBase); } @Override - public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) { + public void renderButton(int mouseX, int mouseY, float partialTicks) { if (this.visible) { RenderHelper.enableGUIStandardItemLighting(); GlStateManager.enableBlend(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.disableLighting(); - minecraft.getTextureManager().bindTexture(new ResourceLocation(GuideMod.ID, "textures/gui/book_colored.png")); + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation(GuideMod.ID, "textures/gui/book_colored.png")); if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height)) { - this.drawTexturedModalRect(x, y + 1, 47, 214, 18, 10); - guiBase.drawHoveringText(getHoveringText(), mouseX, mouseY, Minecraft.getMinecraft().fontRenderer); + this.blit(x, y + 1, 47, 214, 18, 10); + GuiUtils.drawHoveringText(getHoveringText(), mouseX, mouseY, guiBase.width, guiBase.height, -1, Minecraft.getInstance().fontRenderer); } else { - this.drawTexturedModalRect(x, y, 24, 214, 18, 10); + this.blit(x, y, 24, 214, 18, 10); } GlStateManager.disableBlend(); RenderHelper.disableStandardItemLighting(); @@ -42,7 +42,7 @@ public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partia public List getHoveringText() { ArrayList list = new ArrayList(); - list.add(TextHelper.localizeEffect("button.prev.name")); + list.add(TextHelper.localizeEffect("guideapi.button.prev")); return list; } } \ No newline at end of file diff --git a/src/main/java/amerifrance/guideapi/button/ButtonSearch.java b/src/main/java/amerifrance/guideapi/button/ButtonSearch.java index 2183af1f..c7055aff 100644 --- a/src/main/java/amerifrance/guideapi/button/ButtonSearch.java +++ b/src/main/java/amerifrance/guideapi/button/ButtonSearch.java @@ -4,32 +4,32 @@ import amerifrance.guideapi.api.button.ButtonGuideAPI; import amerifrance.guideapi.api.util.GuiHelper; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; +import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.renderer.RenderHelper; +import net.minecraftforge.fml.client.config.GuiUtils; import java.util.ArrayList; import java.util.List; public class ButtonSearch extends ButtonGuideAPI { - public ButtonSearch(int id, int x, int y, GuiBase guiBase) { - super(id, x, y, guiBase); - width = 15; - height = 15; + public ButtonSearch(int widthIn, int heightIn, Button.IPressable onPress, BaseScreen guiBase) { + super(widthIn, heightIn, 15, 15, onPress, guiBase); } @Override - public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) { + public void renderButton(int mouseX, int mouseY, float partialTicks) { if (this.visible) { RenderHelper.enableGUIStandardItemLighting(); GlStateManager.enableBlend(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); GlStateManager.disableLighting(); if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height)) { SubTexture.MAGNIFYING_GLASS.draw(x, y + 1); - guiBase.drawHoveringText(getHoveringText(), mouseX, mouseY, Minecraft.getMinecraft().fontRenderer); + GuiUtils.drawHoveringText(getHoveringText(), mouseX, mouseY, guiBase.width, guiBase.height, -1, Minecraft.getInstance().fontRenderer); } else { SubTexture.MAGNIFYING_GLASS.draw(x, y); } @@ -40,7 +40,7 @@ public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) public List getHoveringText() { ArrayList list = new ArrayList(); - list.add(TextHelper.localizeEffect("button.search.name")); + list.add(TextHelper.localizeEffect("guideapi.button.search")); return list; } } diff --git a/src/main/java/amerifrance/guideapi/category/CategoryItemStack.java b/src/main/java/amerifrance/guideapi/category/CategoryItemStack.java index 9d6aba3e..951b53e3 100644 --- a/src/main/java/amerifrance/guideapi/category/CategoryItemStack.java +++ b/src/main/java/amerifrance/guideapi/category/CategoryItemStack.java @@ -4,13 +4,12 @@ import amerifrance.guideapi.api.impl.Category; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderItem; +import amerifrance.guideapi.gui.BaseScreen; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.Map; @@ -29,16 +28,16 @@ public CategoryItemStack(String name, ItemStack stack) { } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem) { + @OnlyIn(Dist.CLIENT) + public void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem) { GuiHelper.drawScaledItemStack(this.stack, categoryX, categoryY, 1.5F); } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem) { if (canSee(guiBase.player, guiBase.bookStack) && GuiHelper.isMouseBetween(mouseX, mouseY, categoryX, categoryY, categoryWidth, categoryHeight)) - guiBase.drawHoveringText(this.getTooltip(), mouseX, mouseY, Minecraft.getMinecraft().fontRenderer); + guiBase.renderTooltip(this.getTooltip(), mouseX, mouseY); } @Override diff --git a/src/main/java/amerifrance/guideapi/category/CategoryResourceLocation.java b/src/main/java/amerifrance/guideapi/category/CategoryResourceLocation.java index 79ef78b8..908a5a1a 100644 --- a/src/main/java/amerifrance/guideapi/category/CategoryResourceLocation.java +++ b/src/main/java/amerifrance/guideapi/category/CategoryResourceLocation.java @@ -4,12 +4,12 @@ import amerifrance.guideapi.api.impl.Category; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderItem; +import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.Map; @@ -28,17 +28,17 @@ public CategoryResourceLocation(String name, ResourceLocation resourceLocation) } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem) { - Minecraft.getMinecraft().getTextureManager().bindTexture(resourceLocation); + @OnlyIn(Dist.CLIENT) + public void draw(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem) { + Minecraft.getInstance().getTextureManager().bindTexture(resourceLocation); GuiHelper.drawSizedIconWithoutColor(categoryX, categoryY, 48, 48, 0); } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, GuiBase guiBase, boolean drawOnLeft, RenderItem renderItem) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, int categoryX, int categoryY, int categoryWidth, int categoryHeight, int mouseX, int mouseY, BaseScreen guiBase, boolean drawOnLeft, ItemRenderer renderItem) { if (canSee(guiBase.player, guiBase.bookStack) && GuiHelper.isMouseBetween(mouseX, mouseY, categoryX, categoryY, categoryWidth, categoryHeight)) - guiBase.drawHoveringText(this.getTooltip(), mouseX, mouseY, Minecraft.getMinecraft().fontRenderer); + guiBase.renderTooltip(this.getTooltip(), mouseX, mouseY); } @Override diff --git a/src/main/java/amerifrance/guideapi/entry/EntryItemStack.java b/src/main/java/amerifrance/guideapi/entry/EntryItemStack.java index a401355f..448e610d 100644 --- a/src/main/java/amerifrance/guideapi/entry/EntryItemStack.java +++ b/src/main/java/amerifrance/guideapi/entry/EntryItemStack.java @@ -5,11 +5,11 @@ import amerifrance.guideapi.api.impl.Entry; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.List; @@ -17,28 +17,20 @@ public class EntryItemStack extends Entry { public ItemStack stack; - public EntryItemStack(List pageList, String name, ItemStack stack, boolean unicode) { - super(pageList, name, unicode); - this.stack = stack; - } - public EntryItemStack(List pageList, String name, ItemStack stack) { - this(pageList, name, stack, false); - } - - public EntryItemStack(String name, boolean unicode, ItemStack stack) { - super(name, unicode); + super(pageList, name); this.stack = stack; } + public EntryItemStack(String name, ItemStack stack) { super(name); this.stack = stack; } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { if (stack != null) GuiHelper.drawScaledItemStack(stack, entryX + 2, entryY, 0.5F); diff --git a/src/main/java/amerifrance/guideapi/entry/EntryResourceLocation.java b/src/main/java/amerifrance/guideapi/entry/EntryResourceLocation.java index 7d5ade2b..677a8852 100644 --- a/src/main/java/amerifrance/guideapi/entry/EntryResourceLocation.java +++ b/src/main/java/amerifrance/guideapi/entry/EntryResourceLocation.java @@ -5,12 +5,12 @@ import amerifrance.guideapi.api.impl.Entry; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import java.util.List; @@ -18,18 +18,9 @@ public class EntryResourceLocation extends Entry { public ResourceLocation image; - public EntryResourceLocation(List pageList, String name, ResourceLocation resourceLocation, boolean unicode) { - super(pageList, name, unicode); - this.image = resourceLocation; - } - public EntryResourceLocation(List pageList, String name, ResourceLocation resourceLocation) { - this(pageList, name, resourceLocation, false); - } - - public EntryResourceLocation(String name, boolean unicode, ResourceLocation image) { - super(name, unicode); - this.image = image; + super(pageList, name); + this.image = resourceLocation; } public EntryResourceLocation(String name, ResourceLocation image) { @@ -38,9 +29,9 @@ public EntryResourceLocation(String name, ResourceLocation image) { } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - Minecraft.getMinecraft().getTextureManager().bindTexture(image); + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + Minecraft.getInstance().getTextureManager().bindTexture(image); GuiHelper.drawSizedIconWithoutColor(entryX + 2, entryY, 16, 16, 1F); super.drawExtras(book, category, entryX, entryY, entryWidth, entryHeight, mouseX, mouseY, guiBase, fontRendererObj); diff --git a/src/main/java/amerifrance/guideapi/gui/BaseScreen.java b/src/main/java/amerifrance/guideapi/gui/BaseScreen.java new file mode 100644 index 00000000..94c4fa41 --- /dev/null +++ b/src/main/java/amerifrance/guideapi/gui/BaseScreen.java @@ -0,0 +1,93 @@ +package amerifrance.guideapi.gui; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraftforge.fml.client.config.GuiUtils; +import org.lwjgl.glfw.GLFW; +import org.lwjgl.opengl.GL11; + +import java.awt.Color; +import java.util.List; +import java.util.stream.Collectors; + +import static com.mojang.blaze3d.platform.GlStateManager.*; + + +public class BaseScreen extends Screen { + + public int guiLeft, guiTop; + public int xSize = 245; + public int ySize = 192; + public PlayerEntity player; + public ItemStack bookStack; + public float publicZLevel; + + public BaseScreen(ITextComponent title, PlayerEntity player, ItemStack bookStack) { + super(title); + this.player = player; + this.bookStack = bookStack; + this.publicZLevel = blitOffset; + } + + @Override + public boolean isPauseScreen() { + return false; + } + + @Override + public boolean keyPressed(int p_keyPressed_1_, int p_keyPressed_2_, int p_keyPressed_3_) { + if (minecraft != null && (p_keyPressed_1_ == GLFW.GLFW_KEY_ESCAPE || p_keyPressed_1_ == this.minecraft.gameSettings.keyBindInventory.getKey().getKeyCode())) { + this.onClose(); + this.minecraft.setGameFocused(true); + return true; + } else { + return super.keyPressed(p_keyPressed_1_, p_keyPressed_2_, p_keyPressed_3_); + } + } + + public void drawTexturedModalRectWithColor(int x, int y, int textureX, int textureY, int width, int height, Color color) { + pushMatrix(); + enableBlend(); + blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + float f = 0.00390625F; + float f1 = 0.00390625F; + disableLighting(); + color3f((float) color.getRed() / 255F, (float) color.getGreen() / 255F, (float) color.getBlue() / 255F); + Tessellator tessellator = Tessellator.getInstance(); + tessellator.getBuffer().begin(7, DefaultVertexFormats.POSITION_TEX); + tessellator.getBuffer().pos(x, y + height, this.blitOffset).tex((float) (textureX) * f, (float) (textureY + height) * f1).endVertex(); + tessellator.getBuffer().pos(x + width, y + height, this.blitOffset).tex((float) (textureX + width) * f, (float) (textureY + height) * f1).endVertex(); + tessellator.getBuffer().pos(x + width, y, this.blitOffset).tex((float) (textureX + width) * f, (float) (textureY) * f1).endVertex(); + tessellator.getBuffer().pos(x, y, this.blitOffset).tex((float) (textureX) * f, (float) (textureY) * f1).endVertex(); + tessellator.draw(); + disableBlend(); + popMatrix(); + } + + @Override + public void drawCenteredString(FontRenderer fontRendererObj, String string, int x, int y, int color) { + RenderHelper.disableStandardItemLighting(); + fontRendererObj.drawString(string, x - fontRendererObj.getStringWidth(string) / 2f, y, color); + RenderHelper.disableStandardItemLighting(); + } + + public void drawCenteredStringWithShadow(FontRenderer fontRendererObj, String string, int x, int y, int color) { + super.drawCenteredString(fontRendererObj, string, x, y, color); + } + + public void drawHoveringTextComponents(List tooltip, int mouseX, int mouseY) { + this.drawHoveringText(tooltip.stream().map(ITextComponent::getFormattedText).collect(Collectors.toList()), mouseX, mouseY); + } + + public void drawHoveringText(List tooltip, int mouseX, int mouseY) { + GuiUtils.drawHoveringText(tooltip, mouseX, mouseY, width, height, -1, font); + } + + +} diff --git a/src/main/java/amerifrance/guideapi/gui/GuiCategory.java b/src/main/java/amerifrance/guideapi/gui/CategoryScreen.java similarity index 58% rename from src/main/java/amerifrance/guideapi/gui/GuiCategory.java rename to src/main/java/amerifrance/guideapi/gui/CategoryScreen.java index 7c73586c..99e8bf7b 100644 --- a/src/main/java/amerifrance/guideapi/gui/GuiCategory.java +++ b/src/main/java/amerifrance/guideapi/gui/CategoryScreen.java @@ -12,22 +12,18 @@ import amerifrance.guideapi.wrapper.EntryWrapper; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; - -import java.awt.Color; -import java.io.IOException; -import java.util.List; +import net.minecraft.util.text.TranslationTextComponent; +import org.lwjgl.glfw.GLFW; import javax.annotation.Nullable; +import java.awt.*; +import java.util.List; -public class GuiCategory extends GuiBase { +public class CategoryScreen extends BaseScreen { public ResourceLocation outlineTexture; public ResourceLocation pageTexture; @@ -39,10 +35,11 @@ public class GuiCategory extends GuiBase { public ButtonPrev buttonPrev; public ButtonSearch buttonSearch; public int entryPage; - @Nullable public EntryAbstract startEntry; + @Nullable + public EntryAbstract startEntry; - public GuiCategory(Book book, CategoryAbstract category, EntityPlayer player, ItemStack bookStack, @Nullable EntryAbstract startEntry) { - super(player, bookStack); + public CategoryScreen(Book book, CategoryAbstract category, PlayerEntity player, ItemStack bookStack, @Nullable EntryAbstract startEntry) { + super(new TranslationTextComponent(category.name), player, bookStack); this.book = book; this.category = category; this.pageTexture = book.getPageTexture(); @@ -52,18 +49,28 @@ public GuiCategory(Book book, CategoryAbstract category, EntityPlayer player, It } @Override - public void initGui() { - super.initGui(); - this.buttonList.clear(); + public void init() { this.entryWrapperMap.clear(); guiLeft = (this.width - this.xSize) / 2; guiTop = (this.height - this.ySize) / 2; - this.buttonList.add(buttonBack = new ButtonBack(0, guiLeft + xSize / 6, guiTop, this)); - this.buttonList.add(buttonNext = new ButtonNext(1, guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, this)); - this.buttonList.add(buttonPrev = new ButtonPrev(2, guiLeft + xSize / 5, guiTop + 5 * ySize / 6, this)); - this.buttonList.add(buttonSearch = new ButtonSearch(3, (guiLeft + xSize / 6) - 25, guiTop + 5, this)); + addButton(buttonBack = new ButtonBack(guiLeft + xSize / 6, guiTop, (btn) -> { + this.minecraft.displayGuiScreen(new HomeScreen(book, player, bookStack)); + }, this)); + addButton(buttonNext = new ButtonNext(guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, (btn) -> { + if (entryPage + 1 < entryWrapperMap.asMap().size()) { + nextPage(); + } + }, this)); + addButton(buttonPrev = new ButtonPrev(guiLeft + xSize / 5, guiTop + 5 * ySize / 6, (btn) -> { + if (entryPage > 0) { + prevPage(); + } + }, this)); + addButton(buttonSearch = new ButtonSearch((guiLeft + xSize / 6) - 25, guiTop + 5, (btn) -> { + this.minecraft.displayGuiScreen(new SearchScreen(book, player, bookStack, this)); + }, this)); int eX = guiLeft + 37; int eY = guiTop + 15; @@ -72,7 +79,7 @@ public void initGui() { List entries = Lists.newArrayList(category.entries.values()); for (EntryAbstract entry : entries) { entry.onInit(book, category, this, player, bookStack); - entryWrapperMap.put(pageNumber, new EntryWrapper(this, book, category, entry, eX, eY, 4 * xSize / 6, 10, player, this.fontRenderer, bookStack)); + entryWrapperMap.put(pageNumber, new EntryWrapper(this, book, category, entry, eX, eY, 4 * xSize / 6, 10, player, this.font, bookStack)); if (entry.equals(this.startEntry)) { this.startEntry = null; this.entryPage = pageNumber; @@ -89,10 +96,10 @@ public void initGui() { } @Override - public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) { - Minecraft.getMinecraft().getTextureManager().bindTexture(pageTexture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - Minecraft.getMinecraft().getTextureManager().bindTexture(outlineTexture); + public void render(int mouseX, int mouseY, float renderPartialTicks) { + minecraft.getTextureManager().bindTexture(pageTexture); + blit(guiLeft, guiTop, 0, 0, xSize, ySize); + minecraft.getTextureManager().bindTexture(outlineTexture); drawTexturedModalRectWithColor(guiLeft, guiTop, 0, 0, xSize, ySize, book.getColor()); entryPage = MathHelper.clamp(entryPage, 0, entryWrapperMap.size() - 1); @@ -107,18 +114,18 @@ public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) { } } - drawCenteredString(fontRenderer, String.format("%d/%d", entryPage + 1, entryWrapperMap.asMap().size()), guiLeft + xSize / 2, guiTop + 5 * ySize / 6, 0); - drawCenteredStringWithShadow(fontRenderer, category.getLocalizedName(), guiLeft + xSize / 2, guiTop - 10, Color.WHITE.getRGB()); + drawCenteredString(font, String.format("%d/%d", entryPage + 1, entryWrapperMap.asMap().size()), guiLeft + xSize / 2, guiTop + 5 * ySize / 6, 0); + drawCenteredStringWithShadow(font, category.getLocalizedName(), guiLeft + xSize / 2, guiTop - 10, Color.WHITE.getRGB()); buttonPrev.visible = entryPage != 0; buttonNext.visible = entryPage != entryWrapperMap.asMap().size() - 1 && !entryWrapperMap.asMap().isEmpty(); - super.drawScreen(mouseX, mouseY, renderPartialTicks); + super.render(mouseX, mouseY, renderPartialTicks); } @Override - public void mouseClicked(int mouseX, int mouseY, int typeofClick) throws IOException { - super.mouseClicked(mouseX, mouseY, typeofClick); + public boolean mouseClicked(double mouseX, double mouseY, int typeofClick) { + boolean ret = super.mouseClicked(mouseX, mouseY, typeofClick); for (EntryWrapper wrapper : this.entryWrapperMap.get(entryPage)) { if (wrapper.isMouseOnWrapper(mouseX, mouseY) && wrapper.canPlayerSee()) { @@ -129,46 +136,41 @@ else if (typeofClick == 1) } if (typeofClick == 1) - this.mc.displayGuiScreen(new GuiHome(book, player, bookStack)); + this.minecraft.displayGuiScreen(new HomeScreen(book, player, bookStack)); + return ret; } @Override - public void handleMouseInput() throws IOException { - super.handleMouseInput(); - - int movement = Mouse.getEventDWheel(); + public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3_, double movement) { if (movement < 0) nextPage(); else if (movement > 0) prevPage(); - } - @Override - public void keyTyped(char typedChar, int keyCode) { - super.keyTyped(typedChar, keyCode); - if (keyCode == Keyboard.KEY_BACK || keyCode == this.mc.gameSettings.keyBindUseItem.getKeyCode()) - this.mc.displayGuiScreen(new GuiHome(book, player, bookStack)); - if ((keyCode == Keyboard.KEY_UP || keyCode == Keyboard.KEY_RIGHT) && entryPage + 1 < entryWrapperMap.asMap().size()) - nextPage(); - if ((keyCode == Keyboard.KEY_DOWN || keyCode == Keyboard.KEY_LEFT) && entryPage > 0) - prevPage(); + return movement != 0 || super.mouseScrolled(p_mouseScrolled_1_, p_mouseScrolled_3_, movement); } @Override - public void actionPerformed(GuiButton button) { - if (button.id == 0) - this.mc.displayGuiScreen(new GuiHome(book, player, bookStack)); - else if (button.id == 1 && entryPage + 1 < entryWrapperMap.asMap().size()) + public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) { + if (keyCode == GLFW.GLFW_KEY_BACKSPACE || keyCode == this.minecraft.gameSettings.keyBindUseItem.getKey().getKeyCode()) { + this.minecraft.displayGuiScreen(new HomeScreen(book, player, bookStack)); + return true; + } else if ((keyCode == GLFW.GLFW_KEY_UP || keyCode == GLFW.GLFW_KEY_RIGHT) && entryPage + 1 < entryWrapperMap.asMap().size()) { + + nextPage(); - else if (button.id == 2 && entryPage > 0) + return true; + } else if ((keyCode == GLFW.GLFW_KEY_DOWN || keyCode == GLFW.GLFW_KEY_LEFT) && entryPage > 0) { prevPage(); - else if (button.id == 3) - this.mc.displayGuiScreen(new GuiSearch(book, player, bookStack, this)); + return true; + } + return super.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); } + @Override - public void onGuiClosed() { - super.onGuiClosed(); + public void onClose() { + super.onClose(); PacketHandler.INSTANCE.sendToServer(new PacketSyncCategory(book.getCategoryList().indexOf(category), entryPage)); } diff --git a/src/main/java/amerifrance/guideapi/gui/EntryScreen.java b/src/main/java/amerifrance/guideapi/gui/EntryScreen.java new file mode 100644 index 00000000..0f2d653e --- /dev/null +++ b/src/main/java/amerifrance/guideapi/gui/EntryScreen.java @@ -0,0 +1,188 @@ +package amerifrance.guideapi.gui; + +import amerifrance.guideapi.api.IPage; +import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; +import amerifrance.guideapi.button.ButtonBack; +import amerifrance.guideapi.button.ButtonNext; +import amerifrance.guideapi.button.ButtonPrev; +import amerifrance.guideapi.button.ButtonSearch; +import amerifrance.guideapi.network.PacketHandler; +import amerifrance.guideapi.network.PacketSyncEntry; +import amerifrance.guideapi.wrapper.PageWrapper; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.TranslationTextComponent; +import org.lwjgl.glfw.GLFW; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class EntryScreen extends BaseScreen { + + public ResourceLocation outlineTexture; + public ResourceLocation pageTexture; + public Book book; + public CategoryAbstract category; + public EntryAbstract entry; + public List pageWrapperList = new ArrayList(); + public ButtonBack buttonBack; + public ButtonNext buttonNext; + public ButtonPrev buttonPrev; + public ButtonSearch buttonSearch; + public int pageNumber; + + public EntryScreen(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack) { + super(new TranslationTextComponent(entry.name), player, bookStack); + this.book = book; + this.category = category; + this.entry = entry; + this.pageTexture = book.getPageTexture(); + this.outlineTexture = book.getOutlineTexture(); + this.pageNumber = 0; + } + + + @Override + public void init() { + super.init(); + entry.onInit(book, category, null, player, bookStack); + this.pageWrapperList.clear(); + + guiLeft = (this.width - this.xSize) / 2; + guiTop = (this.height - this.ySize) / 2; + + addButton(buttonBack = new ButtonBack(guiLeft + xSize / 6, guiTop, (btn) -> { + this.minecraft.displayGuiScreen(new CategoryScreen(book, category, player, bookStack, entry)); + + }, this)); + addButton(buttonNext = new ButtonNext(guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, (btn) -> { + if (pageNumber + 1 < pageWrapperList.size()) { + nextPage(); + } + }, this)); + addButton(buttonPrev = new ButtonPrev(guiLeft + xSize / 5, guiTop + 5 * ySize / 6, (btn) -> { + if (pageNumber > 0) { + prevPage(); + } + }, this)); + addButton(buttonSearch = new ButtonSearch((guiLeft + xSize / 6) - 25, guiTop + 5, (btn) -> { + this.minecraft.displayGuiScreen(new SearchScreen(book, player, bookStack, this)); + }, this)); + + for (IPage page : this.entry.pageList) { + page.onInit(book, category, entry, player, bookStack, this); + pageWrapperList.add(new PageWrapper(this, book, category, entry, page, guiLeft, guiTop, player, this.font, bookStack)); + } + } + + @Override + public void render(int mouseX, int mouseY, float renderPartialTicks) { + Minecraft.getInstance().getTextureManager().bindTexture(pageTexture); + blit(guiLeft, guiTop, 0, 0, xSize, ySize); + Minecraft.getInstance().getTextureManager().bindTexture(outlineTexture); + drawTexturedModalRectWithColor(guiLeft, guiTop, 0, 0, xSize, ySize, book.getColor()); + + pageNumber = MathHelper.clamp(pageNumber, 0, pageWrapperList.size() - 1); + + if (pageNumber < pageWrapperList.size()) { + if (pageWrapperList.get(pageNumber).canPlayerSee()) { + pageWrapperList.get(pageNumber).draw(mouseX, mouseY, this); + pageWrapperList.get(pageNumber).drawExtras(mouseX, mouseY, this); + } + } + + drawCenteredString(font, String.format("%d/%d", pageNumber + 1, pageWrapperList.size()), guiLeft + xSize / 2, guiTop + 5 * ySize / 6, 0); + drawCenteredStringWithShadow(font, entry.getLocalizedName(), guiLeft + xSize / 2, guiTop - 10, Color.WHITE.getRGB()); + + buttonPrev.visible = pageNumber != 0; + buttonNext.visible = pageNumber != pageWrapperList.size() - 1 && !pageWrapperList.isEmpty(); + + super.render(mouseX, mouseY, renderPartialTicks); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int typeofClick) { + if (!super.mouseClicked(mouseX, mouseY, typeofClick)) { + for (PageWrapper wrapper : this.pageWrapperList) { + if (wrapper.isMouseOnWrapper(mouseX, mouseY) && wrapper.canPlayerSee()) { + if (typeofClick == 0) { + pageWrapperList.get(pageNumber).page.onLeftClicked(book, category, entry, mouseX, mouseY, player, this); + return true; + } + if (typeofClick == 1) { + pageWrapperList.get(pageNumber).page.onRightClicked(book, category, entry, mouseX, mouseY, player, this); + return true; + } + } + } + + if (typeofClick == 1) { + this.minecraft.displayGuiScreen(new CategoryScreen(book, category, player, bookStack, entry)); + return true; + } + return false; + } + return true; + + } + + @Override + public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3_, double movement) { + + if (movement < 0) + nextPage(); + else if (movement > 0) + prevPage(); + + + return movement != 0 || super.mouseScrolled(p_mouseScrolled_1_, p_mouseScrolled_3_, movement); + + } + + @Override + public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) { + if (keyCode == GLFW.GLFW_KEY_BACKSPACE || keyCode == this.minecraft.gameSettings.keyBindUseItem.getKey().getKeyCode()) { + this.minecraft.displayGuiScreen(new CategoryScreen(book, category, player, bookStack, entry)); + return true; + } else if ((keyCode == GLFW.GLFW_KEY_UP || keyCode == GLFW.GLFW_KEY_RIGHT) && pageNumber + 1 < pageWrapperList.size()) { + nextPage(); + return true; + } else if ((keyCode == GLFW.GLFW_KEY_DOWN || keyCode == GLFW.GLFW_KEY_LEFT) && pageNumber > 0) { + prevPage(); + return true; + } + return super.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); + + } + + + @Override + public void onClose() { + super.onClose(); + + ResourceLocation key = null; + for (Map.Entry mapEntry : category.entries.entrySet()) + if (mapEntry.getValue().equals(entry)) + key = mapEntry.getKey(); + + if (key != null) + PacketHandler.INSTANCE.sendToServer(new PacketSyncEntry(book.getCategoryList().indexOf(category), key, pageNumber)); + } + + public void nextPage() { + if (pageNumber != pageWrapperList.size() - 1 && !pageWrapperList.isEmpty()) + pageNumber++; + } + + public void prevPage() { + if (pageNumber != 0) + pageNumber--; + } +} diff --git a/src/main/java/amerifrance/guideapi/gui/GuiBase.java b/src/main/java/amerifrance/guideapi/gui/GuiBase.java deleted file mode 100644 index d490b74b..00000000 --- a/src/main/java/amerifrance/guideapi/gui/GuiBase.java +++ /dev/null @@ -1,111 +0,0 @@ -package amerifrance.guideapi.gui; - -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; - -import java.awt.Color; -import java.util.List; - -import static net.minecraft.client.renderer.GlStateManager.*; - -public class GuiBase extends GuiScreen { - - public int guiLeft, guiTop; - public int xSize = 192; - public int ySize = 192; - public EntityPlayer player; - public ItemStack bookStack; - public float publicZLevel; - - public GuiBase(EntityPlayer player, ItemStack bookStack) { - this.player = player; - this.bookStack = bookStack; - this.publicZLevel = zLevel; - } - - @Override - public boolean doesGuiPauseGame() { - return false; - } - - @Override - public void keyTyped(char typedChar, int keyCode) { - if (keyCode == Keyboard.KEY_ESCAPE || keyCode == this.mc.gameSettings.keyBindInventory.getKeyCode()) { - this.mc.displayGuiScreen(null); - this.mc.setIngameFocus(); - } - } - - public void drawTexturedModalRectWithColor(int x, int y, int textureX, int textureY, int width, int height, Color color) { - pushMatrix(); - enableBlend(); - blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - float f = 0.00390625F; - float f1 = 0.00390625F; - disableLighting(); - color((float) color.getRed() / 255F, (float) color.getGreen() / 255F, (float) color.getBlue() / 255F); - Tessellator tessellator = Tessellator.getInstance(); - tessellator.getBuffer().begin(7, DefaultVertexFormats.POSITION_TEX); - tessellator.getBuffer().pos((double) (x), (double) (y + height), (double) this.zLevel).tex((double) ((float) (textureX) * f), (double) ((float) (textureY + height) * f1)).endVertex(); - tessellator.getBuffer().pos((double) (x + width), (double) (y + height), (double) this.zLevel).tex((double) ((float) (textureX + width) * f), (double) ((float) (textureY + height) * f1)).endVertex(); - tessellator.getBuffer().pos((double) (x + width), (double) (y), (double) this.zLevel).tex((double) ((float) (textureX + width) * f), (double) ((float) (textureY) * f1)).endVertex(); - tessellator.getBuffer().pos((double) (x), (double) (y), (double) this.zLevel).tex((double) ((float) (textureX) * f), (double) ((float) (textureY) * f1)).endVertex(); - tessellator.draw(); - disableBlend(); - popMatrix(); - } - - @Override - public void drawCenteredString(FontRenderer fontRendererObj, String string, int x, int y, int color) { - RenderHelper.disableStandardItemLighting(); - fontRendererObj.drawString(string, x - fontRendererObj.getStringWidth(string) / 2, y, color); - RenderHelper.disableStandardItemLighting(); - } - - public void drawCenteredStringWithShadow(FontRenderer fontRendererObj, String string, int x, int y, int color) { - super.drawCenteredString(fontRendererObj, string, x, y, color); - } - - @Override - public void drawTexturedModalRect(int x, int y, int textureX, int textureY, int width, int height) { - pushMatrix(); - color(1.0F, 1.0F, 1.0F, 1.0F); - super.drawTexturedModalRect(x, y, textureX, textureY, width, height); - popMatrix(); - } - - @Override - public void drawHoveringText(List list, int x, int y, FontRenderer font) { - disableLighting(); - RenderHelper.disableStandardItemLighting(); - super.drawHoveringText(list, x, y, font); - RenderHelper.enableStandardItemLighting(); - enableLighting(); - } - - @Override - public void drawHoveringText(List list, int x, int y) { - disableLighting(); - RenderHelper.disableStandardItemLighting(); - super.drawHoveringText(list, x, y); - RenderHelper.enableStandardItemLighting(); - enableLighting(); - } - - @Override - public void renderToolTip(ItemStack stack, int x, int y) { - super.renderToolTip(stack, x, y); - } - - @Override - public void onGuiClosed() { - super.onGuiClosed(); - } -} diff --git a/src/main/java/amerifrance/guideapi/gui/GuiEntry.java b/src/main/java/amerifrance/guideapi/gui/GuiEntry.java deleted file mode 100644 index 886204f6..00000000 --- a/src/main/java/amerifrance/guideapi/gui/GuiEntry.java +++ /dev/null @@ -1,174 +0,0 @@ -package amerifrance.guideapi.gui; - -import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.button.ButtonBack; -import amerifrance.guideapi.button.ButtonNext; -import amerifrance.guideapi.button.ButtonPrev; -import amerifrance.guideapi.button.ButtonSearch; -import amerifrance.guideapi.network.PacketHandler; -import amerifrance.guideapi.network.PacketSyncEntry; -import amerifrance.guideapi.wrapper.PageWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; - -import java.awt.Color; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class GuiEntry extends GuiBase { - - public ResourceLocation outlineTexture; - public ResourceLocation pageTexture; - public Book book; - public CategoryAbstract category; - public EntryAbstract entry; - public List pageWrapperList = new ArrayList(); - public ButtonBack buttonBack; - public ButtonNext buttonNext; - public ButtonPrev buttonPrev; - public ButtonSearch buttonSearch; - public int pageNumber; - - public GuiEntry(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack) { - super(player, bookStack); - this.book = book; - this.category = category; - this.entry = entry; - this.pageTexture = book.getPageTexture(); - this.outlineTexture = book.getOutlineTexture(); - this.pageNumber = 0; - } - - @Override - public void initGui() { - super.initGui(); - entry.onInit(book, category, null, player, bookStack); - this.buttonList.clear(); - this.pageWrapperList.clear(); - - guiLeft = (this.width - this.xSize) / 2; - guiTop = (this.height - this.ySize) / 2; - - this.buttonList.add(buttonBack = new ButtonBack(0, guiLeft + xSize / 6, guiTop, this)); - this.buttonList.add(buttonNext = new ButtonNext(1, guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, this)); - this.buttonList.add(buttonPrev = new ButtonPrev(2, guiLeft + xSize / 5, guiTop + 5 * ySize / 6, this)); - this.buttonList.add(buttonSearch = new ButtonSearch(3, (guiLeft + xSize / 6) - 25, guiTop + 5, this)); - - for (IPage page : this.entry.pageList) { - page.onInit(book, category, entry, player, bookStack, this); - pageWrapperList.add(new PageWrapper(this, book, category, entry, page, guiLeft, guiTop, player, this.fontRenderer, bookStack)); - } - } - - @Override - public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) { - Minecraft.getMinecraft().getTextureManager().bindTexture(pageTexture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - Minecraft.getMinecraft().getTextureManager().bindTexture(outlineTexture); - drawTexturedModalRectWithColor(guiLeft, guiTop, 0, 0, xSize, ySize, book.getColor()); - - pageNumber = MathHelper.clamp(pageNumber, 0, pageWrapperList.size() - 1); - - if (pageNumber < pageWrapperList.size()) { - if (pageWrapperList.get(pageNumber).canPlayerSee()) { - pageWrapperList.get(pageNumber).draw(mouseX, mouseY, this); - pageWrapperList.get(pageNumber).drawExtras(mouseX, mouseY, this); - } - } - - drawCenteredString(fontRenderer, String.format("%d/%d", pageNumber + 1, pageWrapperList.size()), guiLeft + xSize / 2, guiTop + 5 * ySize / 6, 0); - drawCenteredStringWithShadow(fontRenderer, entry.getLocalizedName(), guiLeft + xSize / 2, guiTop - 10, Color.WHITE.getRGB()); - - buttonPrev.visible = pageNumber != 0; - buttonNext.visible = pageNumber != pageWrapperList.size() - 1 && !pageWrapperList.isEmpty(); - - super.drawScreen(mouseX, mouseY, renderPartialTicks); - } - - @Override - public void mouseClicked(int mouseX, int mouseY, int typeofClick) throws IOException { - super.mouseClicked(mouseX, mouseY, typeofClick); - for (PageWrapper wrapper : this.pageWrapperList) { - if (wrapper.isMouseOnWrapper(mouseX, mouseY) && wrapper.canPlayerSee()) { - if (typeofClick == 0) { - pageWrapperList.get(pageNumber).page.onLeftClicked(book, category, entry, mouseX, mouseY, player, this); - } - if (typeofClick == 1) { - pageWrapperList.get(pageNumber).page.onRightClicked(book, category, entry, mouseX, mouseY, player, this); - } - } - } - - if (typeofClick == 1) { - this.mc.displayGuiScreen(new GuiCategory(book, category, player, bookStack, entry)); - } - } - - @Override - public void handleMouseInput() throws IOException { - super.handleMouseInput(); - - int movement = Mouse.getEventDWheel(); - if (movement < 0) - nextPage(); - else if (movement > 0) - prevPage(); - } - - @Override - public void keyTyped(char typedChar, int keyCode) { - super.keyTyped(typedChar, keyCode); - if (keyCode == Keyboard.KEY_BACK || keyCode == this.mc.gameSettings.keyBindUseItem.getKeyCode()) - this.mc.displayGuiScreen(new GuiCategory(book, category, player, bookStack, entry)); - if ((keyCode == Keyboard.KEY_UP || keyCode == Keyboard.KEY_RIGHT) && pageNumber + 1 < pageWrapperList.size()) - nextPage(); - if ((keyCode == Keyboard.KEY_DOWN || keyCode == Keyboard.KEY_LEFT) && pageNumber > 0) - prevPage(); - } - - @Override - public void actionPerformed(GuiButton button) { - if (button.id == 0) - this.mc.displayGuiScreen(new GuiCategory(book, category, player, bookStack, entry)); - else if (button.id == 1 && pageNumber + 1 < pageWrapperList.size()) - nextPage(); - else if (button.id == 2 && pageNumber > 0) - prevPage(); - else if (button.id == 3) - this.mc.displayGuiScreen(new GuiSearch(book, player, bookStack, this)); - } - - @Override - public void onGuiClosed() { - super.onGuiClosed(); - - ResourceLocation key = null; - for (Map.Entry mapEntry : category.entries.entrySet()) - if (mapEntry.getValue().equals(entry)) - key = mapEntry.getKey(); - - if (key != null) - PacketHandler.INSTANCE.sendToServer(new PacketSyncEntry(book.getCategoryList().indexOf(category), key, pageNumber)); - } - - public void nextPage() { - if (pageNumber != pageWrapperList.size() - 1 && !pageWrapperList.isEmpty()) - pageNumber++; - } - - public void prevPage() { - if (pageNumber != 0) - pageNumber--; - } -} diff --git a/src/main/java/amerifrance/guideapi/gui/GuiHome.java b/src/main/java/amerifrance/guideapi/gui/GuiHome.java deleted file mode 100644 index 7de64895..00000000 --- a/src/main/java/amerifrance/guideapi/gui/GuiHome.java +++ /dev/null @@ -1,210 +0,0 @@ -package amerifrance.guideapi.gui; - -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.button.ButtonNext; -import amerifrance.guideapi.button.ButtonPrev; -import amerifrance.guideapi.button.ButtonSearch; -import amerifrance.guideapi.network.PacketHandler; -import amerifrance.guideapi.network.PacketSyncHome; -import amerifrance.guideapi.wrapper.CategoryWrapper; -import com.google.common.collect.HashMultimap; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; - -import java.awt.Color; -import java.io.IOException; - -public class GuiHome extends GuiBase { - - public ResourceLocation outlineTexture; - public ResourceLocation pageTexture; - public Book book; - public HashMultimap categoryWrapperMap = HashMultimap.create(); - public ButtonNext buttonNext; - public ButtonPrev buttonPrev; - public ButtonSearch buttonSearch; - public int categoryPage; - - public GuiHome(Book book, EntityPlayer player, ItemStack bookStack) { - super(player, bookStack); - this.book = book; - this.pageTexture = book.getPageTexture(); - this.outlineTexture = book.getOutlineTexture(); - this.categoryPage = 0; - } - - @Override - public void initGui() { - this.buttonList.clear(); - this.categoryWrapperMap.clear(); - - guiLeft = (this.width - this.xSize) / 2; - guiTop = (this.height - this.ySize) / 2; - - addButton(buttonNext = new ButtonNext(0, guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, this)); - addButton(buttonPrev = new ButtonPrev(1, guiLeft + xSize / 5, guiTop + 5 * ySize / 6, this)); - addButton(buttonSearch = new ButtonSearch(2, (guiLeft + xSize / 6) - 25, guiTop + 5, this)); - - int cX = guiLeft + 45; - int cY = guiTop + 40; - int drawLoc = 0; - int i = 0; - int pageNumber = 0; - - for (CategoryAbstract category : book.getCategoryList()) { - if (category.entries.isEmpty()) - continue; - - category.onInit(book, this, player, bookStack); - switch (drawLoc) { - case 0: { - categoryWrapperMap.put(pageNumber, new CategoryWrapper(book, category, cX, cY, 23, 23, player, this.fontRenderer, itemRender, false, bookStack)); - cX += 27; - drawLoc = 1; - break; - } - case 1: { - categoryWrapperMap.put(pageNumber, new CategoryWrapper(book, category, cX, cY, 23, 23, player, this.fontRenderer, itemRender, false, bookStack)); - cX += 27; - drawLoc = 2; - break; - } - case 2: { - categoryWrapperMap.put(pageNumber, new CategoryWrapper(book, category, cX, cY, 23, 23, player, this.fontRenderer, itemRender, false, bookStack)); - cX += 27; - drawLoc = 3; - break; - } - case 3: { - categoryWrapperMap.put(pageNumber, new CategoryWrapper(book, category, cX, cY, 23, 23, player, this.fontRenderer, itemRender, false, bookStack)); - drawLoc = 0; - cX = guiLeft + 45; - cY += 30; - break; - } - } - i++; - - if (i >= 16) { - i = 0; - cX = guiLeft + 45; - cY = guiTop + 40; - pageNumber++; - } - } - } - - @Override - public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) { - Minecraft.getMinecraft().getTextureManager().bindTexture(pageTexture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - Minecraft.getMinecraft().getTextureManager().bindTexture(outlineTexture); - drawTexturedModalRectWithColor(guiLeft, guiTop, 0, 0, xSize, ySize, book.getColor()); - drawCenteredString(fontRenderer, I18n.format(book.getHeader()).replace("\\n", "\n").replace("&", "\u00a7"), guiLeft + xSize / 2 + 1, guiTop + 15, 0); - - categoryPage = MathHelper.clamp(categoryPage, 0, categoryWrapperMap.size() - 1); - - for (CategoryWrapper wrapper : this.categoryWrapperMap.get(categoryPage)) - if (wrapper.canPlayerSee()) - wrapper.draw(mouseX, mouseY, this); - - for (CategoryWrapper wrapper : this.categoryWrapperMap.get(categoryPage)) - if (wrapper.canPlayerSee()) - wrapper.drawExtras(mouseX, mouseY, this); - - drawCenteredString(fontRenderer, String.format("%d/%d", categoryPage + 1, categoryWrapperMap.asMap().size()), guiLeft + xSize / 2, guiTop + 5 * ySize / 6, 0); - drawCenteredStringWithShadow(fontRenderer, I18n.format(book.getTitle()), guiLeft + xSize / 2, guiTop - 10, Color.WHITE.getRGB()); - - buttonPrev.visible = categoryPage != 0; - buttonNext.visible = categoryPage != categoryWrapperMap.asMap().size() - 1 && !categoryWrapperMap.asMap().isEmpty(); - - for (GuiButton button : this.buttonList) - button.drawButton(this.mc, mouseX, mouseY, renderPartialTicks); - } - - @Override - public void mouseClicked(int mouseX, int mouseY, int typeofClick) throws IOException { - super.mouseClicked(mouseX, mouseY, typeofClick); - - for (CategoryWrapper wrapper : this.categoryWrapperMap.get(categoryPage)) { - if (wrapper.isMouseOnWrapper(mouseX, mouseY) && wrapper.canPlayerSee()) { - if (typeofClick == 0) - wrapper.category.onLeftClicked(book, mouseX, mouseY, player, bookStack); - - else if (typeofClick == 1) - wrapper.category.onRightClicked(book, mouseX, mouseY, player, bookStack); - } - } - } - - @Override - public void handleMouseInput() throws IOException { - super.handleMouseInput(); - - int movement = Mouse.getEventDWheel(); - if (movement < 0) - nextPage(); - else if (movement > 0) - prevPage(); - } - - @Override - public void keyTyped(char typedChar, int keyCode) { - super.keyTyped(typedChar, keyCode); - if ((keyCode == Keyboard.KEY_UP || keyCode == Keyboard.KEY_RIGHT) && categoryPage + 1 < categoryWrapperMap.asMap().size()) - nextPage(); - - if ((keyCode == Keyboard.KEY_DOWN || keyCode == Keyboard.KEY_LEFT) && categoryPage > 0) - prevPage(); - } - - @Override - public void actionPerformed(GuiButton button) { - if (button.id == 0 && categoryPage + 1 < categoryWrapperMap.asMap().size()) - nextPage(); - else if (button.id == 1 && categoryPage > 0) - prevPage(); - - switch (button.id) { - case 0: { - if (categoryPage + 1 < categoryWrapperMap.asMap().size()) - nextPage(); - break; - } - case 1: { - if (categoryPage > 0) - nextPage(); - break; - } - case 2: { - mc.displayGuiScreen(new GuiSearch(book, player, bookStack, this)); - break; - } - } - } - - @Override - public void onGuiClosed() { - super.onGuiClosed(); - - PacketHandler.INSTANCE.sendToServer(new PacketSyncHome(categoryPage)); - } - - public void nextPage() { - if (categoryPage != categoryWrapperMap.asMap().size() - 1 && !categoryWrapperMap.asMap().isEmpty()) - categoryPage++; - } - - public void prevPage() { - if (categoryPage != 0) - categoryPage--; - } -} diff --git a/src/main/java/amerifrance/guideapi/gui/HomeScreen.java b/src/main/java/amerifrance/guideapi/gui/HomeScreen.java new file mode 100644 index 00000000..8036ac34 --- /dev/null +++ b/src/main/java/amerifrance/guideapi/gui/HomeScreen.java @@ -0,0 +1,171 @@ +package amerifrance.guideapi.gui; + +import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.util.TextHelper; +import amerifrance.guideapi.button.ButtonNext; +import amerifrance.guideapi.button.ButtonPrev; +import amerifrance.guideapi.button.ButtonSearch; +import amerifrance.guideapi.network.PacketHandler; +import amerifrance.guideapi.network.PacketSyncHome; +import amerifrance.guideapi.wrapper.CategoryWrapper; +import com.google.common.collect.HashMultimap; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.StringTextComponent; +import org.lwjgl.glfw.GLFW; + +import java.awt.*; + +public class HomeScreen extends BaseScreen { + + public ResourceLocation outlineTexture; + public ResourceLocation pageTexture; + public Book book; + public HashMultimap categoryWrapperMap = HashMultimap.create(); + public ButtonNext buttonNext; + public ButtonPrev buttonPrev; + public ButtonSearch buttonSearch; + public int categoryPage; + + public HomeScreen(Book book, PlayerEntity player, ItemStack bookStack) { + super(new StringTextComponent(book.getTitle()), player, bookStack); + this.book = book; + this.pageTexture = book.getPageTexture(); + this.outlineTexture = book.getOutlineTexture(); + this.categoryPage = 0; + } + + @Override + public void init() { + this.categoryWrapperMap.clear(); + + guiLeft = (this.width - this.xSize) / 2; + guiTop = (this.height - this.ySize) / 2; + + addButton(buttonNext = new ButtonNext(guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, (btn) -> { + if (categoryPage + 1 < categoryWrapperMap.asMap().size()) { + nextPage(); + } + }, this)); + addButton(buttonPrev = new ButtonPrev(guiLeft + xSize / 5, guiTop + 5 * ySize / 6, (btn) -> { + if (categoryPage > 0) { + prevPage(); + } + }, this)); + addButton(buttonSearch = new ButtonSearch((guiLeft + xSize / 6) - 25, guiTop + 5, (btn) -> { + minecraft.displayGuiScreen(new SearchScreen(book, player, bookStack, this)); + }, this)); + + int cX = guiLeft + 55; + int cY = guiTop + 40; + int i = 0; + int pageNumber = 0; + + for (CategoryAbstract category : book.getCategoryList()) { + if (category.entries.isEmpty()) + continue; + + category.onInit(book, this, player, bookStack); + int x = i % 5; + int y = i / 5; + categoryWrapperMap.put(pageNumber, new CategoryWrapper(book, category, cX + x * 27, cY + y * 30, 23, 23, player, this.font, itemRenderer, false, bookStack)); + i++; + + if (i >= 20) { + i = 0; + pageNumber++; + } + } + } + + @Override + public void render(int mouseX, int mouseY, float renderPartialTicks) { + minecraft.getTextureManager().bindTexture(pageTexture); + blit(guiLeft, guiTop, 0, 0, xSize, ySize); + minecraft.getTextureManager().bindTexture(outlineTexture); + drawTexturedModalRectWithColor(guiLeft, guiTop, 0, 0, xSize, ySize, book.getColor()); + drawCenteredString(font, TextHelper.localize(book.getHeader()).replace("\\n", "\n").replace("&", "\u00a7"), guiLeft + xSize / 2 + 1, guiTop + 15, 0); + + categoryPage = MathHelper.clamp(categoryPage, 0, categoryWrapperMap.size() - 1); + + for (CategoryWrapper wrapper : this.categoryWrapperMap.get(categoryPage)) + if (wrapper.canPlayerSee()) + wrapper.draw(mouseX, mouseY, this); + + for (CategoryWrapper wrapper : this.categoryWrapperMap.get(categoryPage)) + if (wrapper.canPlayerSee()) + wrapper.drawExtras(mouseX, mouseY, this); + + drawCenteredString(font, String.format("%d/%d", categoryPage + 1, categoryWrapperMap.asMap().size()), guiLeft + xSize / 2, guiTop + 5 * ySize / 6, 0); + drawCenteredStringWithShadow(font, TextHelper.localize(book.getTitle()), guiLeft + xSize / 2, guiTop - 10, Color.WHITE.getRGB()); + + buttonPrev.visible = categoryPage != 0; + buttonNext.visible = categoryPage != categoryWrapperMap.asMap().size() - 1 && !categoryWrapperMap.asMap().isEmpty(); + + super.render(mouseX, mouseY, renderPartialTicks); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int typeofClick) { + if (!super.mouseClicked(mouseX, mouseY, typeofClick)) { + for (CategoryWrapper wrapper : this.categoryWrapperMap.get(categoryPage)) { + if (wrapper.isMouseOnWrapper(mouseX, mouseY) && wrapper.canPlayerSee()) { + if (typeofClick == 0) + wrapper.category.onLeftClicked(book, mouseX, mouseY, player, bookStack); + + + else if (typeofClick == 1) + wrapper.category.onRightClicked(book, mouseX, mouseY, player, bookStack); + + return true; + } + } + return false; + } + return true; + + } + + @Override + public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3_, double movement) { + + if (movement < 0) + nextPage(); + else if (movement > 0) + prevPage(); + + return movement != 0 || super.mouseScrolled(p_mouseScrolled_1_, p_mouseScrolled_3_, movement); + } + + @Override + public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) { + if ((keyCode == GLFW.GLFW_KEY_UP || keyCode == GLFW.GLFW_KEY_RIGHT) && categoryPage + 1 < categoryWrapperMap.asMap().size()) { + nextPage(); + } else if ((keyCode == GLFW.GLFW_KEY_DOWN || keyCode == GLFW.GLFW_KEY_LEFT) && categoryPage > 0) { + prevPage(); + } + + return super.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); + } + + + @Override + public void onClose() { + super.onClose(); + + PacketHandler.INSTANCE.sendToServer(new PacketSyncHome(categoryPage)); + } + + public void nextPage() { + if (categoryPage != categoryWrapperMap.asMap().size() - 1 && !categoryWrapperMap.asMap().isEmpty()) + categoryPage++; + } + + public void prevPage() { + if (categoryPage != 0) + categoryPage--; + } +} diff --git a/src/main/java/amerifrance/guideapi/gui/GuiSearch.java b/src/main/java/amerifrance/guideapi/gui/SearchScreen.java similarity index 51% rename from src/main/java/amerifrance/guideapi/gui/GuiSearch.java rename to src/main/java/amerifrance/guideapi/gui/SearchScreen.java index 6e578e1a..30c624dc 100644 --- a/src/main/java/amerifrance/guideapi/gui/GuiSearch.java +++ b/src/main/java/amerifrance/guideapi/gui/SearchScreen.java @@ -10,39 +10,37 @@ import amerifrance.guideapi.button.ButtonPrev; import com.google.common.base.Strings; import com.google.common.collect.Lists; -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.fml.client.config.GuiUtils; import org.apache.commons.lang3.tuple.Pair; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; +import org.lwjgl.glfw.GLFW; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.awt.Color; -import java.io.IOException; +import java.awt.*; import java.util.List; import java.util.Locale; -public class GuiSearch extends GuiBase { +public class SearchScreen extends BaseScreen { private Book book; private ResourceLocation outlineTexture; private ResourceLocation pageTexture; private ButtonNext buttonNext; private ButtonPrev buttonPrev; - private GuiTextField searchField; - private GuiScreen parent; + private TextFieldWidget searchField; + private Screen parent; private List>> searchResults; private int currentPage = 0; private String lastQuery = ""; - public GuiSearch(Book book, EntityPlayer player, ItemStack bookStack, GuiScreen parent) { - super(player, bookStack); + public SearchScreen(Book book, PlayerEntity player, ItemStack bookStack, Screen parent) { + super(new TranslationTextComponent(book.getTitle()), player, bookStack); this.book = book; this.pageTexture = book.getPageTexture(); @@ -51,33 +49,42 @@ public GuiSearch(Book book, EntityPlayer player, ItemStack bookStack, GuiScreen this.searchResults = getMatches(book, null, player, bookStack); } + @Override - public void initGui() { - buttonList.clear(); + public void init() { guiLeft = (this.width - this.xSize) / 2; guiTop = (this.height - this.ySize) / 2; - addButton(new ButtonBack(0, guiLeft + xSize / 6, guiTop, this)); - addButton(buttonNext = new ButtonNext(1, guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, this)); - addButton(buttonPrev = new ButtonPrev(2, guiLeft + xSize / 5, guiTop + 5 * ySize / 6, this)); + addButton(new ButtonBack(guiLeft + xSize / 6, guiTop, (btn) -> { + minecraft.displayGuiScreen(parent); + + }, this)); + addButton(buttonNext = new ButtonNext(guiLeft + 4 * xSize / 6, guiTop + 5 * ySize / 6, (btn) -> { + if (currentPage <= searchResults.size() - 1) + currentPage++; + }, this)); + addButton(buttonPrev = new ButtonPrev(guiLeft + xSize / 5, guiTop + 5 * ySize / 6, (btn) -> { + if (currentPage > 0) + currentPage--; + }, this)); - searchField = new GuiTextField(3, fontRenderer, guiLeft + 43, guiTop + 12, 100, 10); + searchField = new TextFieldWidget(font, guiLeft + 43, guiTop + 12, 100, 10, ""); searchField.setEnableBackgroundDrawing(false); - searchField.setFocused(true); + searchField.changeFocus(true); searchResults = getMatches(book, null, player, bookStack); } @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - mc.getTextureManager().bindTexture(pageTexture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - mc.getTextureManager().bindTexture(outlineTexture); + public void render(int mouseX, int mouseY, float partialTicks) { + minecraft.getTextureManager().bindTexture(pageTexture); + blit(guiLeft, guiTop, 0, 0, xSize, ySize); + minecraft.getTextureManager().bindTexture(outlineTexture); drawTexturedModalRectWithColor(guiLeft, guiTop, 0, 0, xSize, ySize, book.getColor()); - drawRect(searchField.x - 1, searchField.y - 1, searchField.x + searchField.width + 1, searchField.y + searchField.height + 1, new Color(166, 166, 166, 128).getRGB()); - drawRect(searchField.x, searchField.y, searchField.x + searchField.width, searchField.y + searchField.height, new Color(58, 58, 58, 128).getRGB()); - searchField.drawTextBox(); + fill(searchField.x - 1, searchField.y - 1, searchField.x + searchField.getAdjustedWidth() + 1, searchField.y + searchField.getHeight() + 1, new Color(166, 166, 166, 128).getRGB()); + fill(searchField.x, searchField.y, searchField.x + searchField.getAdjustedWidth(), searchField.y + searchField.getHeight(), new Color(58, 58, 58, 128).getRGB()); + searchField.render(mouseX, mouseY, partialTicks); int entryX = guiLeft + 37; int entryY = guiTop + 30; @@ -85,14 +92,14 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { if (searchResults.size() != 0 && currentPage >= 0 && currentPage < searchResults.size()) { List> pageResults = searchResults.get(currentPage); for (Pair entry : pageResults) { - entry.getLeft().draw(book, entry.getRight(), entryX, entryY, 4 * xSize / 6, 10, mouseX, mouseY, this, fontRenderer); - entry.getLeft().drawExtras(book, entry.getRight(), entryX, entryY, 4 * xSize / 6, 10, mouseX, mouseY, this, fontRenderer); + entry.getLeft().draw(book, entry.getRight(), entryX, entryY, 4 * xSize / 6, 10, mouseX, mouseY, this, font); + entry.getLeft().drawExtras(book, entry.getRight(), entryX, entryY, 4 * xSize / 6, 10, mouseX, mouseY, this, font); if (GuiHelper.isMouseBetween(mouseX, mouseY, entryX, entryY, 4 * xSize / 6, 10)) { - if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) - GuiUtils.drawHoveringText(Lists.newArrayList(entry.getRight().getLocalizedName()), mouseX, mouseY, width, height, 300, fontRenderer); + if (GLFW.glfwGetKey(minecraft.mainWindow.getHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) == GLFW.GLFW_PRESS) + GuiUtils.drawHoveringText(Lists.newArrayList(entry.getRight().getLocalizedName()), mouseX, mouseY, width, height, 300, font); - if (Mouse.isButtonDown(0)) { + if (minecraft.mouseHelper.isLeftDown()) { GuideMod.PROXY.openEntry(book, entry.getRight(), entry.getLeft(), player, bookStack); return; } @@ -105,46 +112,60 @@ public void drawScreen(int mouseX, int mouseY, float partialTicks) { buttonPrev.visible = currentPage != 0; buttonNext.visible = currentPage != searchResults.size() - 1 && !searchResults.isEmpty(); - super.drawScreen(mouseX, mouseY, partialTicks); + super.render(mouseX, mouseY, partialTicks); } @Override - public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { - super.mouseClicked(mouseX, mouseY, mouseButton); - - if (mouseButton == 1) { - if (GuiHelper.isMouseBetween(mouseX, mouseY, searchField.x, searchField.y, searchField.width, searchField.height)) { - searchField.setText(""); - lastQuery = ""; - searchResults = getMatches(book, "", player, bookStack); - return; - } else - mc.displayGuiScreen(parent); + public boolean mouseClicked(double mouseX, double mouseY, int typeofClick) { + if (!super.mouseClicked(mouseX, mouseY, typeofClick)) { + if (typeofClick == 1) { + if (GuiHelper.isMouseBetween(mouseX, mouseY, searchField.x, searchField.y, searchField.getAdjustedWidth(), searchField.getHeight())) { + searchField.setText(""); + lastQuery = ""; + searchResults = getMatches(book, "", player, bookStack); + return true; + } else { + minecraft.displayGuiScreen(parent); + return true; + } + } + + + return searchField.mouseClicked(mouseX, mouseY, typeofClick); } + return true; + - searchField.mouseClicked(mouseX, mouseY, mouseButton); } @Override - public void handleMouseInput() throws IOException { - super.handleMouseInput(); - - int movement = Mouse.getEventDWheel(); + public boolean mouseScrolled(double p_mouseScrolled_1_, double p_mouseScrolled_3_, double movement) { if (movement < 0 && buttonNext.visible && currentPage <= searchResults.size()) currentPage++; else if (movement > 0 && buttonPrev.visible && currentPage > 0) currentPage--; + + return movement != 0 || super.mouseScrolled(p_mouseScrolled_1_, p_mouseScrolled_3_, movement); + } @Override - public void keyTyped(char typedChar, int keyCode) { - if (!searchField.isFocused()) - super.keyTyped(typedChar, keyCode); + public boolean keyPressed(int keyCode, int p_keyPressed_2_, int p_keyPressed_3_) { + if (!searchField.isFocused()) { + return super.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_); + } - if (keyCode == Keyboard.KEY_ESCAPE) - searchField.setFocused(false); + if (keyCode == GLFW.GLFW_KEY_ESCAPE) + searchField.changeFocus(false); - searchField.textboxKeyTyped(typedChar, keyCode); + if (searchField.keyPressed(keyCode, p_keyPressed_2_, p_keyPressed_3_)) { + this.updateSearch(); + } + + return true; + } + + private void updateSearch() { if (!searchField.getText().equalsIgnoreCase(lastQuery)) { lastQuery = searchField.getText(); searchResults = getMatches(book, searchField.getText(), player, bookStack); @@ -154,27 +175,16 @@ public void keyTyped(char typedChar, int keyCode) { } @Override - public void actionPerformed(GuiButton button) { - switch (button.id) { - case 0: { - mc.displayGuiScreen(parent); - break; - } - case 1: { - if (currentPage <= searchResults.size() - 1) - currentPage++; - break; - } - case 2: { - if (currentPage > 0) - currentPage--; - break; - } + public boolean charTyped(char p_charTyped_1_, int p_charTyped_2_) { + if (this.searchField.charTyped(p_charTyped_1_, p_charTyped_2_)) { + this.updateSearch(); + return true; } + return super.charTyped(p_charTyped_1_, p_charTyped_2_); } @Nonnull - static List>> getMatches(Book book, @Nullable String query, EntityPlayer player, ItemStack bookStack) { + static List>> getMatches(Book book, @Nullable String query, PlayerEntity player, ItemStack bookStack) { List> discovered = Lists.newArrayList(); for (CategoryAbstract category : book.getCategoryList()) { diff --git a/src/main/java/amerifrance/guideapi/info/InfoRendererDescription.java b/src/main/java/amerifrance/guideapi/info/InfoRendererDescription.java index dd99c8db..e53c1633 100644 --- a/src/main/java/amerifrance/guideapi/info/InfoRendererDescription.java +++ b/src/main/java/amerifrance/guideapi/info/InfoRendererDescription.java @@ -3,12 +3,11 @@ import amerifrance.guideapi.api.IInfoRenderer; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.util.GuiHelper; -import net.minecraft.block.state.IBlockState; +import com.mojang.blaze3d.platform.GlStateManager; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; @@ -16,7 +15,7 @@ import net.minecraft.world.World; import org.apache.commons.lang3.StringEscapeUtils; -import java.awt.Color; +import java.awt.*; import java.util.List; public class InfoRendererDescription implements IInfoRenderer { @@ -32,16 +31,15 @@ public InfoRendererDescription(ItemStack stack, ITextComponent description) { } @Override - public void drawInformation(Book book, World world, BlockPos pos, IBlockState state, RayTraceResult rayTrace, EntityPlayer player) { + public void drawInformation(Book book, World world, BlockPos pos, BlockState state, RayTraceResult rayTrace, PlayerEntity player) { if (tiny) { GlStateManager.pushMatrix(); - GlStateManager.scale(0.5F, 0.5F, 0.5F); + GlStateManager.scalef(0.5F, 0.5F, 0.5F); } - ScaledResolution resolution = new ScaledResolution(Minecraft.getMinecraft()); - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; int scaleMulti = tiny ? 2 : 1; - GuiHelper.drawItemStack(stack, (resolution.getScaledWidth() / 2 + 55) * scaleMulti, ((resolution.getScaledHeight() / 2 - (tiny ? 20 : 30)) + yOffset) * scaleMulti); + GuiHelper.drawItemStack(stack, (Minecraft.getInstance().mainWindow.getScaledWidth() / 2 + 55) * scaleMulti, ((Minecraft.getInstance().mainWindow.getScaledHeight() / 2 - (tiny ? 20 : 30)) + yOffset) * scaleMulti); int y = 0; String toDraw = StringEscapeUtils.unescapeJava(description.getFormattedText()).replaceAll("\\t", " "); @@ -49,7 +47,7 @@ public void drawInformation(Book book, World world, BlockPos pos, IBlockState st for (String line : lines) { List cutLines = fontRenderer.listFormattedStringToWidth(line, 100 * scaleMulti); for (String cut : cutLines) { - fontRenderer.drawStringWithShadow(cut, (resolution.getScaledWidth() / 2 + 20) * scaleMulti, (((resolution.getScaledHeight() / 2 - 10) - y) * scaleMulti) + yOffset, Color.WHITE.getRGB()); + fontRenderer.drawStringWithShadow(cut, (Minecraft.getInstance().mainWindow.getScaledWidth() / 2 + 20) * scaleMulti, (((Minecraft.getInstance().mainWindow.getScaledHeight() / 2 - 10) - y) * scaleMulti) + yOffset, Color.WHITE.getRGB()); y -= 10 / scaleMulti; } } diff --git a/src/main/java/amerifrance/guideapi/info/InfoRendererImage.java b/src/main/java/amerifrance/guideapi/info/InfoRendererImage.java index 23565b2c..d7942af2 100644 --- a/src/main/java/amerifrance/guideapi/info/InfoRendererImage.java +++ b/src/main/java/amerifrance/guideapi/info/InfoRendererImage.java @@ -2,11 +2,10 @@ import amerifrance.guideapi.api.IInfoRenderer; import amerifrance.guideapi.api.impl.Book; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; @@ -29,9 +28,8 @@ public InfoRendererImage(ResourceLocation image, int imageX, int imageY, int ima } @Override - public void drawInformation(Book book, World world, BlockPos pos, IBlockState state, RayTraceResult rayTrace, EntityPlayer player) { - ScaledResolution resolution = new ScaledResolution(Minecraft.getMinecraft()); - Minecraft.getMinecraft().renderEngine.bindTexture(image); - Gui.drawModalRectWithCustomSizedTexture(resolution.getScaledWidth() / 2 + 20, resolution.getScaledHeight() / 2 - imageHeight / 2, imageX, imageY, imageWidth, imageHeight, imageWidth, imageHeight); + public void drawInformation(Book book, World world, BlockPos pos, BlockState state, RayTraceResult rayTrace, PlayerEntity player) { + Minecraft.getInstance().textureManager.bindTexture(image); + AbstractGui.blit(Minecraft.getInstance().mainWindow.getScaledWidth() / 2 + 20, Minecraft.getInstance().mainWindow.getScaledHeight() / 2 - imageHeight / 2, imageX, imageY, imageWidth, imageHeight, imageWidth, imageHeight); } } diff --git a/src/main/java/amerifrance/guideapi/item/ItemGuideBook.java b/src/main/java/amerifrance/guideapi/item/ItemGuideBook.java index 7bf6bf63..d6937422 100644 --- a/src/main/java/amerifrance/guideapi/item/ItemGuideBook.java +++ b/src/main/java/amerifrance/guideapi/item/ItemGuideBook.java @@ -2,22 +2,24 @@ import amerifrance.guideapi.GuideMod; import amerifrance.guideapi.api.BookEvent; -import amerifrance.guideapi.api.GuideAPI; import amerifrance.guideapi.api.IGuideItem; import amerifrance.guideapi.api.IGuideLinked; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.util.TextHelper; import com.google.common.base.Strings; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag.TooltipFlags; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.translation.I18n; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -29,71 +31,91 @@ public class ItemGuideBook extends Item implements IGuideItem { @Nonnull private final Book book; + private String translation_key; - public ItemGuideBook(@Nonnull Book book) { + + public ItemGuideBook(Book book) { + super(new Item.Properties().maxStackSize(1).group(book.getCreativeTab())); this.book = book; + setTranslation_key(GuideMod.ID + ".book." + book.getRegistryName().getNamespace() + "." + book.getRegistryName().getPath()); + } + + @Nullable + @Override + public String getCreatorModId(ItemStack itemStack) { + return book.getRegistryName().getNamespace(); + } + + @Override + protected String getDefaultTranslationKey() { + if (this.translation_key == null) { + this.translation_key = Util.makeTranslationKey("item", Registry.ITEM.getKey(this)); + } - setMaxStackSize(1); - setCreativeTab(book.getCreativeTab()); - setUnlocalizedName(GuideMod.ID + ".book." + book.getRegistryName().getResourceDomain() + "." + book.getRegistryName().getResourcePath()); + return this.translation_key; + } + + /** + * Set a custom translation key + */ + protected void setTranslation_key(String name) { + this.translation_key = Util.makeTranslationKey("item", new ResourceLocation(GuideMod.ID, name)); } @Override - public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { + ItemStack heldStack = player.getHeldItem(hand); + //Only handle book client side + if (!world.isRemote()) return ActionResult.newResult(ActionResultType.SUCCESS, heldStack); + + BookEvent.Open event = new BookEvent.Open(book, heldStack, player); if (MinecraftForge.EVENT_BUS.post(event)) { player.sendStatusMessage(event.getCanceledText(), true); - return ActionResult.newResult(EnumActionResult.FAIL, heldStack); + return ActionResult.newResult(ActionResultType.FAIL, heldStack); } - - player.openGui(GuideMod.INSTANCE, GuideAPI.getIndexedBooks().indexOf(book), world, hand.ordinal(), 0, 0); - return ActionResult.newResult(EnumActionResult.SUCCESS, heldStack); + GuideMod.PROXY.openGuidebook(player, world, book, heldStack); + return ActionResult.newResult(ActionResultType.SUCCESS, heldStack); } @Override - public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { - if (!world.isRemote || !player.isSneaking()) - return EnumActionResult.PASS; + public ActionResultType onItemUse(ItemUseContext context) { + if (!context.getWorld().isRemote || !context.isPlacerSneaking()) + return ActionResultType.PASS; - ItemStack stack = player.getHeldItem(hand); - IBlockState state = world.getBlockState(pos); + ItemStack stack = context.getItem(); + BlockState state = context.getWorld().getBlockState(context.getPos()); if (state.getBlock() instanceof IGuideLinked) { IGuideLinked guideLinked = (IGuideLinked) state.getBlock(); - ResourceLocation entryKey = guideLinked.getLinkedEntry(world, pos, player, stack); + ResourceLocation entryKey = guideLinked.getLinkedEntry(context.getWorld(), context.getPos(), context.getPlayer(), stack); if (entryKey == null) - return EnumActionResult.FAIL; + return ActionResultType.FAIL; for (CategoryAbstract category : book.getCategoryList()) { if (category.entries.containsKey(entryKey)) { - GuideMod.PROXY.openEntry(book, category, category.entries.get(entryKey), player, stack); - return EnumActionResult.SUCCESS; + GuideMod.PROXY.openEntry(book, category, category.entries.get(entryKey), context.getPlayer(), stack); + return ActionResultType.SUCCESS; } } } - return EnumActionResult.PASS; + return ActionResultType.PASS; } @Override - public String getItemStackDisplayName(ItemStack stack) { - return !Strings.isNullOrEmpty(book.getItemName()) ? I18n.translateToLocal(getBook(stack).getItemName()) : super.getItemStackDisplayName(stack); + public ITextComponent getDisplayName(ItemStack stack) { + return !Strings.isNullOrEmpty(book.getItemName()) ? new TranslationTextComponent(getBook(stack).getItemName()) : super.getDisplayName(stack); } @Override - public void addInformation(ItemStack stack, World playerIn, List tooltip, ITooltipFlag advanced) { + public void addInformation(ItemStack stack, World playerIn, List tooltip, ITooltipFlag advanced) { if (!Strings.isNullOrEmpty(book.getAuthor())) - tooltip.add(TextHelper.localizeEffect(book.getAuthor())); + tooltip.add(new StringTextComponent(TextHelper.localizeEffect(book.getAuthor()))); if (!Strings.isNullOrEmpty(book.getAuthor()) && (advanced == TooltipFlags.ADVANCED)) - tooltip.add(book.getRegistryName().toString()); - } - - @Nullable -// @Override TODO - Soft override because this hasn't been merged into Forge yet. https://github.com/MinecraftForge/MinecraftForge/pull/4330 - public String getCreatorModId(ItemStack stack) { - return book.getRegistryName().getResourceDomain(); + tooltip.add(new StringTextComponent(book.getRegistryName().toString())); } // IGuideItem diff --git a/src/main/java/amerifrance/guideapi/network/PacketHandler.java b/src/main/java/amerifrance/guideapi/network/PacketHandler.java index 97d2bd35..e436da6b 100644 --- a/src/main/java/amerifrance/guideapi/network/PacketHandler.java +++ b/src/main/java/amerifrance/guideapi/network/PacketHandler.java @@ -1,16 +1,26 @@ package amerifrance.guideapi.network; import amerifrance.guideapi.GuideMod; -import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; -import net.minecraftforge.fml.relauncher.Side; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.simple.SimpleChannel; + public class PacketHandler { + private static final String PROTOCOL_VERSION = Integer.toString(1); + private static byte packetId = 0; + + + public static SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder.named(new ResourceLocation(GuideMod.ID, "main")).clientAcceptedVersions(PROTOCOL_VERSION::equals).serverAcceptedVersions(PROTOCOL_VERSION::equals).networkProtocolVersion(() -> PROTOCOL_VERSION).simpleChannel(); - public static SimpleNetworkWrapper INSTANCE = new SimpleNetworkWrapper(GuideMod.CHANNEL); public static void registerPackets() { - INSTANCE.registerMessage(PacketSyncHome.class, PacketSyncHome.class, 0, Side.SERVER); - INSTANCE.registerMessage(PacketSyncCategory.class, PacketSyncCategory.class, 1, Side.SERVER); - INSTANCE.registerMessage(PacketSyncEntry.class, PacketSyncEntry.class, 2, Side.SERVER); + INSTANCE.registerMessage(nextID(), PacketSyncEntry.class, PacketSyncEntry::encode, PacketSyncEntry::decode, PacketSyncEntry::handle); + INSTANCE.registerMessage(nextID(), PacketSyncCategory.class, PacketSyncCategory::encode, PacketSyncCategory::decode, PacketSyncCategory::handle); + INSTANCE.registerMessage(nextID(), PacketSyncHome.class, PacketSyncHome::encode, PacketSyncHome::decode, PacketSyncHome::handle); + } + + protected static int nextID() { + return packetId++; } } diff --git a/src/main/java/amerifrance/guideapi/network/PacketSyncCategory.java b/src/main/java/amerifrance/guideapi/network/PacketSyncCategory.java index c1593e52..236b4351 100644 --- a/src/main/java/amerifrance/guideapi/network/PacketSyncCategory.java +++ b/src/main/java/amerifrance/guideapi/network/PacketSyncCategory.java @@ -2,14 +2,16 @@ import amerifrance.guideapi.api.IGuideItem; import amerifrance.guideapi.api.util.NBTBookTags; -import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent; +import org.apache.commons.lang3.Validate; -public class PacketSyncCategory implements IMessage, IMessageHandler { +import java.util.function.Supplier; + +public class PacketSyncCategory { public int category; public int page; @@ -24,34 +26,39 @@ public PacketSyncCategory(int category, int page) { this.page = page; } - @Override - public void fromBytes(ByteBuf buf) { - this.category = buf.readInt(); - this.page = buf.readInt(); + static void encode(PacketSyncCategory msg, PacketBuffer buf) { + buf.writeInt(msg.category); + buf.writeInt(msg.page); } - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(category); - buf.writeInt(page); + static PacketSyncCategory decode(PacketBuffer buf) { + PacketSyncCategory msg = new PacketSyncCategory(); + msg.category = buf.readInt(); + msg.page = buf.readInt(); + return msg; } - @Override - public IMessage onMessage(PacketSyncCategory message, MessageContext ctx) { - ItemStack book = ctx.getServerHandler().player.getHeldItemOffhand(); - if (book.isEmpty() || !(book.getItem() instanceof IGuideItem)) - book = ctx.getServerHandler().player.getHeldItemMainhand(); + public static void handle(final PacketSyncCategory msg, Supplier contextSupplier) { + final NetworkEvent.Context ctx = contextSupplier.get(); + ServerPlayerEntity player = ctx.getSender(); + Validate.notNull(player); + ctx.enqueueWork(() -> { + ItemStack book = player.getHeldItemOffhand(); + if (book.isEmpty() || !(book.getItem() instanceof IGuideItem)) + book = player.getHeldItemMainhand(); - if (!book.isEmpty() && book.getItem() instanceof IGuideItem) { - if (message.category != -1 && message.page != -1) { - if (!book.hasTagCompound()) - book.setTagCompound(new NBTTagCompound()); + if (!book.isEmpty() && book.getItem() instanceof IGuideItem) { + if (msg.category != -1 && msg.page != -1) { + if (!book.hasTag()) + book.setTag(new CompoundNBT()); - book.getTagCompound().setInteger(NBTBookTags.CATEGORY_TAG, message.category); - book.getTagCompound().setInteger(NBTBookTags.ENTRY_PAGE_TAG, message.page); - book.getTagCompound().removeTag(NBTBookTags.ENTRY_TAG); + book.getTag().putInt(NBTBookTags.CATEGORY_TAG, msg.category); + book.getTag().putInt(NBTBookTags.ENTRY_PAGE_TAG, msg.page); + book.getTag().remove(NBTBookTags.ENTRY_TAG); + } } - } - return null; + }); + ctx.setPacketHandled(true); } + } diff --git a/src/main/java/amerifrance/guideapi/network/PacketSyncEntry.java b/src/main/java/amerifrance/guideapi/network/PacketSyncEntry.java index 69952189..bf0af20a 100644 --- a/src/main/java/amerifrance/guideapi/network/PacketSyncEntry.java +++ b/src/main/java/amerifrance/guideapi/network/PacketSyncEntry.java @@ -2,16 +2,17 @@ import amerifrance.guideapi.api.IGuideItem; import amerifrance.guideapi.api.util.NBTBookTags; -import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.network.NetworkEvent; +import org.apache.commons.lang3.Validate; -public class PacketSyncEntry implements IMessage, IMessageHandler { +import java.util.function.Supplier; + +public class PacketSyncEntry { public int category; public ResourceLocation entry; @@ -29,36 +30,42 @@ public PacketSyncEntry(int category, ResourceLocation entry, int page) { this.page = page; } - @Override - public void fromBytes(ByteBuf buf) { - this.category = buf.readInt(); - this.entry = new ResourceLocation(ByteBufUtils.readUTF8String(buf)); - this.page = buf.readInt(); + static void encode(PacketSyncEntry msg, PacketBuffer buf) { + buf.writeInt(msg.category); + buf.writeResourceLocation(msg.entry); + buf.writeInt(msg.page); } - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(category); - ByteBufUtils.writeUTF8String(buf, entry.toString()); - buf.writeInt(page); + static PacketSyncEntry decode(PacketBuffer buf) { + PacketSyncEntry msg = new PacketSyncEntry(); + msg.category = buf.readInt(); + msg.entry = buf.readResourceLocation(); + msg.page = buf.readInt(); + return msg; } - @Override - public IMessage onMessage(PacketSyncEntry message, MessageContext ctx) { - ItemStack book = ctx.getServerHandler().player.getHeldItemOffhand(); - if (book.isEmpty() || !(book.getItem() instanceof IGuideItem)) - book = ctx.getServerHandler().player.getHeldItemMainhand(); + public static void handle(final PacketSyncEntry msg, Supplier contextSupplier) { + final NetworkEvent.Context ctx = contextSupplier.get(); + ServerPlayerEntity player = ctx.getSender(); + Validate.notNull(player); + ctx.enqueueWork(() -> { + ItemStack book = player.getHeldItemOffhand(); + if (book.isEmpty() || !(book.getItem() instanceof IGuideItem)) + book = player.getHeldItemMainhand(); - if (!book.isEmpty() && book.getItem() instanceof IGuideItem) { - if (message.category != -1 && !message.entry.equals(new ResourceLocation("guideapi", "none")) && message.page != -1) { - if (!book.hasTagCompound()) - book.setTagCompound(new NBTTagCompound()); + if (!book.isEmpty() && book.getItem() instanceof IGuideItem) { + if (msg.category != -1 && !msg.entry.equals(new ResourceLocation("guideapi", "none")) && msg.page != -1) { + if (!book.hasTag()) + book.setTag(new CompoundNBT()); - book.getTagCompound().setInteger(NBTBookTags.CATEGORY_TAG, message.category); - book.getTagCompound().setString(NBTBookTags.ENTRY_TAG, message.entry.toString()); - book.getTagCompound().setInteger(NBTBookTags.PAGE_TAG, message.page); + book.getTag().putInt(NBTBookTags.CATEGORY_TAG, msg.category); + book.getTag().putString(NBTBookTags.ENTRY_TAG, msg.entry.toString()); + book.getTag().putInt(NBTBookTags.PAGE_TAG, msg.page); + } } - } - return null; + }); + ctx.setPacketHandled(true); } + + } diff --git a/src/main/java/amerifrance/guideapi/network/PacketSyncHome.java b/src/main/java/amerifrance/guideapi/network/PacketSyncHome.java index 94ff2077..c3f80031 100644 --- a/src/main/java/amerifrance/guideapi/network/PacketSyncHome.java +++ b/src/main/java/amerifrance/guideapi/network/PacketSyncHome.java @@ -2,14 +2,16 @@ import amerifrance.guideapi.api.IGuideItem; import amerifrance.guideapi.api.util.NBTBookTags; -import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent; +import org.apache.commons.lang3.Validate; -public class PacketSyncHome implements IMessage, IMessageHandler { +import java.util.function.Supplier; + +public class PacketSyncHome { public int page; @@ -21,29 +23,33 @@ public PacketSyncHome(int page) { this.page = page; } - @Override - public void fromBytes(ByteBuf buf) { - this.page = buf.readInt(); + static void encode(PacketSyncHome msg, PacketBuffer buf) { + buf.writeInt(msg.page); } - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(page); + static PacketSyncHome decode(PacketBuffer buf) { + PacketSyncHome msg = new PacketSyncHome(); + msg.page = buf.readInt(); + return msg; } - @Override - public IMessage onMessage(PacketSyncHome message, MessageContext ctx) { - ItemStack book = ctx.getServerHandler().player.getHeldItemOffhand(); - if (book.isEmpty() || !(book.getItem() instanceof IGuideItem)) - book = ctx.getServerHandler().player.getHeldItemMainhand(); - - if (!book.isEmpty() && book.getItem() instanceof IGuideItem && message.page != -1) { - if (!book.hasTagCompound()) - book.setTagCompound(new NBTTagCompound()); - book.getTagCompound().setInteger(NBTBookTags.CATEGORY_PAGE_TAG, message.page); - book.getTagCompound().removeTag(NBTBookTags.CATEGORY_TAG); - book.getTagCompound().removeTag(NBTBookTags.ENTRY_TAG); - } - return null; + public static void handle(final PacketSyncHome msg, Supplier contextSupplier) { + final NetworkEvent.Context ctx = contextSupplier.get(); + ServerPlayerEntity player = ctx.getSender(); + Validate.notNull(player); + ctx.enqueueWork(() -> { + ItemStack book = player.getHeldItemOffhand(); + if (book.isEmpty() || !(book.getItem() instanceof IGuideItem)) + book = player.getHeldItemMainhand(); + + if (!book.isEmpty() && book.getItem() instanceof IGuideItem && msg.page != -1) { + if (!book.hasTag()) + book.setTag(new CompoundNBT()); + book.getTag().putInt(NBTBookTags.CATEGORY_PAGE_TAG, msg.page); + book.getTag().remove(NBTBookTags.CATEGORY_TAG); + book.getTag().remove(NBTBookTags.ENTRY_TAG); + } + }); + ctx.setPacketHandled(true); } } diff --git a/src/main/java/amerifrance/guideapi/page/PageBrewingRecipe.java b/src/main/java/amerifrance/guideapi/page/PageBrewingRecipe.java index 50129454..4faa05b9 100644 --- a/src/main/java/amerifrance/guideapi/page/PageBrewingRecipe.java +++ b/src/main/java/amerifrance/guideapi/page/PageBrewingRecipe.java @@ -6,15 +6,19 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; +import amerifrance.guideapi.api.util.IngredientCycler; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; +import net.minecraft.block.Blocks; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.brewing.BrewingRecipe; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.List; @@ -22,10 +26,12 @@ public class PageBrewingRecipe extends Page { public BrewingRecipe recipe; - public ItemStack ingredient; - public ItemStack input; + public Ingredient ingredient; + public Ingredient input; public ItemStack output; + private IngredientCycler cycler = new IngredientCycler(); + /** * Your brewing recipe - what you pass to BrewingRecipeRegistry.addRecipe * @@ -43,51 +49,56 @@ public PageBrewingRecipe(BrewingRecipe recipe) { * @param ingredient - What goes in the three bottle slots * @param output - Result of recipe */ - public PageBrewingRecipe(ItemStack input, ItemStack ingredient, ItemStack output) { + public PageBrewingRecipe(Ingredient input, Ingredient ingredient, ItemStack output) { this.input = input; - this.output = ingredient; - this.ingredient = output; + this.output = output; + this.ingredient = ingredient; } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + cycler.tick(guiBase.getMinecraft()); - int xStart = guiLeft + 62; + int xStart = guiLeft + 88; int yStart = guiTop + 52; SubTexture.POTION_GRID.draw(xStart, yStart); - List badTip = new ArrayList(); - badTip.add(TextHelper.localizeEffect("text.brewing.error")); + List badTip = new ArrayList<>(); + badTip.add(new TranslationTextComponent("guideapi.text.brewing.error")); - guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("text.brewing.brew"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); + guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("guideapi.text.brewing.brew"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); //int xmiddle = guiLeft + guiBase.xSize / 2 - 6; int x = xStart + 25;//since item stack is approx 16 wide int y = yStart + 1; //start input - GuiHelper.drawItemStack(ingredient, x, y); + int finalX = x; + int finalY = y; + cycler.getCycledIngredientStack(ingredient, 0).ifPresent(stack -> { + GuiHelper.drawItemStack(stack, finalX, finalY); + }); - List tooltip = null; + List tooltip = null; if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) - tooltip = GuiHelper.getTooltip(ingredient); + tooltip = GuiHelper.getTooltip(ingredient.getMatchingStacks()[0]); //the three bottles y += 39; - GuiHelper.drawItemStack(input, x, y); + GuiHelper.drawItemStack(input.getMatchingStacks()[0], x, y); if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) - tooltip = GuiHelper.getTooltip(input); + tooltip = GuiHelper.getTooltip(input.getMatchingStacks()[0]); int hSpacing = 24; x -= hSpacing; y -= 8; - GuiHelper.drawItemStack(input, x, y); + GuiHelper.drawItemStack(input.getMatchingStacks()[0], x, y); if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) - tooltip = GuiHelper.getTooltip(input); + tooltip = GuiHelper.getTooltip(input.getMatchingStacks()[0]); x += hSpacing * 2; - GuiHelper.drawItemStack(input, x, y); + GuiHelper.drawItemStack(input.getMatchingStacks()[0], x, y); if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) - tooltip = GuiHelper.getTooltip(input); + tooltip = GuiHelper.getTooltip(input.getMatchingStacks()[0]); if (output.isEmpty()) output = new ItemStack(Blocks.BARRIER); @@ -100,10 +111,11 @@ public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int tooltip = output.getItem() == Item.getItemFromBlock(Blocks.BARRIER) ? badTip : GuiHelper.getTooltip(output); if (output.getItem() == Item.getItemFromBlock(Blocks.BARRIER)) - guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("text.brewing.error"), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0xED073D); + guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("guideapi.text.brewing.error"), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0xED073D); if (tooltip != null) - guiBase.drawHoveringText(tooltip, mouseX, mouseY); + guiBase.drawHoveringTextComponents(tooltip, mouseX, mouseY); } + } diff --git a/src/main/java/amerifrance/guideapi/page/PageFurnaceRecipe.java b/src/main/java/amerifrance/guideapi/page/PageFurnaceRecipe.java deleted file mode 100644 index f37b2242..00000000 --- a/src/main/java/amerifrance/guideapi/page/PageFurnaceRecipe.java +++ /dev/null @@ -1,121 +0,0 @@ -package amerifrance.guideapi.page; - -import amerifrance.guideapi.api.SubTexture; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.Page; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.block.Block; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.List; - -public class PageFurnaceRecipe extends Page { - - public ItemStack input; - public ItemStack output; - - /** - * @param input - Input ItemStack to draw smelting result of - */ - public PageFurnaceRecipe(ItemStack input) { - this.input = input; - this.output = FurnaceRecipes.instance().getSmeltingResult(input); - } - - /** - * @param input - Input Item to draw smelting result of - */ - public PageFurnaceRecipe(Item input) { - this.input = new ItemStack(input); - this.output = FurnaceRecipes.instance().getSmeltingResult(new ItemStack(input)); - } - - /** - * @param input - Input Block to draw smelting result of - */ - public PageFurnaceRecipe(Block input) { - this.input = new ItemStack(input); - this.output = FurnaceRecipes.instance().getSmeltingResult(new ItemStack(input)); - } - - /** - * @param input - Input OreDict entry to draw smelting result of - */ - public PageFurnaceRecipe(String input) { - - this.input = new ItemStack(Blocks.FIRE); - - if (!OreDictionary.getOres(input).isEmpty()) - for (int i = 0; i < OreDictionary.getOres(input).size(); i++) { - ItemStack stack = OreDictionary.getOres(input).get(i); - - this.input = stack; - this.output = FurnaceRecipes.instance().getSmeltingResult(stack); - } - } - - @Override - @SideOnly(Side.CLIENT) - @SuppressWarnings("unchecked") - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - SubTexture.FURNACE_GRID.draw(guiLeft + 64, guiTop + 71); - - List badTip = new ArrayList(); - badTip.add(TextHelper.localizeEffect("text.furnace.error")); - - guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("text.furnace.smelting"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); - - int x = guiLeft + 66; - int y = guiTop + 77; - GuiHelper.drawItemStack(input, x, y); - - List tooltip = null; - if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) - tooltip = GuiHelper.getTooltip(input); - - if (output.isEmpty()) - output = new ItemStack(Blocks.BARRIER); - - x = guiLeft + 109; - GuiHelper.drawItemStack(output, x, y); - if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) - tooltip = output.getItem() == Item.getItemFromBlock(Blocks.BARRIER) ? badTip : GuiHelper.getTooltip(output); - - if (output.getItem() == Item.getItemFromBlock(Blocks.BARRIER)) - guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("text.furnace.error"), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0xED073D); - - if (tooltip != null) - guiBase.drawHoveringText(tooltip, mouseX, mouseY); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PageFurnaceRecipe)) return false; - if (!super.equals(o)) return false; - - PageFurnaceRecipe that = (PageFurnaceRecipe) o; - - if (input != null ? !input.equals(that.input) : that.input != null) return false; - return output != null ? output.equals(that.output) : that.output == null; - } - - @Override - public int hashCode() { - int result = input != null ? input.hashCode() : 0; - result = 31 * result + (output != null ? output.hashCode() : 0); - return result; - } -} diff --git a/src/main/java/amerifrance/guideapi/page/PageIRecipe.java b/src/main/java/amerifrance/guideapi/page/PageIRecipe.java index 60412c9d..924f3e52 100644 --- a/src/main/java/amerifrance/guideapi/page/PageIRecipe.java +++ b/src/main/java/amerifrance/guideapi/page/PageIRecipe.java @@ -5,43 +5,45 @@ import amerifrance.guideapi.api.impl.Page; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiEntry; -import amerifrance.guideapi.page.reciperenderer.ShapedOreRecipeRenderer; +import amerifrance.guideapi.api.util.IngredientCycler; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.EntryScreen; +import amerifrance.guideapi.page.reciperenderer.FurnaceRecipeRenderer; import amerifrance.guideapi.page.reciperenderer.ShapedRecipesRenderer; -import amerifrance.guideapi.page.reciperenderer.ShapelessOreRecipeRenderer; import amerifrance.guideapi.page.reciperenderer.ShapelessRecipesRenderer; import amerifrance.guideapi.util.LogHelper; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipe; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.item.crafting.ShapelessRecipe; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nullable; + public class PageIRecipe extends Page { - public IRecipe recipe; + public IRecipe recipe; public IRecipeRenderer iRecipeRenderer; protected boolean isValid; + private IngredientCycler ingredientCycler = new IngredientCycler(); /** * Use this if you are creating a page for a standard recipe, one of: *

*

    - *
  • {@link ShapedRecipes}
  • - *
  • {@link ShapelessRecipes}
  • - *
  • {@link ShapedOreRecipe}
  • - *
  • {@link ShapelessOreRecipe}
  • + *
  • {@link ShapedRecipe}
  • + *
  • {@link ShapelessRecipe}
  • + *
  • {@link FurnaceRecipe}
  • *
* * @param recipe - Recipe to draw */ - public PageIRecipe(IRecipe recipe) { + public PageIRecipe(IRecipe recipe) { this(recipe, getRenderer(recipe)); } @@ -49,57 +51,49 @@ public PageIRecipe(IRecipe recipe) { * @param recipe - Recipe to draw * @param iRecipeRenderer - Your custom Recipe drawer */ - public PageIRecipe(IRecipe recipe, IRecipeRenderer iRecipeRenderer) { + public PageIRecipe(IRecipe recipe, IRecipeRenderer iRecipeRenderer) { this.recipe = recipe; this.iRecipeRenderer = iRecipeRenderer; isValid = recipe != null && iRecipeRenderer != null; } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - if(isValid) { + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + if (isValid) { super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); - iRecipeRenderer.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); + ingredientCycler.tick(guiBase.getMinecraft()); + iRecipeRenderer.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj, ingredientCycler); } } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - if(isValid) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + if (isValid) { super.drawExtras(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); iRecipeRenderer.drawExtras(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); } } @Override - public boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack, GuiEntry guiEntry) { + public boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry) { return isValid; } - public static PageIRecipe newShaped(ItemStack output, Object... input) { - return new PageIRecipe(new ShapedOreRecipe(null, output, input)); - } - - public static PageIRecipe newShapeless(ItemStack output, Object... input) { - return new PageIRecipe(new ShapelessOreRecipe(null, output, input)); - } - static IRecipeRenderer getRenderer(IRecipe recipe) { + @Nullable + public static IRecipeRenderer getRenderer(IRecipe recipe) { if (recipe == null) { LogHelper.error("Cannot get renderer for null recipe."); return null; - } else if (recipe instanceof ShapedRecipes) { - return new ShapedRecipesRenderer((ShapedRecipes) recipe); - } else if (recipe instanceof ShapelessRecipes) { - return new ShapelessRecipesRenderer((ShapelessRecipes) recipe); - } else if (recipe instanceof ShapedOreRecipe) { - return new ShapedOreRecipeRenderer((ShapedOreRecipe) recipe); - } else if (recipe instanceof ShapelessOreRecipe) { - return new ShapelessOreRecipeRenderer((ShapelessOreRecipe) recipe); + } else if (recipe instanceof ShapedRecipe) { + return new ShapedRecipesRenderer((ShapedRecipe) recipe); + } else if (recipe instanceof ShapelessRecipe) { + return new ShapelessRecipesRenderer((ShapelessRecipe) recipe); + } else if (recipe instanceof FurnaceRecipe) { + return new FurnaceRecipeRenderer((FurnaceRecipe) recipe); } else { - LogHelper.error("Cannot get renderer for recipe type "+recipe.getClass().toString()); return null; } } diff --git a/src/main/java/amerifrance/guideapi/page/PageImage.java b/src/main/java/amerifrance/guideapi/page/PageImage.java index e133b1c9..28305821 100644 --- a/src/main/java/amerifrance/guideapi/page/PageImage.java +++ b/src/main/java/amerifrance/guideapi/page/PageImage.java @@ -5,12 +5,12 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class PageImage extends Page { @@ -24,10 +24,10 @@ public PageImage(ResourceLocation image) { } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - Minecraft.getMinecraft().getTextureManager().bindTexture(image); - GuiHelper.drawSizedIconWithoutColor(guiLeft + 50, guiTop + 34, guiBase.xSize, guiBase.ySize, 1F); + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + Minecraft.getInstance().getTextureManager().bindTexture(image); + GuiHelper.drawSizedIconWithoutColor(guiLeft + 60, guiTop + 34, guiBase.xSize, guiBase.ySize, 1F); } @Override diff --git a/src/main/java/amerifrance/guideapi/page/PageItemStack.java b/src/main/java/amerifrance/guideapi/page/PageItemStack.java index a189bdf7..68837971 100644 --- a/src/main/java/amerifrance/guideapi/page/PageItemStack.java +++ b/src/main/java/amerifrance/guideapi/page/PageItemStack.java @@ -4,27 +4,33 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.api.util.IngredientCycler; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.block.Block; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.oredict.OreDictionary; +import net.minecraft.item.crafting.Ingredient; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class PageItemStack extends PageText { - public ItemStack stack; + public Ingredient ingredient; + private IngredientCycler ingredientCycler = new IngredientCycler(); + + + public PageItemStack(String draw, Ingredient ingredient) { + super(draw, 60); + this.ingredient = ingredient; + } /** - * @param draw - Unlocalized text to draw - * @param stack - ItemStack to render + * @param draw - Unlocalized text to draw + * @param ingredient - ItemStack to render */ - public PageItemStack(String draw, ItemStack stack) { - super(draw, 60); - this.stack = stack; + public PageItemStack(String draw, ItemStack ingredient) { + this(draw, Ingredient.fromStacks(ingredient)); } /** @@ -43,26 +49,14 @@ public PageItemStack(String draw, Block block) { this(draw, new ItemStack(block)); } - /** - * @param draw - Unlocalized text to draw - * @param entry - OreDict entry to render - */ - public PageItemStack(String draw, String entry) { - super(draw, 60); - this.stack = new ItemStack(Blocks.FIRE); - - if (!OreDictionary.getOres(entry).isEmpty()) { - for (int i = 0; i < OreDictionary.getOres(entry).size(); i++) { - ItemStack stack = OreDictionary.getOres(entry).get(i); - this.stack = stack; - } - } - } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - GuiHelper.drawScaledItemStack(stack, guiLeft + 75, guiTop + 20, 3); + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + ingredientCycler.tick(guiBase.getMinecraft()); + ingredientCycler.getCycledIngredientStack(ingredient, 0).ifPresent(stack -> { + GuiHelper.drawScaledItemStack(stack, guiLeft + 101, guiTop + 20, 3); + }); } @Override @@ -73,13 +67,13 @@ public boolean equals(Object o) { PageItemStack that = (PageItemStack) o; - return stack != null ? stack.equals(that.stack) : that.stack == null; + return ingredient != null ? ingredient.equals(that.ingredient) : that.ingredient == null; } @Override public int hashCode() { int result = super.hashCode(); - result = 31 * result + (stack != null ? stack.hashCode() : 0); + result = 31 * result + (ingredient != null ? ingredient.hashCode() : 0); return result; } } diff --git a/src/main/java/amerifrance/guideapi/page/PageJsonRecipe.java b/src/main/java/amerifrance/guideapi/page/PageJsonRecipe.java index 6ad26f9a..7a5530ec 100644 --- a/src/main/java/amerifrance/guideapi/page/PageJsonRecipe.java +++ b/src/main/java/amerifrance/guideapi/page/PageJsonRecipe.java @@ -1,21 +1,56 @@ package amerifrance.guideapi.page; +import amerifrance.guideapi.api.IRecipeRenderer; +import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; +import amerifrance.guideapi.gui.EntryScreen; +import amerifrance.guideapi.util.LogHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import javax.annotation.Nonnull; +import java.util.function.Function; public class PageJsonRecipe extends PageIRecipe { + @Nonnull private final ResourceLocation recipeId; + @Nonnull + private final Function, IRecipeRenderer> recipeRendererSupplier; public PageJsonRecipe(ResourceLocation recipeId) { - super(null, null); + this(recipeId, PageIRecipe::getRenderer); + } + public PageJsonRecipe(ResourceLocation recipeId, Function, IRecipeRenderer> rendererSupplier) { + super(null, null); this.recipeId = recipeId; + this.recipeRendererSupplier = rendererSupplier; } - public void init() { - this.recipe = ForgeRegistries.RECIPES.getValue(recipeId); - this.iRecipeRenderer = getRenderer(recipe); + @OnlyIn(Dist.CLIENT) + @Override + public void onInit(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry) { + super.onInit(book, category, entry, player, bookStack, guiEntry); + if (recipe == null) { + this.recipe = Minecraft.getInstance().getConnection() == null ? null : Minecraft.getInstance().getConnection().getRecipeManager().getRecipe(recipeId).orElse(null); + if (recipe == null) { + LogHelper.error("Cannot find recipe " + recipeId.toString()); + } else { + if (iRecipeRenderer == null) { + iRecipeRenderer = recipeRendererSupplier.apply(recipe); + if (iRecipeRenderer == null) { + LogHelper.error("Did not get renderer for recipe type " + recipe.getClass().toString() + " for recipe " + recipeId.toString()); + } + } + } + } this.isValid = recipe != null && iRecipeRenderer != null; } } \ No newline at end of file diff --git a/src/main/java/amerifrance/guideapi/page/PageSound.java b/src/main/java/amerifrance/guideapi/page/PageSound.java index ff761a3e..783cfac4 100644 --- a/src/main/java/amerifrance/guideapi/page/PageSound.java +++ b/src/main/java/amerifrance/guideapi/page/PageSound.java @@ -6,14 +6,14 @@ import amerifrance.guideapi.api.impl.Page; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiEntry; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.EntryScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.SoundEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class PageSound extends Page { @@ -30,32 +30,32 @@ public PageSound(IPage pageToEmulate, SoundEvent sound) { } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { pageToEmulate.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); } @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { + @OnlyIn(Dist.CLIENT) + public void drawExtras(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { pageToEmulate.drawExtras(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); } @Override - public boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, EntityPlayer player, ItemStack bookStack, GuiEntry guiEntry) { + public boolean canSee(Book book, CategoryAbstract category, EntryAbstract entry, PlayerEntity player, ItemStack bookStack, EntryScreen guiEntry) { return pageToEmulate.canSee(book, category, entry, player, bookStack, guiEntry); } @Override - @SideOnly(Side.CLIENT) - public void onLeftClicked(Book book, CategoryAbstract category, EntryAbstract entry, int mouseX, int mouseY, EntityPlayer player, GuiEntry guiEntry) { + @OnlyIn(Dist.CLIENT) + public void onLeftClicked(Book book, CategoryAbstract category, EntryAbstract entry, double mouseX, double mouseY, PlayerEntity player, EntryScreen guiEntry) { GuideMod.PROXY.playSound(sound); pageToEmulate.onLeftClicked(book, category, entry, mouseX, mouseY, player, guiEntry); } @Override - @SideOnly(Side.CLIENT) - public void onRightClicked(Book book, CategoryAbstract category, EntryAbstract entry, int mouseX, int mouseY, EntityPlayer player, GuiEntry guiEntry) { + @OnlyIn(Dist.CLIENT) + public void onRightClicked(Book book, CategoryAbstract category, EntryAbstract entry, double mouseX, double mouseY, PlayerEntity player, EntryScreen guiEntry) { pageToEmulate.onRightClicked(book, category, entry, mouseX, mouseY, player, guiEntry); } diff --git a/src/main/java/amerifrance/guideapi/page/PageText.java b/src/main/java/amerifrance/guideapi/page/PageText.java index 078fb600..a6a90f25 100644 --- a/src/main/java/amerifrance/guideapi/page/PageText.java +++ b/src/main/java/amerifrance/guideapi/page/PageText.java @@ -5,11 +5,12 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.PageHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.resources.I18n; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.ForgeI18n; + public class PageText extends Page { @@ -26,21 +27,15 @@ public PageText(String draw, int yOffset) { } public PageText(String draw) { - this(draw, 0); + this(draw, 5); } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - boolean startFlag = fontRendererObj.getUnicodeFlag(); - - if (unicode) - fontRendererObj.setUnicodeFlag(true); + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { - PageHelper.drawFormattedText(guiLeft + 39, guiTop + 12 + yOffset, guiBase, I18n.format(draw)); + PageHelper.drawFormattedText(guiLeft + 44, guiTop + 12 + yOffset, guiBase, ForgeI18n.getPattern(draw)); - if (unicode && !startFlag) - fontRendererObj.setUnicodeFlag(false); } @Override diff --git a/src/main/java/amerifrance/guideapi/page/PageTextImage.java b/src/main/java/amerifrance/guideapi/page/PageTextImage.java index a8f51927..ad2083aa 100644 --- a/src/main/java/amerifrance/guideapi/page/PageTextImage.java +++ b/src/main/java/amerifrance/guideapi/page/PageTextImage.java @@ -5,12 +5,12 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; public class PageTextImage extends Page { @@ -30,12 +30,11 @@ public PageTextImage(String draw, ResourceLocation image, boolean drawAtTop) { } @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - Minecraft.getMinecraft().getTextureManager().bindTexture(image); - GuiHelper.drawSizedIconWithoutColor(guiLeft + 50, guiTop + (drawAtTop ? 60 : 12), guiBase.xSize, guiBase.ySize, 0); + @OnlyIn(Dist.CLIENT) + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj) { + Minecraft.getInstance().getTextureManager().bindTexture(image); + GuiHelper.drawSizedIconWithoutColor(guiLeft + 60, guiTop + (drawAtTop ? 60 : 12), guiBase.xSize, guiBase.ySize, 0); - pageText.setUnicodeFlag(unicode); pageText.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); } diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/BasicRecipeRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/BasicRecipeRenderer.java deleted file mode 100644 index ddf74344..00000000 --- a/src/main/java/amerifrance/guideapi/page/reciperenderer/BasicRecipeRenderer.java +++ /dev/null @@ -1,82 +0,0 @@ -package amerifrance.guideapi.page.reciperenderer; - -import amerifrance.guideapi.api.IRecipeRenderer.RecipeRendererBase; -import amerifrance.guideapi.api.SubTexture; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; -import com.google.common.base.Strings; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.NonNullList; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.Random; - -public class BasicRecipeRenderer extends RecipeRendererBase { - - private long lastCycle = -1; - private int cycleIdx = 0; - private Random rand = new Random(); - private String customDisplay; - - public BasicRecipeRenderer(T recipe) { - super(recipe); - } - - @Override - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - Minecraft mc = Minecraft.getMinecraft(); - - long time = mc.world.getTotalWorldTime(); - if (lastCycle < 0 || lastCycle < time - 20) { - if (lastCycle > 0) { - cycleIdx++; - cycleIdx = Math.max(0, cycleIdx); - } - lastCycle = mc.world.getTotalWorldTime(); - } - - SubTexture.CRAFTING_GRID.draw(guiLeft + 42, guiTop + 53); - - String recipeName = Strings.isNullOrEmpty(customDisplay) ? getRecipeName() : customDisplay; - guiBase.drawCenteredString(fontRendererObj, recipeName, guiLeft + guiBase.xSize / 2, guiTop + 12, 0); - - int outputX = (5 * 18) + (guiLeft + guiBase.xSize / 7) + 5; - int outputY = (2 * 18) + (guiTop + guiBase.xSize / 5); - - ItemStack stack = recipe.getRecipeOutput(); - - if (!stack.isEmpty() && stack.getItemDamage() == OreDictionary.WILDCARD_VALUE) - stack = getNextItem(stack, 0); - - GuiHelper.drawItemStack(stack, outputX, outputY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) - tooltips = GuiHelper.getTooltip(recipe.getRecipeOutput()); - } - - protected ItemStack getNextItem(ItemStack stack, int position) { - NonNullList subItems = NonNullList.create(); - stack.getItem().getSubItems(CreativeTabs.SEARCH, subItems); - return subItems.get(getRandomizedCycle(position, subItems.size())); - } - - protected int getRandomizedCycle(int index, int max) { - rand.setSeed(index); - return (index + rand.nextInt(max) + cycleIdx) % max; - } - - protected String getRecipeName() { - return TextHelper.localizeEffect("text.shaped.crafting"); - } - - public void setCustomTitle(String customDisplay) { - this.customDisplay = customDisplay; - } -} diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/CraftingRecipeRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/CraftingRecipeRenderer.java new file mode 100644 index 00000000..1d13ace4 --- /dev/null +++ b/src/main/java/amerifrance/guideapi/page/reciperenderer/CraftingRecipeRenderer.java @@ -0,0 +1,60 @@ +package amerifrance.guideapi.page.reciperenderer; + +import amerifrance.guideapi.api.IRecipeRenderer.RecipeRendererBase; +import amerifrance.guideapi.api.SubTexture; +import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; +import amerifrance.guideapi.api.util.GuiHelper; +import amerifrance.guideapi.api.util.IngredientCycler; +import amerifrance.guideapi.api.util.TextHelper; +import amerifrance.guideapi.gui.BaseScreen; +import com.google.common.base.Strings; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; + +public abstract class CraftingRecipeRenderer> extends RecipeRendererBase { + + + private String customDisplay; + + public CraftingRecipeRenderer(T recipe) { + super(recipe); + } + + @Override + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj, IngredientCycler cycler) { + + SubTexture.CRAFTING_GRID.draw(guiLeft + 68, guiTop + 53); + + String recipeName = Strings.isNullOrEmpty(customDisplay) ? getRecipeName() : customDisplay; + guiBase.drawCenteredString(fontRendererObj, recipeName, guiLeft + guiBase.xSize / 2, guiTop + 12, 0); + + int outputX = guiLeft + 148; + int outputY = guiTop + 73; + + ItemStack stack = recipe.getRecipeOutput(); + + GuiHelper.drawItemStack(stack, outputX, outputY); + if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) + tooltips = GuiHelper.getTooltip(recipe.getRecipeOutput()); + } + +// protected ItemStack getNextItem(ItemStack stack, int position) { +// NonNullList subItems = NonNullList.create(); +// stack.getItem().fillItemGroup(ItemGroup.SEARCH, subItems); +// return subItems.get(getRandomizedCycle(position, subItems.size())); +// } + + + protected String getRecipeName() { + return TextHelper.localizeEffect("guideapi.text.crafting.shaped"); + } + + public void setCustomTitle(String customDisplay) { + this.customDisplay = customDisplay; + } + + +} diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/FurnaceRecipeRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/FurnaceRecipeRenderer.java new file mode 100644 index 00000000..82244ab9 --- /dev/null +++ b/src/main/java/amerifrance/guideapi/page/reciperenderer/FurnaceRecipeRenderer.java @@ -0,0 +1,53 @@ +package amerifrance.guideapi.page.reciperenderer; + +import amerifrance.guideapi.api.IRecipeRenderer; +import amerifrance.guideapi.api.SubTexture; +import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; +import amerifrance.guideapi.api.util.GuiHelper; +import amerifrance.guideapi.api.util.IngredientCycler; +import amerifrance.guideapi.api.util.TextHelper; +import amerifrance.guideapi.gui.BaseScreen; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipe; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.text.ITextComponent; + +import java.util.List; + + +public class FurnaceRecipeRenderer extends IRecipeRenderer.RecipeRendererBase { + public FurnaceRecipeRenderer(FurnaceRecipe recipe) { + super(recipe); + } + + @Override + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj, IngredientCycler cycler) { + SubTexture.FURNACE_GRID.draw(guiLeft + 90, guiTop + 71); + + guiBase.drawCenteredString(fontRendererObj, TextHelper.localizeEffect("guideapi.text.furnace.smelting"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); + + int x = guiLeft + 92; + int y = guiTop + 77; + + Ingredient input = recipe.getIngredients().get(0); + cycler.getCycledIngredientStack(input, 0).ifPresent(stack -> { + GuiHelper.drawItemStack(stack, x, y); + + List tooltip = null; + if (GuiHelper.isMouseBetween(mouseX, mouseY, x, y, 15, 15)) + tooltips = GuiHelper.getTooltip(stack); + }); + + + ItemStack output = recipe.getRecipeOutput(); + + int x2 = guiLeft + 135; + GuiHelper.drawItemStack(output, x2, y); + if (GuiHelper.isMouseBetween(mouseX, mouseY, x2, y, 15, 15)) + tooltips = GuiHelper.getTooltip(output); + + } +} diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedOreRecipeRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedOreRecipeRenderer.java deleted file mode 100644 index 593f7400..00000000 --- a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedOreRecipeRenderer.java +++ /dev/null @@ -1,12 +0,0 @@ -package amerifrance.guideapi.page.reciperenderer; - -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraftforge.oredict.ShapedOreRecipe; - -// TODO: Fix rendering of recipe -public class ShapedOreRecipeRenderer extends ShapedRecipesRenderer { - - public ShapedOreRecipeRenderer(ShapedOreRecipe recipe) { - super(new ShapedRecipes(recipe.getGroup(), recipe.getWidth(), recipe.getHeight(), recipe.getIngredients(), recipe.getRecipeOutput())); - } -} diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedRecipesRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedRecipesRenderer.java index 36e5591b..dbfebefc 100644 --- a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedRecipesRenderer.java +++ b/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapedRecipesRenderer.java @@ -4,40 +4,33 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.api.util.IngredientCycler; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; -import net.minecraft.item.crafting.ShapedRecipes; -import net.minecraftforge.oredict.OreDictionary; +import net.minecraft.item.crafting.ShapedRecipe; -import java.util.Arrays; -import java.util.List; +public class ShapedRecipesRenderer extends CraftingRecipeRenderer { -public class ShapedRecipesRenderer extends BasicRecipeRenderer { - - public ShapedRecipesRenderer(ShapedRecipes recipe) { + public ShapedRecipesRenderer(ShapedRecipe recipe) { super(recipe); } @Override - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); - for (int y = 0; y < recipe.recipeHeight; y++) { - for (int x = 0; x < recipe.recipeWidth; x++) { - int stackX = (x + 1) * 17 + (guiLeft + 27) + x; + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj, IngredientCycler cycler) { + super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj, cycler); + for (int y = 0; y < recipe.getRecipeHeight(); y++) { + for (int x = 0; x < recipe.getRecipeWidth(); x++) { + int i = y * recipe.getRecipeWidth() + x; + int stackX = (x + 1) * 17 + (guiLeft + 53) + x; int stackY = (y + 1) * 17 + (guiTop + 38) + y; - Ingredient ingredient = recipe.getIngredients().get(y * recipe.recipeWidth + x); - List list = Arrays.asList(ingredient.getMatchingStacks()); - if (!list.isEmpty()) { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 3), list.size())); - if (stack.getItemDamage() == OreDictionary.WILDCARD_VALUE) - stack = getNextItem(stack, x); + Ingredient ingredient = recipe.getIngredients().get(i); + cycler.getCycledIngredientStack(ingredient, i).ifPresent(stack -> { GuiHelper.drawItemStack(stack, stackX, stackY); if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) tooltips = GuiHelper.getTooltip(stack); - } + }); } } } diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessOreRecipeRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessOreRecipeRenderer.java deleted file mode 100644 index e4e25fce..00000000 --- a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessOreRecipeRenderer.java +++ /dev/null @@ -1,11 +0,0 @@ -package amerifrance.guideapi.page.reciperenderer; - -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -public class ShapelessOreRecipeRenderer extends ShapelessRecipesRenderer { - - public ShapelessOreRecipeRenderer(ShapelessOreRecipe recipe) { - super(new ShapelessRecipes(recipe.getGroup(), recipe.getRecipeOutput(), recipe.getIngredients())); - } -} diff --git a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessRecipesRenderer.java b/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessRecipesRenderer.java index 10733a3b..a6e456b9 100644 --- a/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessRecipesRenderer.java +++ b/src/main/java/amerifrance/guideapi/page/reciperenderer/ShapelessRecipesRenderer.java @@ -4,43 +4,34 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; +import amerifrance.guideapi.api.util.IngredientCycler; import amerifrance.guideapi.api.util.TextHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; -import net.minecraft.item.crafting.ShapelessRecipes; -import net.minecraftforge.oredict.OreDictionary; +import net.minecraft.item.crafting.ShapelessRecipe; -import java.util.Arrays; -import java.util.List; +public class ShapelessRecipesRenderer extends CraftingRecipeRenderer { -public class ShapelessRecipesRenderer extends BasicRecipeRenderer { - - public ShapelessRecipesRenderer(ShapelessRecipes recipe) { + public ShapelessRecipesRenderer(ShapelessRecipe recipe) { super(recipe); } @Override - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj); + public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, BaseScreen guiBase, FontRenderer fontRendererObj, IngredientCycler cycler) { + super.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, guiBase, fontRendererObj, cycler); for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { int i = 3 * y + x; - int stackX = (x + 1) * 17 + (guiLeft + 27) + x; + int stackX = (x + 1) * 17 + (guiLeft + 53) + x; int stackY = (y + 1) * 17 + (guiTop + 38) + y; if (i < recipe.getIngredients().size()) { Ingredient ingredient = recipe.getIngredients().get(i); - List list = Arrays.asList(ingredient.getMatchingStacks()); - if (!list.isEmpty()) { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 3), list.size())); - if (stack.getItemDamage() == OreDictionary.WILDCARD_VALUE) - stack = getNextItem(stack, x); - + cycler.getCycledIngredientStack(ingredient, i).ifPresent(stack -> { GuiHelper.drawItemStack(stack, stackX, stackY); if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) tooltips = GuiHelper.getTooltip(stack); - } + }); } } } @@ -48,6 +39,6 @@ public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int @Override protected String getRecipeName() { - return TextHelper.localizeEffect("text.shapeless.crafting"); + return TextHelper.localizeEffect("guideapi.text.crafting.shapeless"); } } diff --git a/src/main/java/amerifrance/guideapi/proxy/ClientProxy.java b/src/main/java/amerifrance/guideapi/proxy/ClientProxy.java index 2122c622..38655c6f 100644 --- a/src/main/java/amerifrance/guideapi/proxy/ClientProxy.java +++ b/src/main/java/amerifrance/guideapi/proxy/ClientProxy.java @@ -6,36 +6,42 @@ import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiEntry; +import amerifrance.guideapi.api.util.NBTBookTags; +import amerifrance.guideapi.gui.CategoryScreen; +import amerifrance.guideapi.gui.EntryScreen; +import amerifrance.guideapi.gui.HomeScreen; import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.PositionedSoundRecord; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.audio.SimpleSound; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; +import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; public class ClientProxy extends CommonProxy { @Override public void playSound(SoundEvent sound) { - Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(sound, 1.0F)); + Minecraft.getInstance().getSoundHandler().play(SimpleSound.master(sound, 1)); } @Override - public void openEntry(Book book, CategoryAbstract categoryAbstract, EntryAbstract entryAbstract, EntityPlayer player, ItemStack stack) { + public void openEntry(Book book, CategoryAbstract categoryAbstract, EntryAbstract entryAbstract, PlayerEntity player, ItemStack stack) { BookEvent.Open event = new BookEvent.Open(book, stack, player); if (MinecraftForge.EVENT_BUS.post(event)) { player.sendStatusMessage(event.getCanceledText(), true); return; } - Minecraft.getMinecraft().displayGuiScreen(new GuiEntry(book, categoryAbstract, entryAbstract, player, stack)); + Minecraft.getInstance().displayGuiScreen(new EntryScreen(book, categoryAbstract, entryAbstract, player, stack)); } @Override public void initColors() { for (ItemStack bookStack : GuideAPI.getBookToStack().values()) { - Minecraft.getMinecraft().getItemColors().registerItemColorHandler((stack, tintIndex) -> { + Minecraft.getInstance().getItemColors().register((stack, tintIndex) -> { IGuideItem guideItem = (IGuideItem) stack.getItem(); if (guideItem.getBook(stack) != null && tintIndex == 0) return guideItem.getBook(stack).getColor().getRGB(); @@ -44,4 +50,42 @@ public void initColors() { }, bookStack.getItem()); } } + + @Override + public void openGuidebook(PlayerEntity player, World world, Book book, ItemStack bookStack) { + if (!bookStack.isEmpty() && bookStack.getItem() instanceof IGuideItem) { + book.initializeContent(); + try { + if (bookStack.hasTag()) { + CompoundNBT tagCompound = bookStack.getTag(); + if (tagCompound.contains(NBTBookTags.ENTRY_TAG) && tagCompound.contains(NBTBookTags.CATEGORY_TAG)) { + CategoryAbstract category = book.getCategoryList().get(tagCompound.getInt(NBTBookTags.CATEGORY_TAG)); + EntryAbstract entry = category.entries.get(new ResourceLocation(tagCompound.getString(NBTBookTags.ENTRY_TAG))); + int pageNumber = tagCompound.getInt(NBTBookTags.PAGE_TAG); + EntryScreen guiEntry = new EntryScreen(book, category, entry, player, bookStack); + guiEntry.pageNumber = pageNumber; + Minecraft.getInstance().displayGuiScreen(guiEntry); + return; + } else if (tagCompound.contains(NBTBookTags.CATEGORY_TAG)) { + CategoryAbstract category = book.getCategoryList().get(tagCompound.getInt(NBTBookTags.CATEGORY_TAG)); + int entryPage = tagCompound.getInt(NBTBookTags.ENTRY_PAGE_TAG); + CategoryScreen guiCategory = new CategoryScreen(book, category, player, bookStack, null); + guiCategory.entryPage = entryPage; + Minecraft.getInstance().displayGuiScreen(guiCategory); + return; + } else { + int categoryNumber = tagCompound.getInt(NBTBookTags.CATEGORY_PAGE_TAG); + HomeScreen guiHome = new HomeScreen(book, player, bookStack); + guiHome.categoryPage = categoryNumber; + Minecraft.getInstance().displayGuiScreen(guiHome); + return; + } + } + } catch (Exception e) { + // No-op: If the linked content doesn't exist anymore + } + + Minecraft.getInstance().displayGuiScreen(new HomeScreen(book, player, bookStack)); + } + } } diff --git a/src/main/java/amerifrance/guideapi/proxy/CommonProxy.java b/src/main/java/amerifrance/guideapi/proxy/CommonProxy.java index 4d9c6c71..e3f34384 100644 --- a/src/main/java/amerifrance/guideapi/proxy/CommonProxy.java +++ b/src/main/java/amerifrance/guideapi/proxy/CommonProxy.java @@ -1,73 +1,23 @@ package amerifrance.guideapi.proxy; -import amerifrance.guideapi.api.GuideAPI; -import amerifrance.guideapi.api.IGuideItem; import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.NBTBookTags; -import amerifrance.guideapi.gui.GuiCategory; -import amerifrance.guideapi.gui.GuiEntry; -import amerifrance.guideapi.gui.GuiHome; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumHand; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.world.World; -import net.minecraftforge.fml.common.network.IGuiHandler; -public class CommonProxy implements IGuiHandler { +public class CommonProxy { - @Override - public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - return null; - } - - @Override - public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { - ItemStack bookStack = player.getHeldItem(EnumHand.values()[x]); - - if (!bookStack.isEmpty() && bookStack.getItem() instanceof IGuideItem) { - Book book = GuideAPI.getIndexedBooks().get(ID); - try { - if (bookStack.hasTagCompound()) { - NBTTagCompound tagCompound = bookStack.getTagCompound(); - if (tagCompound.hasKey(NBTBookTags.ENTRY_TAG) && tagCompound.hasKey(NBTBookTags.CATEGORY_TAG)) { - CategoryAbstract category = book.getCategoryList().get(tagCompound.getInteger(NBTBookTags.CATEGORY_TAG)); - EntryAbstract entry = category.entries.get(new ResourceLocation(tagCompound.getString(NBTBookTags.ENTRY_TAG))); - int pageNumber = tagCompound.getInteger(NBTBookTags.PAGE_TAG); - GuiEntry guiEntry = new GuiEntry(book, category, entry, player, bookStack); - guiEntry.pageNumber = pageNumber; - return guiEntry; - } else if (tagCompound.hasKey(NBTBookTags.CATEGORY_TAG)) { - CategoryAbstract category = book.getCategoryList().get(tagCompound.getInteger(NBTBookTags.CATEGORY_TAG)); - int entryPage = tagCompound.getInteger(NBTBookTags.ENTRY_PAGE_TAG); - GuiCategory guiCategory = new GuiCategory(book, category, player, bookStack, null); - guiCategory.entryPage = entryPage; - return guiCategory; - } else { - int categoryNumber = tagCompound.getInteger(NBTBookTags.CATEGORY_PAGE_TAG); - GuiHome guiHome = new GuiHome(book, player, bookStack); - guiHome.categoryPage = categoryNumber; - return guiHome; - } - } - } catch (Exception e) { - // No-op: If the linked content doesn't exist anymore - } - - return new GuiHome(book, player, bookStack); - } - return null; + public void openGuidebook(PlayerEntity player, World world, Book book, ItemStack bookStack) { } public void playSound(SoundEvent sound) { } - public void openEntry(Book book, CategoryAbstract categoryAbstract, EntryAbstract entryAbstract, EntityPlayer player, ItemStack stack) { + public void openEntry(Book book, CategoryAbstract categoryAbstract, EntryAbstract entryAbstract, PlayerEntity player, ItemStack stack) { } public void initColors() { diff --git a/src/main/java/amerifrance/guideapi/test/TestBook.java b/src/main/java/amerifrance/guideapi/test/TestBook.java index 09650f02..85525338 100644 --- a/src/main/java/amerifrance/guideapi/test/TestBook.java +++ b/src/main/java/amerifrance/guideapi/test/TestBook.java @@ -4,27 +4,28 @@ import amerifrance.guideapi.api.IGuideBook; import amerifrance.guideapi.api.IPage; import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.BookBinder; import amerifrance.guideapi.api.impl.Entry; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; +import amerifrance.guideapi.api.util.PageHelper; import amerifrance.guideapi.category.CategoryItemStack; import amerifrance.guideapi.entry.EntryItemStack; -import amerifrance.guideapi.page.PageFurnaceRecipe; -import amerifrance.guideapi.page.PageIRecipe; -import amerifrance.guideapi.page.PageJsonRecipe; -import amerifrance.guideapi.page.PageText; +import amerifrance.guideapi.page.*; +import amerifrance.guideapi.page.reciperenderer.ShapedRecipesRenderer; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; +import net.minecraft.block.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.oredict.ShapedOreRecipe; -import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.awt.Color; +import java.awt.*; import java.util.List; import java.util.Map; @@ -36,35 +37,42 @@ public class TestBook implements IGuideBook { @Nullable @Override public Book buildBook() { - book = new Book(); - book.setAuthor("TehNut"); - book.setColor(Color.GRAY); - book.setDisplayName("Display Name"); - book.setTitle("Title message"); - book.setWelcomeMessage("Is this still a thing?"); + BookBinder binder = new BookBinder(new ResourceLocation("guideapi", "test_book")); + binder.setAuthor("TehNut").setColor(Color.PINK).setItemName("Display Name").setHeader("Hello there").setGuideTitle("Title message").setSpawnWithBook().setContentProvider(this::buildContent); + return (book = binder.build()); + } + + private void buildContent(List categories) { - List categories = Lists.newArrayList(); Map entries = Maps.newHashMap(); List pages = Lists.newArrayList(); - pages.add(new PageText("Hello, this is\nsome text")); - pages.add(new PageFurnaceRecipe(Blocks.COBBLESTONE)); - pages.add(PageIRecipe.newShaped(new ItemStack(Items.ACACIA_BOAT), "X X", "XXX", 'X', "plankWood")); + pages.add(new PageText("Hello, this is\nsome text with a new line.")); + pages.add(new PageText("Hello, this is some text without a new line. It is long so it should probably be automaticall wrapped")); + pages.addAll(PageHelper.pagesForLongText("Hello, this is some text. It is very long so it should be split across multiple pages. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.")); + pages.addAll(PageHelper.pagesForLongText("Hello, this is some text. It is very long so it should be split across multiple pages. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.", Items.COAL_BLOCK)); + + pages.add(new PageJsonRecipe(new ResourceLocation("minecraft", "stone"))); + pages.add(new PageJsonRecipe(new ResourceLocation("minecraft", "charcoal"))); + + pages.add(new PageJsonRecipe(new ResourceLocation("minecraft", "stick"), recipe -> recipe instanceof ShapedRecipe ? new ShapedRecipesRenderer((ShapedRecipe) recipe) : null)); //Probably want to use your own method as render supplier and print proper logs + + pages.add(new PageIRecipe(new ShapedRecipe(new ResourceLocation("guideapi", "test11"), "test", 1, 1, NonNullList.from(Ingredient.EMPTY, Ingredient.fromStacks(new ItemStack(Items.PUMPKIN))), new ItemStack(Blocks.OAK_LOG)))); pages.add(new PageJsonRecipe(new ResourceLocation("minecraft", "acacia_fence"))); - Entry entry = new EntryItemStack(pages, "test.entry.name", new ItemStack(Items.POTATO)); - entries.put(new ResourceLocation("guideapi", "entry"), entry); + pages.add(new PageItemStack("These are all logs", Ingredient.fromTag(ItemTags.LOGS))); + pages.add(new PageTextImage("guideapi.test.string", new ResourceLocation("guideapi", "textures/gui/testimage.png"), true)); + pages.add(new PageTextImage("guideapi.test.string", new ResourceLocation("guideapi", "textures/gui/testimage.png"), false)); + pages.add(new PageImage(new ResourceLocation("guideapi", "textures/gui/testimage.png"))); - pages.add(PageIRecipe.newShapeless(new ItemStack(Blocks.IRON_BLOCK), "ingotIron", "ingotIron", "ingotIron", "ingotIron", "ingotIron", "ingotIron", "ingotIron", "ingotIron", "ingotIron")); - pages.add(PageIRecipe.newShapeless(new ItemStack(Blocks.PLANKS, 4), new ItemStack(Blocks.LOG))); - categories.add(new CategoryItemStack(entries, "test.category.name", new ItemStack(Items.BANNER))); - book.setCategoryList(categories); - book.setRegistryName(new ResourceLocation("guideapi", "test_book")); - return book; - } + Entry entry = new EntryItemStack(pages, "guideapi.test.entry", new ItemStack(Items.POTATO)); + entries.put(new ResourceLocation("guideapi", "entry"), entry); + categories.add(new CategoryItemStack(entries, "guideapi.test.category", new ItemStack(Items.ACACIA_DOOR))); + categories.add(new CategoryItemStack(entries, "guideapi.test.category", new ItemStack(Items.PUMPKIN))); + categories.add(new CategoryItemStack(entries, "guideapi.test.category", new ItemStack(Items.WOODEN_AXE))); + categories.add(new CategoryItemStack(entries, "guideapi.test.category", new ItemStack(Items.SPRUCE_WOOD))); + categories.add(new CategoryItemStack(entries, "guideapi.test.category", new ItemStack(Items.BONE_MEAL))); + categories.add(new CategoryItemStack(entries, "guideapi.test.category", new ItemStack(Items.WHEAT))); - @Override - public IRecipe getRecipe(@Nonnull ItemStack bookStack) { - return new ShapedOreRecipe(null, bookStack, " X ", "X X", " X ", 'X', "ingotIron").setRegistryName(book.getRegistryName()); } } diff --git a/src/main/java/amerifrance/guideapi/test/TestBook2.java b/src/main/java/amerifrance/guideapi/test/TestBook2.java index 1e9ffbce..217f96b2 100644 --- a/src/main/java/amerifrance/guideapi/test/TestBook2.java +++ b/src/main/java/amerifrance/guideapi/test/TestBook2.java @@ -3,23 +3,25 @@ import amerifrance.guideapi.api.GuideBook; import amerifrance.guideapi.api.IGuideBook; import amerifrance.guideapi.api.impl.Book; +import amerifrance.guideapi.api.impl.BookBinder; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; +import amerifrance.guideapi.api.util.PageHelper; import amerifrance.guideapi.category.CategoryItemStack; import amerifrance.guideapi.entry.EntryItemStack; -import amerifrance.guideapi.page.*; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.init.PotionTypes; +import amerifrance.guideapi.page.PageBrewingRecipe; +import amerifrance.guideapi.page.PageJsonRecipe; +import amerifrance.guideapi.page.PageText; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.brewing.BrewingRecipe; -import net.minecraftforge.oredict.ShapedOreRecipe; -import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.awt.Color; +import java.awt.*; +import java.util.List; @GuideBook public class TestBook2 implements IGuideBook { @@ -29,33 +31,26 @@ public class TestBook2 implements IGuideBook { @Nullable @Override public Book buildBook() { - book = new Book(); - book.setAuthor("TehNut"); - book.setColor(Color.GREEN); - book.setDisplayName("Display Name"); - book.setTitle("Title message"); - book.setWelcomeMessage("Is this still a thing?"); - - CategoryAbstract testCategory = new CategoryItemStack("test.category.name", new ItemStack(Items.BANNER)).withKeyBase("guideapi"); - testCategory.addEntry("entry", new EntryItemStack("test.entry.name", new ItemStack(Items.POTATO))); - testCategory.getEntry("entry").addPage(new PageText("Hello, this is\nsome text")); - testCategory.getEntry("entry").addPage(new PageFurnaceRecipe(Blocks.COBBLESTONE)); - testCategory.getEntry("entry").addPage(PageIRecipe.newShaped(new ItemStack(Items.ACACIA_BOAT), "X X", "XXX", 'X', new ItemStack(Blocks.PLANKS, 1, 4))); - testCategory.getEntry("entry").addPage(new PageBrewingRecipe(new BrewingRecipe( - PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.AWKWARD), - new ItemStack(Items.SPECKLED_MELON), - PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.HEALING))) - ); - testCategory.getEntry("entry").addPage(new PageJsonRecipe(new ResourceLocation("bread"))); - book.addCategory(testCategory); + BookBinder binder = new BookBinder(new ResourceLocation("guideapi", "test_book2")); + binder.setAuthor("TehNut").setColor(new Color(80, 50, 5)).setItemName("Display Name").setHeader("Hello there").setSpawnWithBook().setGuideTitle("Title message").setContentProvider(this::buildContent); - book.setRegistryName(new ResourceLocation("guideapi", "test_book2")); - return book; + + return (book = binder.build()); } - @Nullable - @Override - public IRecipe getRecipe(@Nonnull ItemStack bookStack) { - return new ShapedOreRecipe(null, bookStack, "X X", " X ", "X X", 'X', "ingotIron").setRegistryName(book.getRegistryName()); + private void buildContent(List categories) { + CategoryAbstract testCategory = new CategoryItemStack("guideapi.test.category", new ItemStack(Items.BLUE_BANNER)).withKeyBase("guideapi"); + testCategory.addEntry("entry", new EntryItemStack("guideapi.test.entry", new ItemStack(Items.POTATO))); + testCategory.getEntry("entry").addPage(new PageText("Hello, this is\nsome text")); + //testCategory.getEntry("entry").addPage(new PageFurnaceRecipe(Blocks.COBBLESTONE)); + //testCategory.getEntry("entry").addPage(PageIRecipe.newShaped(new ItemStack(Items.ACACIA_BOAT), "X X", "XXX", 'X', new ItemStack(Blocks.ACACIA_PLANKS, 1, 4))); + testCategory.getEntry("entry").addPage(new PageBrewingRecipe(new BrewingRecipe(Ingredient.fromStacks(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.AWKWARD)), Ingredient.fromStacks(new ItemStack(Items.GLISTERING_MELON_SLICE)), PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.HEALING))) + ); + testCategory.getEntry("entry").addPage(new PageJsonRecipe(new ResourceLocation("bread"))); + testCategory.getEntry("entry").addPage(new PageJsonRecipe(new ResourceLocation("redstone"))); + testCategory.getEntry("entry").addPageList(PageHelper.pagesForLongText("guideapi.test.format")); + testCategory.addEntry("unicode", new EntryItemStack("Творческая книга", new ItemStack(Items.BEEF))); + testCategory.getEntry("unicode").addPage(new PageText("Творческая книга \u0F06")); + categories.add(testCategory); } } diff --git a/src/main/java/amerifrance/guideapi/test/TestBook3.java b/src/main/java/amerifrance/guideapi/test/TestBook3.java deleted file mode 100644 index 1f460fa3..00000000 --- a/src/main/java/amerifrance/guideapi/test/TestBook3.java +++ /dev/null @@ -1,68 +0,0 @@ -package amerifrance.guideapi.test; - -import amerifrance.guideapi.GuideMod; -import amerifrance.guideapi.api.BookEvent; -import amerifrance.guideapi.api.GuideBook; -import amerifrance.guideapi.api.IGuideBook; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.BookBinder; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.category.CategoryItemStack; -import amerifrance.guideapi.entry.EntryItemStack; -import amerifrance.guideapi.page.*; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.init.PotionTypes; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionUtils; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentString; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.brewing.BrewingRecipe; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import javax.annotation.Nullable; - -@GuideBook -public class TestBook3 implements IGuideBook { - - public static Book book; - - @Nullable - @Override - public Book buildBook() { - MinecraftForge.EVENT_BUS.register(this); - - BookBinder binder = new BookBinder(new ResourceLocation(GuideMod.ID, "test_book3")) - .setAuthor("TunHet") - .setColor(0x7EF67F) - .setCreativeTab(CreativeTabs.COMBAT) - .setGuideTitle("some.guide.title") - .setHeader("some.header.text") - .setSpawnWithBook(); - - CategoryAbstract testCategory = new CategoryItemStack("test.category.name", new ItemStack(Items.BANNER)).withKeyBase("guideapi"); - testCategory.addEntry("entry", new EntryItemStack("test.entry.name", new ItemStack(Items.POTATO))); - testCategory.getEntry("entry").addPage(new PageText("Hello, this is\nsome text")); - testCategory.getEntry("entry").addPage(new PageFurnaceRecipe(Blocks.COBBLESTONE)); - testCategory.getEntry("entry").addPage(PageIRecipe.newShaped(new ItemStack(Items.ACACIA_BOAT), "X X", "XXX", 'X', new ItemStack(Blocks.PLANKS, 1, 4))); - testCategory.getEntry("entry").addPage(new PageBrewingRecipe(new BrewingRecipe( - PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.AWKWARD), - new ItemStack(Items.SPECKLED_MELON), - PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.HEALING))) - ); - testCategory.getEntry("entry").addPage(new PageJsonRecipe(new ResourceLocation("bread"))); - binder.addCategory(testCategory); - - return book = binder.build(); - } - - @SubscribeEvent - public void onBookOpen(BookEvent.Open event) { - if (event.getBook() == book && event.getPlayer().isSneaking()) { - event.setCanceledText(new TextComponentString("No snek allowed")); - event.setCanceled(true); - } - } -} diff --git a/src/main/java/amerifrance/guideapi/util/APISetter.java b/src/main/java/amerifrance/guideapi/util/APISetter.java index 86b53c95..39308ca7 100644 --- a/src/main/java/amerifrance/guideapi/util/APISetter.java +++ b/src/main/java/amerifrance/guideapi/util/APISetter.java @@ -6,8 +6,7 @@ import com.google.common.base.Throwables; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.ModLoadingContext; import java.lang.reflect.Field; import java.util.List; @@ -73,8 +72,8 @@ public static void setIndexedBooks(List books) { } private static void sanityCheck() throws IllegalAccessException { - ModContainer activeMod = Loader.instance().activeModContainer(); - if (!activeMod.getModId().equals(GuideMod.ID)) - throw new IllegalAccessException("Mod " + activeMod.getModId() + " tried to access an internal-only method in GuideAPI. Please report this."); + String activeMod = ModLoadingContext.get().getActiveNamespace(); + if (!GuideMod.ID.equals(activeMod)) + throw new IllegalAccessException("Mod " + activeMod + " tried to access an internal-only method in GuideAPI. Please report this."); } } diff --git a/src/main/java/amerifrance/guideapi/util/AnnotationHandler.java b/src/main/java/amerifrance/guideapi/util/AnnotationHandler.java index 93b12dfd..e118c81c 100644 --- a/src/main/java/amerifrance/guideapi/util/AnnotationHandler.java +++ b/src/main/java/amerifrance/guideapi/util/AnnotationHandler.java @@ -5,41 +5,55 @@ import amerifrance.guideapi.api.IGuideBook; import amerifrance.guideapi.api.impl.Book; import com.google.common.collect.Lists; -import net.minecraftforge.fml.common.discovery.ASMDataTable; -import net.minecraftforge.fml.common.discovery.asm.ModAnnotation; -import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.forgespi.language.ModFileScanData; import org.apache.commons.lang3.tuple.Pair; +import org.objectweb.asm.Type; +import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; public class AnnotationHandler { public static final List> BOOK_CLASSES = Lists.newArrayList(); - public static void gatherBooks(ASMDataTable dataTable) { + private static final Type GUIDE = Type.getType(GuideBook.class); + + + public static void gatherBooks() { + final List annotations = ModList.get().getAllScanData().stream() + .map(ModFileScanData::getAnnotations) + .flatMap(Collection::stream) + .filter(a -> GUIDE.equals(a.getAnnotationType())) + .collect(Collectors.toList()); + + for (EventPriority priority : EventPriority.values()) - for (ASMDataTable.ASMData data : dataTable.getAll(GuideBook.class.getCanonicalName())) { + for (ModFileScanData.AnnotationData data : annotations) { try { - Class genericClass = Class.forName(data.getClassName()); + + EventPriority priority1 = (EventPriority) data.getAnnotationData().getOrDefault("priority", EventPriority.NORMAL); + if (priority != priority1) continue; + Class genericClass = Class.forName(data.getClassType().getClassName()); if (!IGuideBook.class.isAssignableFrom(genericClass)) continue; - IGuideBook guideBook = (IGuideBook) genericClass.newInstance(); - ModAnnotation.EnumHolder holder = (ModAnnotation.EnumHolder) data.getAnnotationInfo().get("priority"); - EventPriority bookPriority = holder == null ? EventPriority.NORMAL : EventPriority.valueOf(holder.getValue()); - if (priority != bookPriority) - continue; Book book = guideBook.buildBook(); if (book == null) continue; APISetter.registerBook(book); BOOK_CLASSES.add(Pair.of(book, guideBook)); + } catch (Exception e) { - LogHelper.error("Error registering book for class " + data.getClassName()); + LogHelper.error("Error registering book for class " + data.getClassType().getClassName()); e.printStackTrace(); } + } + APISetter.setIndexedBooks(Lists.newArrayList(GuideAPI.getBooks().values())); } } diff --git a/src/main/java/amerifrance/guideapi/util/EventHandler.java b/src/main/java/amerifrance/guideapi/util/EventHandler.java index a7e3194e..9ba3e27a 100644 --- a/src/main/java/amerifrance/guideapi/util/EventHandler.java +++ b/src/main/java/amerifrance/guideapi/util/EventHandler.java @@ -1,6 +1,6 @@ package amerifrance.guideapi.util; -import amerifrance.guideapi.ConfigHandler; +import amerifrance.guideapi.GuideConfig; import amerifrance.guideapi.GuideMod; import amerifrance.guideapi.api.GuideAPI; import amerifrance.guideapi.api.IGuideItem; @@ -12,24 +12,26 @@ import com.google.common.base.Strings; import com.google.common.collect.Multimap; import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.EnumHand; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.Hand; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.event.entity.EntityJoinWorldEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.ItemHandlerHelper; import java.util.Collection; @@ -39,35 +41,36 @@ public class EventHandler { @SubscribeEvent public static void onPlayerJoinWorld(EntityJoinWorldEvent event) { - if (!event.getEntity().world.isRemote && event.getEntity() instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer) event.getEntity(); - NBTTagCompound tag = getModTag(player, GuideMod.ID); - if (ConfigHandler.canSpawnWithBooks) { + if (!event.getEntity().world.isRemote && event.getEntity() instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) event.getEntity(); + CompoundNBT tag = getModTag(player, GuideMod.ID); + if (GuideConfig.COMMON.canSpawnWithBook.get()) { for (Book book : GuideAPI.getBooks().values()) { - if (ConfigHandler.SPAWN_BOOKS.getOrDefault(book, false) && !tag.getBoolean("hasInitial" + book.getTitle())) { + ForgeConfigSpec.BooleanValue bookSpawnConfig = GuideConfig.COMMON.SPAWN_BOOKS.get(book); + if ((bookSpawnConfig == null || bookSpawnConfig.get()) && !tag.getBoolean("hasInitial" + book.getRegistryName().toString())) { ItemHandlerHelper.giveItemToPlayer(player, GuideAPI.getStackFromBook(book)); - tag.setBoolean("hasInitial" + book.getTitle(), true); + tag.putBoolean("hasInitial" + book.getRegistryName().toString(), true); } } } } } - @SideOnly(Side.CLIENT) + @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void renderOverlay(RenderGameOverlayEvent.Pre event) { if (event.getType() != RenderGameOverlayEvent.ElementType.CROSSHAIRS) return; - RayTraceResult rayTrace = Minecraft.getMinecraft().objectMouseOver; - if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) + RayTraceResult rayTrace = Minecraft.getInstance().objectMouseOver; + if (rayTrace == null || rayTrace.getType() != RayTraceResult.Type.BLOCK) return; - EntityPlayer player = Minecraft.getMinecraft().player; - World world = Minecraft.getMinecraft().world; + PlayerEntity player = Minecraft.getInstance().player; + World world = Minecraft.getInstance().world; ItemStack held = ItemStack.EMPTY; Book book = null; - for (EnumHand hand : EnumHand.values()) { + for (Hand hand : Hand.values()) { ItemStack heldStack = player.getHeldItem(hand); if (heldStack.getItem() instanceof IGuideItem) { held = heldStack; @@ -78,12 +81,12 @@ public static void renderOverlay(RenderGameOverlayEvent.Pre event) { if (book == null) return; - - IBlockState state = world.getBlockState(rayTrace.getBlockPos()); + BlockPos rayTracePos = ((BlockRayTraceResult) rayTrace).getPos(); + BlockState state = world.getBlockState(rayTracePos); String linkedEntry = null; if (state.getBlock() instanceof IGuideLinked) { IGuideLinked linked = (IGuideLinked) state.getBlock(); - ResourceLocation entryKey = linked.getLinkedEntry(world, rayTrace.getBlockPos(), player, held); + ResourceLocation entryKey = linked.getLinkedEntry(world, rayTracePos, player, held); if (entryKey != null) { for (CategoryAbstract category : book.getCategoryList()) { if (category.entries.containsKey(entryKey)) { @@ -95,23 +98,23 @@ public static void renderOverlay(RenderGameOverlayEvent.Pre event) { } if (!Strings.isNullOrEmpty(linkedEntry)) { - FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; - ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); - int drawX = scaledResolution.getScaledWidth() / 2 + 10; - int drawY = scaledResolution.getScaledHeight() / 2 - 8; + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; + + int drawX = Minecraft.getInstance().mainWindow.getScaledWidth() / 2 + 10; + int drawY = Minecraft.getInstance().mainWindow.getScaledHeight() / 2 - 8; - Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(held, drawX, drawY); + Minecraft.getInstance().getItemRenderer().renderItemIntoGUI(held, drawX, drawY); drawY -= 2; drawX += 20; fontRenderer.drawStringWithShadow(TextFormatting.WHITE + linkedEntry, drawX, drawY, 0); - fontRenderer.drawStringWithShadow(TextFormatting.WHITE.toString() + TextFormatting.ITALIC.toString() + TextHelper.localize("text.linked.open"), drawX, drawY + 12, 0); + fontRenderer.drawStringWithShadow(TextFormatting.WHITE.toString() + TextFormatting.ITALIC.toString() + TextHelper.localize("guideapi.text.linked.open"), drawX, drawY + 12, 0); } if (state.getBlock() instanceof IInfoRenderer.Block) { - IInfoRenderer infoRenderer = ((IInfoRenderer.Block) state.getBlock()).getInfoRenderer(book, world, rayTrace.getBlockPos(), state, rayTrace, player); + IInfoRenderer infoRenderer = ((IInfoRenderer.Block) state.getBlock()).getInfoRenderer(book, world, rayTracePos, state, rayTrace, player); if (book == ((IInfoRenderer.Block) state.getBlock()).getBook() && infoRenderer != null) - infoRenderer.drawInformation(book, world, rayTrace.getBlockPos(), state, rayTrace, player); + infoRenderer.drawInformation(book, world, rayTracePos, state, rayTrace, player); } Multimap, IInfoRenderer> bookRenderers = GuideAPI.getInfoRenderers().get(book); @@ -120,26 +123,26 @@ public static void renderOverlay(RenderGameOverlayEvent.Pre event) { Collection renderers = bookRenderers.get(state.getBlock().getClass()); for (IInfoRenderer renderer : renderers) - renderer.drawInformation(book, world, rayTrace.getBlockPos(), state, rayTrace, player); + renderer.drawInformation(book, world, rayTracePos, state, rayTrace, player); } - public static NBTTagCompound getModTag(EntityPlayer player, String modName) { - NBTTagCompound tag = player.getEntityData(); - NBTTagCompound persistTag; + public static CompoundNBT getModTag(PlayerEntity player, String modName) { + CompoundNBT tag = player.getPersistentData(); + CompoundNBT persistTag; - if (tag.hasKey(EntityPlayer.PERSISTED_NBT_TAG)) - persistTag = tag.getCompoundTag(EntityPlayer.PERSISTED_NBT_TAG); + if (tag.contains(PlayerEntity.PERSISTED_NBT_TAG)) + persistTag = tag.getCompound(PlayerEntity.PERSISTED_NBT_TAG); else { - persistTag = new NBTTagCompound(); - tag.setTag(EntityPlayer.PERSISTED_NBT_TAG, persistTag); + persistTag = new CompoundNBT(); + tag.put(PlayerEntity.PERSISTED_NBT_TAG, persistTag); } - NBTTagCompound modTag; - if (persistTag.hasKey(modName)) { - modTag = persistTag.getCompoundTag(modName); + CompoundNBT modTag; + if (persistTag.contains(modName)) { + modTag = persistTag.getCompound(modName); } else { - modTag = new NBTTagCompound(); - persistTag.setTag(modName, modTag); + modTag = new CompoundNBT(); + persistTag.put(modName, modTag); } return modTag; } diff --git a/src/main/java/amerifrance/guideapi/util/LogHelper.java b/src/main/java/amerifrance/guideapi/util/LogHelper.java index d9704721..edd830a8 100644 --- a/src/main/java/amerifrance/guideapi/util/LogHelper.java +++ b/src/main/java/amerifrance/guideapi/util/LogHelper.java @@ -1,6 +1,6 @@ package amerifrance.guideapi.util; -import amerifrance.guideapi.ConfigHandler; +import amerifrance.guideapi.GuideConfig; import amerifrance.guideapi.GuideMod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -14,7 +14,7 @@ public class LogHelper { */ public static void info(Object info) { - if (ConfigHandler.enableLogging) + if (GuideConfig.COMMON.enableLogging.get()) logger.info(info); } @@ -23,7 +23,7 @@ public static void info(Object info) { */ public static void error(Object error) { - if (ConfigHandler.enableLogging) + if (GuideConfig.COMMON.enableLogging.get()) logger.error(error); } @@ -32,7 +32,7 @@ public static void error(Object error) { */ public static void debug(Object debug) { - if (ConfigHandler.enableLogging) + if (GuideConfig.COMMON.enableLogging.get()) logger.debug(debug); } } diff --git a/src/main/java/amerifrance/guideapi/util/ReloadCommand.java b/src/main/java/amerifrance/guideapi/util/ReloadCommand.java new file mode 100644 index 00000000..65091291 --- /dev/null +++ b/src/main/java/amerifrance/guideapi/util/ReloadCommand.java @@ -0,0 +1,42 @@ +package amerifrance.guideapi.util; + +import amerifrance.guideapi.api.GuideAPI; +import amerifrance.guideapi.api.impl.Book; +import com.mojang.brigadier.LiteralMessage; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.ResourceLocationArgument; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.loading.FMLEnvironment; + +/** + * Command to be able to reload the book content ingame for debugging purposes. + * Only registered in dev environment and only works in single player + */ +public class ReloadCommand { + + private static final DynamicCommandExceptionType BOOK_NOT_FOUND = new DynamicCommandExceptionType((id) -> new StringTextComponent("Book with registry id " + id + " not found")); + private static final SimpleCommandExceptionType NOT_CLIENT = new SimpleCommandExceptionType(new LiteralMessage("This command can only be used in singleplayer")); + + public static ArgumentBuilder register() { + return Commands.literal("reload") + .then(Commands.argument("bookid", ResourceLocationArgument.resourceLocation()).executes((context) -> { + if (FMLEnvironment.dist != Dist.CLIENT) { + throw NOT_CLIENT.create(); + } + ResourceLocation id = ResourceLocationArgument.getResourceLocation(context, "bookid"); + Book b = GuideAPI.getBooks().get(id); + if (b == null) { + throw BOOK_NOT_FOUND.create(id.toString()); + } + b.forceInitializeContent(); + return 0; + })); + + } +} diff --git a/src/main/java/amerifrance/guideapi/wrapper/AbstractWrapper.java b/src/main/java/amerifrance/guideapi/wrapper/AbstractWrapper.java index c7f16578..3f81ceb1 100644 --- a/src/main/java/amerifrance/guideapi/wrapper/AbstractWrapper.java +++ b/src/main/java/amerifrance/guideapi/wrapper/AbstractWrapper.java @@ -1,6 +1,6 @@ package amerifrance.guideapi.wrapper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; public abstract class AbstractWrapper { @@ -8,9 +8,9 @@ public abstract class AbstractWrapper { public abstract boolean canPlayerSee(); - public abstract void draw(int mouseX, int mouseY, GuiBase gui); + public abstract void draw(int mouseX, int mouseY, BaseScreen gui); - public abstract void drawExtras(int mouseX, int mouseY, GuiBase gui); + public abstract void drawExtras(int mouseX, int mouseY, BaseScreen gui); - public abstract boolean isMouseOnWrapper(int mouseX, int mouseY); + public abstract boolean isMouseOnWrapper(double mouseX, double mouseY); } diff --git a/src/main/java/amerifrance/guideapi/wrapper/CategoryWrapper.java b/src/main/java/amerifrance/guideapi/wrapper/CategoryWrapper.java index 745c3746..ea2d6c69 100644 --- a/src/main/java/amerifrance/guideapi/wrapper/CategoryWrapper.java +++ b/src/main/java/amerifrance/guideapi/wrapper/CategoryWrapper.java @@ -3,10 +3,10 @@ import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; +import amerifrance.guideapi.gui.BaseScreen; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.RenderItem; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; public class CategoryWrapper extends AbstractWrapper { @@ -14,13 +14,13 @@ public class CategoryWrapper extends AbstractWrapper { public Book book; public CategoryAbstract category; public int x, y, width, height; - public EntityPlayer player; + public PlayerEntity player; public FontRenderer renderer; - public RenderItem renderItem; + public ItemRenderer renderItem; public boolean drawOnLeft; public ItemStack bookStack; - public CategoryWrapper(Book book, CategoryAbstract category, int x, int y, int width, int height, EntityPlayer player, FontRenderer renderer, RenderItem renderItem, boolean drawOnLeft, ItemStack bookStack) { + public CategoryWrapper(Book book, CategoryAbstract category, int x, int y, int width, int height, PlayerEntity player, FontRenderer renderer, ItemRenderer renderItem, boolean drawOnLeft, ItemStack bookStack) { this.book = book; this.category = category; this.x = x; @@ -44,17 +44,17 @@ public boolean canPlayerSee() { } @Override - public void draw(int mouseX, int mouseY, GuiBase gui) { + public void draw(int mouseX, int mouseY, BaseScreen gui) { category.draw(book, x, y, width, height, mouseX, mouseY, gui, drawOnLeft, renderItem); } @Override - public void drawExtras(int mouseX, int mouseY, GuiBase gui) { + public void drawExtras(int mouseX, int mouseY, BaseScreen gui) { category.drawExtras(book, x, y, width, height, mouseX, mouseY, gui, drawOnLeft, renderItem); } @Override - public boolean isMouseOnWrapper(int mouseX, int mouseY) { + public boolean isMouseOnWrapper(double mouseX, double mouseY) { return GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height); } } diff --git a/src/main/java/amerifrance/guideapi/wrapper/EntryWrapper.java b/src/main/java/amerifrance/guideapi/wrapper/EntryWrapper.java index 33cbe96f..72564031 100644 --- a/src/main/java/amerifrance/guideapi/wrapper/EntryWrapper.java +++ b/src/main/java/amerifrance/guideapi/wrapper/EntryWrapper.java @@ -4,11 +4,11 @@ import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiCategory; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.CategoryScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; public class EntryWrapper extends AbstractWrapper { @@ -17,12 +17,12 @@ public class EntryWrapper extends AbstractWrapper { public CategoryAbstract category; public EntryAbstract entry; public int x, y, width, height; - public EntityPlayer player; + public PlayerEntity player; public FontRenderer renderer; - public GuiCategory categoryGui; + public CategoryScreen categoryGui; public ItemStack bookStack; - public EntryWrapper(GuiCategory categoryGui, Book book, CategoryAbstract category, EntryAbstract entry, int x, int y, int width, int height, EntityPlayer player, FontRenderer renderer, ItemStack bookStack) { + public EntryWrapper(CategoryScreen categoryGui, Book book, CategoryAbstract category, EntryAbstract entry, int x, int y, int width, int height, PlayerEntity player, FontRenderer renderer, ItemStack bookStack) { this.book = book; this.category = category; this.entry = entry; @@ -46,17 +46,17 @@ public boolean canPlayerSee() { } @Override - public void draw(int mouseX, int mouseY, GuiBase gui) { - entry.draw(book, category, x, y, width, height, mouseX, mouseY, gui, Minecraft.getMinecraft().fontRenderer); + public void draw(int mouseX, int mouseY, BaseScreen gui) { + entry.draw(book, category, x, y, width, height, mouseX, mouseY, gui, Minecraft.getInstance().fontRenderer); } @Override - public void drawExtras(int mouseX, int mouseY, GuiBase gui) { - entry.drawExtras(book, category, x, y, width, height, mouseX, mouseY, gui, Minecraft.getMinecraft().fontRenderer); + public void drawExtras(int mouseX, int mouseY, BaseScreen gui) { + entry.drawExtras(book, category, x, y, width, height, mouseX, mouseY, gui, Minecraft.getInstance().fontRenderer); } @Override - public boolean isMouseOnWrapper(int mouseX, int mouseY) { + public boolean isMouseOnWrapper(double mouseX, double mouseY) { return GuiHelper.isMouseBetween(mouseX, mouseY, x, y, width, height); } } diff --git a/src/main/java/amerifrance/guideapi/wrapper/PageWrapper.java b/src/main/java/amerifrance/guideapi/wrapper/PageWrapper.java index 3aaef696..24691fff 100644 --- a/src/main/java/amerifrance/guideapi/wrapper/PageWrapper.java +++ b/src/main/java/amerifrance/guideapi/wrapper/PageWrapper.java @@ -4,26 +4,26 @@ import amerifrance.guideapi.api.impl.Book; import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.gui.GuiBase; -import amerifrance.guideapi.gui.GuiEntry; +import amerifrance.guideapi.gui.BaseScreen; +import amerifrance.guideapi.gui.EntryScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; public class PageWrapper extends AbstractWrapper { - public GuiEntry guiEntry; + public EntryScreen guiEntry; public Book book; public CategoryAbstract category; public EntryAbstract entry; public IPage page; public int guiLeft, guiTop; - public EntityPlayer player; + public PlayerEntity player; public FontRenderer renderer; public ItemStack bookStack; - public PageWrapper(GuiEntry guiEntry, Book book, CategoryAbstract category, EntryAbstract entry, IPage page, int guiLeft, int guiTop, EntityPlayer player, FontRenderer renderer, ItemStack bookStack) { + public PageWrapper(EntryScreen guiEntry, Book book, CategoryAbstract category, EntryAbstract entry, IPage page, int guiLeft, int guiTop, PlayerEntity player, FontRenderer renderer, ItemStack bookStack) { this.guiEntry = guiEntry; this.book = book; this.category = category; @@ -46,17 +46,17 @@ public boolean canPlayerSee() { } @Override - public void draw(int mouseX, int mouseY, GuiBase gui) { - page.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, gui, Minecraft.getMinecraft().fontRenderer); + public void draw(int mouseX, int mouseY, BaseScreen gui) { + page.draw(book, category, entry, guiLeft, guiTop, mouseX, mouseY, gui, Minecraft.getInstance().fontRenderer); } @Override - public void drawExtras(int mouseX, int mouseY, GuiBase gui) { - page.drawExtras(book, category, entry, guiLeft, guiTop, mouseX, mouseY, gui, Minecraft.getMinecraft().fontRenderer); + public void drawExtras(int mouseX, int mouseY, BaseScreen gui) { + page.drawExtras(book, category, entry, guiLeft, guiTop, mouseX, mouseY, gui, Minecraft.getInstance().fontRenderer); } @Override - public boolean isMouseOnWrapper(int mouseX, int mouseY) { + public boolean isMouseOnWrapper(double mouseX, double mouseY) { return true; } } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..4ff03cbd --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,19 @@ +modLoader="javafml" +loaderVersion="[27,)" +issueTrackerURL="https://github.com/TeamAmeriFrance/Guide-API/issues" + +[[mods]] + modId="guideapi" + namespace="guideapi" + version="${version}" + displayName="Guide-API" + authors="Tombenpotter, TehNut, Maxanier" + credits="" + description="Simple mod guide creation" + updateJSONURL="https://maxanier.de/projects/vampirism/versions.json" + [[dependencies.guideeapi]] + modId="forge" + mandatory=true + versionRange="[${forge_version},)" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/assets/guideapi/lang/de_de.json b/src/main/resources/assets/guideapi/lang/de_de.json new file mode 100644 index 00000000..cc29684b --- /dev/null +++ b/src/main/resources/assets/guideapi/lang/de_de.json @@ -0,0 +1,16 @@ +{ + "_comment": "Item", + "item.guideapi.book": "Handbuch", + "_comment": "Button hovering text", + "guideapi.button.back": "Zurück", + "guideapi.button.next": "Nächste", + "guideapi.button.prev": "Vorherige", + "guideapi.button.search": "Suche", + "_comment": "Text to draw", + "guideapi.text.crafting.shaped": "Crafting", + "guideapi.text.crafting.shapeless": "Formloses Crafting", + "guideapi.text.furnace.smelting": "Schmelzen", + "guideapi.text.linked.open": "Schleiche + Nutze zum Öffnen", + "guideapi.text.brewing.brew": "Brauen", + "guidepai.text.brewing.error": "&cFehler in diesem Rezept" +} \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/lang/en_US.lang b/src/main/resources/assets/guideapi/lang/en_US.lang deleted file mode 100644 index d940dcd4..00000000 --- a/src/main/resources/assets/guideapi/lang/en_US.lang +++ /dev/null @@ -1,32 +0,0 @@ -#Creative Tab -itemGroup.guideapi.creativeTab=Guide-API - -#Item -item.guideapi.book.name=Guide Book - -#Button hovering text -button.back.name=Back -button.next.name=Next -button.prev.name=Previous -button.search.name=Search - -#Text to draw -text.shaped.crafting=Shaped Crafting -text.shapeless.crafting=Shapeless Crafting -text.furnace.smelting=Smelting -text.furnace.error=&cError in the recipe -text.book.warning=&c[WARNING] Delete this item, it has no associated book! -text.book.creative=Creative Book -text.book=Book: %s -text.category=Category: %s -text.entry=Entry: %s -text.page=Page: %s -text.brewing.brew=Brewing -text.brewing.error=&cError in the recipe -text.linked.open=Sneak + Use to open -text.open.failed=Something stopped you from opening this book - -#Test -test.guide.format=This i\ns a formatting\n\ttest -test.category.name=Test Category -test.entry.name=Test Entry \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/lang/en_us.json b/src/main/resources/assets/guideapi/lang/en_us.json new file mode 100644 index 00000000..344ace5d --- /dev/null +++ b/src/main/resources/assets/guideapi/lang/en_us.json @@ -0,0 +1,30 @@ +{ + "_comment": "Item", + "item.guideapi.book": "Guide Book", + "_comment": "Button hovering text", + "guideapi.button.back": "Back", + "guideapi.button.next": "Next", + "guideapi.button.prev": "Previous", + "guideapi.button.search": "Search", + "_comment": "Text to draw", + "guideapi.text.crafting.shaped": "Shaped Crafting", + "guideapi.text.crafting.shapeless": "Shapeless Crafting", + "guideapi.text.furnace.smelting": "Smelting", + "guideapi.text.linked.open": "Sneak + Use to open", + "guideapi.text.brewing.brew": "Brewing", + "guidepai.text.brewing.error": "&cError in the recipe", + "_comment": "Test", + "guideapi.test.format": "This i\\ns a formatting\\n\\ttest", + "guideapi.test.category": "Test Category", + "guideapi.test.entry": "Test Entry which is very very very long", + "guideapi.test.string": "Some translated content string", + "_comment": "Unused", + "text.furnace.error": "&cError in the recipe", + "text.book.warning": "&c[WARNING] Delete this item, it has no associated book!", + "text.book.creative": "Creative Book", + "text.book": "Book: %s", + "text.category": "Category: %s", + "text.entry": "Entry: %s", + "text.page": "Page: %s", + "text.open.failed": "Something stopped you from opening this book" +} \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/lang/ru_RU.lang b/src/main/resources/assets/guideapi/lang/ru_RU.lang deleted file mode 100644 index c433f3f6..00000000 --- a/src/main/resources/assets/guideapi/lang/ru_RU.lang +++ /dev/null @@ -1,22 +0,0 @@ -#Creative Tab -itemGroup.guideapi.creativeTab=Guide-API - -#Item -item.GuideBook.name=Стандартная книга Guide-API - -#Button hovering text -button.back.name=Назад -button.next.name=След. -button.prev.name=Пред. - -#Text to draw -text.shaped.crafting=Форменное создание -text.shapeless.crafting=Бесформенное создание -text.furnace.smelting=Плавка -text.furnace.error=&cОшибка в рецепте -text.book.warning=&c[ВНИМАНИЕ] Выкиньте этот предмет, у него нет связанной книги! -text.book.creative=Творческая книга -text.book=Книга: %s -text.category=Категория: %s -text.entry=Запись: %s -text.page=Страница: %s diff --git a/src/main/resources/assets/guideapi/lang/ru_ru.json b/src/main/resources/assets/guideapi/lang/ru_ru.json new file mode 100644 index 00000000..d4507047 --- /dev/null +++ b/src/main/resources/assets/guideapi/lang/ru_ru.json @@ -0,0 +1,23 @@ +{ + "_comment": "Item", + "item.guideapi.book": "Стандартная книга Guide-API", + "_comment": "Button hovering text", + "guideapi.button.back": "Назад", + "guideapi.button.next": "След.", + "guideapi.button.prev": "Пред.", + "guideapi.button.search":"Поиск", + "_comment": "Text to draw", + "guideapi.text.crafting.shaped": "Форменное создание", + "guideapi.text.crafting.shapeless": "Бесформенное создание", + "guideapi.text.furnace.smelting": "Плавка", + "guideapi.text.linked.open": "Шифт + ПКМ, чтобы открыть", + "guideapi.text.brewing.brew": "зельеварение", + "guidepai.text.brewing.error": "&cОшибка в рецепте", + "text.furnace.error": "&cОшибка в рецепте", + "text.book.warning": "&c[ВНИМАНИЕ] Выкиньте этот предмет, у него нет связанной книги!", + "text.book.creative": "Творческая книга", + "text.book": "Книга: %s", + "text.category": "Категория: %s", + "text.entry": "Запись: %s", + "text.page": "Страница: %s" +} \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/lang/zh_CN.lang b/src/main/resources/assets/guideapi/lang/zh_CN.lang deleted file mode 100644 index ee344656..00000000 --- a/src/main/resources/assets/guideapi/lang/zh_CN.lang +++ /dev/null @@ -1,22 +0,0 @@ -#Creative Tab -itemGroup.guideapi.creativeTab=Guide-API - -#Item -item.guideapi.book.name=Guide-API 默认书 - -#Button hovering text -button.back.name=返回 -button.next.name=下一页 -button.prev.name=上一页 - -#Text to draw -text.shaped.crafting=普通配方 -text.shapeless.crafting=无形配方 -text.furnace.smelting=冶炼 -text.furnace.error=&c合成配方出错 -text.book.warning=&c[警告] 删除这个物品, 它没有关联的书! -text.book.creative=创造模式书本 -text.book=书: %s -text.category=类别: %s -text.entry=条目: %s -text.page=页码: %s diff --git a/src/main/resources/assets/guideapi/lang/zh_cn.json b/src/main/resources/assets/guideapi/lang/zh_cn.json new file mode 100644 index 00000000..d066dd99 --- /dev/null +++ b/src/main/resources/assets/guideapi/lang/zh_cn.json @@ -0,0 +1,19 @@ +{ + "_comment": "Item", + "item.guideapi.book": "Guide-API 默认书", + "_comment": "Button hovering text", + "guideapi.button.back": "返回", + "guideapi.button.next": "下一页", + "guideapi.button.prev": "上一页", + "_comment": "Text to draw", + "guideapi.text.crafting.shaped": "有序合成", + "guideapi.text.crafting.shapeless": "无形配方", + "guideapi.text.furnace.smelting": "烧炼", + "text.furnace.error": "&c合成配方出错", + "text.book.warning": "&c[警告] 删除这个物品, 它没有关联的书!", + "text.book.creative": "创造模式书本", + "text.book": "书: %s", + "text.category": "类别: %s", + "text.entry": "条目: %s", + "text.page": "页码: %s" +} \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/models/item/guidebook.json b/src/main/resources/assets/guideapi/models/item/guidebook.json new file mode 100644 index 00000000..c1ece281 --- /dev/null +++ b/src/main/resources/assets/guideapi/models/item/guidebook.json @@ -0,0 +1,26 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "guideapi:items/book_base", + "layer1": "guideapi:items/book_page" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ + 0, + 90, + -25 + ], + "translation": [ + 1.13, + 3.2, + 1.13 + ], + "scale": [ + 0.68, + 0.68, + 0.68 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/models/item/itemguidebook.json b/src/main/resources/assets/guideapi/models/item/itemguidebook.json deleted file mode 100644 index 0cd9effb..00000000 --- a/src/main/resources/assets/guideapi/models/item/itemguidebook.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "parent":"item/generated", - "textures": { - "layer0": "guideapi:items/book_base", - "layer1": "guideapi:items/book_page" - }, - "display": { - "firstperson_lefthand": { - "rotation": [ 0, 90, -25 ], - "translation": [ 1.13, 3.2, 1.13 ], - "scale": [ 0.68, 0.68, 0.68 ] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/guideapi/textures/gui/book_colored.png b/src/main/resources/assets/guideapi/textures/gui/book_colored.png index 5aeee55c..e37b9ccf 100644 Binary files a/src/main/resources/assets/guideapi/textures/gui/book_colored.png and b/src/main/resources/assets/guideapi/textures/gui/book_colored.png differ diff --git a/src/main/resources/assets/guideapi/textures/gui/book_greyscale.png b/src/main/resources/assets/guideapi/textures/gui/book_greyscale.png index 768e6b31..50ab5cad 100644 Binary files a/src/main/resources/assets/guideapi/textures/gui/book_greyscale.png and b/src/main/resources/assets/guideapi/textures/gui/book_greyscale.png differ diff --git a/src/main/resources/assets/guideapi/textures/items/book_base.png b/src/main/resources/assets/guideapi/textures/items/book_base.png index d66560bc..2e6710aa 100644 Binary files a/src/main/resources/assets/guideapi/textures/items/book_base.png and b/src/main/resources/assets/guideapi/textures/items/book_base.png differ diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index 56a344a7..00000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,16 +0,0 @@ -[ -{ - "modid": "guideapi", - "name": "Guide-API", - "description": "Simple mod guide creation.", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "", - "updateUrl": "http://tehnut.info/jenkins/", - "authorList": [ "Tombenpotter", "TehNut" ], - "credits": "", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} -] diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..6df7ca86 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Guide-API Resources", + "pack_format": 4 + } +} \ No newline at end of file