feat: implement patchouli guide book

This commit is contained in:
LordMZTE 2023-12-05 22:17:51 +01:00
parent baf1172ce9
commit 8f3727477a
Signed by: LordMZTE
GPG key ID: B64802DC33A64FF6
24 changed files with 530 additions and 23 deletions

View file

@ -19,12 +19,9 @@ loom {
repositories {
mavenLocal()
maven {
url "https://maven.tilera.xyz/"
}
maven {
url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/"
}
maven { url "https://maven.tilera.xyz/" }
maven { url "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" }
maven { url "https://maven.blamejared.com" }
}
dependencies {
@ -36,6 +33,7 @@ dependencies {
modImplementation "software.bernie.geckolib:geckolib-forge-1.18:3.0.57"
modImplementation "net.anvilcraft:anvillib-18-forge:1.1.0"
modImplementation "vazkii.patchouli:Patchouli:1.18.2-66"
}
processResources {

View file

@ -11,6 +11,7 @@ import net.anvilcraft.ntx4core.recipes.OrbDuplicationRecipe;
import net.anvilcraft.ntx4core.recipes.RecipeRemovals;
import net.anvilcraft.ntx4core.recipes.RecipeReplacements;
import net.anvilcraft.ntx4core.recipes.ShapedRecipes;
import net.anvilcraft.ntx4core.recipes.ShapelessRecipes;
import net.anvilcraft.ntx4core.worldgen.Ntx4CoreFeatures;
import net.anvilcraft.ntx4core.worldgen.Ntx4CoreStructures;
import net.minecraft.recipe.RecipeSerializer;
@ -26,6 +27,7 @@ import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.forgespi.language.IModFileInfo;
import net.minecraftforge.forgespi.locating.IModFile;
@ -48,6 +50,7 @@ public class Ntx4Core {
Bus.MAIN.register(new RecipeRemovals());
Bus.MAIN.register(new RecipeReplacements());
Bus.MAIN.register(new ShapedRecipes());
Bus.MAIN.register(new ShapelessRecipes());
MinecraftForge.EVENT_BUS.register(Ntx4CoreShaders.class);
CosmeticsManager.registerProvider(new StaticCosmeticProvider());
@ -58,20 +61,29 @@ public class Ntx4Core {
}
public static void addPackFinders(AddPackFindersEvent event) {
if (!FMLEnvironment.production)
return;
if (event.getPackType() == ResourceType.SERVER_DATA) {
IModFileInfo modFileInfo = ModList.get().getModFileById(Ntx4Core.MODID);
if (modFileInfo == null) {
Ntx4Core.LOGGER.error("Could not find Ntx4Core mod file info; built-in resource packs will be missing!");
Ntx4Core.LOGGER.error(
"Could not find Ntx4Core mod file info; built-in resource packs will be missing!"
);
return;
}
IModFile modFile = modFileInfo.getFile();
event.addRepositorySource(
(consumer, constructor)
(consumer, constructor)
-> consumer.accept(ResourcePackProfile.of(
Ntx4Core.id("ntx4core_tweaks").toString(),
false, () -> new ModFilePackResources("NTX4 Tweaks", modFile, "datapacks/ntx4core_tweaks"),
constructor,
ResourcePackProfile.InsertionPosition.TOP,
Ntx4Core.id("ntx4core_tweaks").toString(),
false,
()
-> new ModFilePackResources(
"NTX4 Tweaks", modFile, "datapacks/ntx4core_tweaks"
),
constructor,
ResourcePackProfile.InsertionPosition.TOP,
ResourcePackSource.PACK_SOURCE_NONE
))
);

View file

@ -1,5 +1,6 @@
package net.anvilcraft.ntx4core;
import net.anvilcraft.ntx4core.items.ItemManual;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraftforge.registries.DeferredRegister;
@ -52,6 +53,9 @@ public class Ntx4CoreItems {
public static final RegistryObject<Item> CHAOTIC_CONSTRUCT
= registerCraftingIngredient("chaotic_construct");
public static final RegistryObject<Item> MANUAL
= ITEMS.register("manual", () -> new ItemManual());
private static RegistryObject<Item> registerCraftingIngredient(String id) {
return ITEMS.register(
id, () -> new Item(new Item.Settings().group(Ntx4CoreItemGroup.INSTANCE))

View file

@ -37,12 +37,8 @@ public class StartItems {
}
public static void giveStartingItemsTo(PlayerEntity pl) {
// Apples
{
var stack = new ItemStack(Items.APPLE, 16);
stack.setCustomName(new LiteralText("Manufacturer of Inferior Devices"));
ItemHandlerHelper.giveItemToPlayer(pl, stack);
}
// Notex 4 Guide
ItemHandlerHelper.giveItemToPlayer(pl, new ItemStack(Ntx4CoreItems.MANUAL.get()));
// Akashic Tome
{
@ -103,5 +99,12 @@ public class StartItems {
stack.setNbt(tag);
ItemHandlerHelper.giveItemToPlayer(pl, stack);
}
// Apples
{
var stack = new ItemStack(Items.APPLE, 16);
stack.setCustomName(new LiteralText("Manufacturer of Inferior Devices"));
ItemHandlerHelper.giveItemToPlayer(pl, stack);
}
}
}

View file

@ -0,0 +1,56 @@
package net.anvilcraft.ntx4core.items;
import java.util.List;
import net.anvilcraft.ntx4core.AlecManager;
import net.anvilcraft.ntx4core.Ntx4Core;
import net.anvilcraft.ntx4core.Ntx4CoreItemGroup;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.TypedActionResult;
import net.minecraft.world.World;
import vazkii.patchouli.api.PatchouliAPI;
import vazkii.patchouli.common.base.PatchouliSounds;
/**
* A custom item for the Patchouli book.
* This exists so we don't have to deal with pointless NBT data on normal Patchouli books.
*/
public class ItemManual extends Item {
public static final Identifier BOOK_ID = Ntx4Core.id("manual");
public ItemManual() {
super(new Item.Settings().group(Ntx4CoreItemGroup.INSTANCE).maxCount(1));
}
@Override
public void appendTooltip(
ItemStack stack, World world, List<Text> tooltip, TooltipContext context
) {
tooltip.add(new LiteralText("World domination in Notex 4!"));
if (AlecManager.HAS_ALEC)
tooltip.add(new LiteralText("Alec mich doch am Arsch!"));
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
var stack = user.getStackInHand(hand);
if (user instanceof ServerPlayerEntity serverPlayer) {
PatchouliAPI.get().openBookGUI(serverPlayer, BOOK_ID);
user.playSound(
PatchouliSounds.BOOK_OPEN, 1.0F, (float) (0.7D + Math.random() * 0.4D)
);
}
return new TypedActionResult<ItemStack>(ActionResult.SUCCESS, stack);
}
}

View file

@ -0,0 +1,32 @@
package net.anvilcraft.ntx4core.recipes;
import net.anvilcraft.anvillib.event.Bus;
import net.anvilcraft.anvillib.event.IEventBusRegisterable;
import net.anvilcraft.anvillib.recipe.RecipesEvent;
import net.anvilcraft.ntx4core.Ntx4Core;
import net.anvilcraft.ntx4core.Ntx4CoreItems;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.recipe.Ingredient;
import net.minecraft.recipe.ShapelessRecipe;
import net.minecraft.util.collection.DefaultedList;
public class ShapelessRecipes implements IEventBusRegisterable {
public void registerRecipes(RecipesEvent ev) {
ev.registerRecipe(new ShapelessRecipe(
Ntx4Core.id("manual"),
"",
new ItemStack(Ntx4CoreItems.MANUAL.get()),
DefaultedList.copyOf(
null,
Ingredient.ofItems(Items.BOOK),
Ingredient.ofItems(Ntx4CoreItems.COMPUTATIONAL_CORE.get())
)
));
}
@Override
public void registerEventHandlers(Bus bus) {
bus.register(RecipesEvent.class, this::registerRecipes);
}
}

View file

@ -3,15 +3,20 @@
"block.ntx4core.alecubus": "Alecubus",
"item.ntx4core.awakened_construct": "Awakened Construct",
"item.ntx4core.chaotic_construct": "Chaotic Construct",
"item.ntx4core.computational_core": "Computational Core",
"item.ntx4core.corrupted_essence": "Corrupted Essence",
"item.ntx4core.energy_infused_core": "Energy-Infused Core",
"item.ntx4core.irradiated_essence": "Irradiated Essence",
"item.ntx4core.magical_core": "Magical Core",
"item.ntx4core.magically_stabilized_sentience": "Magically Stabilized Sentience",
"item.ntx4core.manual": "Notex 4 Guide",
"item.ntx4core.sentient_singularity": "Sentient Singularity",
"item.ntx4core.stabilized_sentience": "Stabilized Sentience",
"item.ntx4core.magically_stabilized_sentience": "Magically Stabilized Sentience",
"item.ntx4core.irradiated_essence": "Irradiated Essence",
"item.ntx4core.corrupted_essence": "Corrupted Essence",
"item.ntx4core.strange_construct": "Strange Construct",
"item.ntx4core.awakened_construct": "Awakened Construct",
"item.ntx4core.chaotic_construct": "Chaotic Construct"
"book.ntx4core.name": "Notex 4 Guide",
"book.ntx4core.subtitle": "World domination in Notex 4",
"book.ntx4core.landing": "Welcome to Notex 4!$(br2)This book contains information on the pack's custom dimensions as well as how to build the mighty Alec!"
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/handheld",
"textures": {
"layer0": "ntx4core:item/manual"
}
}

View file

@ -0,0 +1,6 @@
{
"name": "The mighty Alec",
"description": "The creation of the holy Alecubus.",
"icon": "ntx4core:alecubus",
"sortnum": 0
}

View file

@ -0,0 +1,6 @@
{
"name": "Dimensions",
"description": "The dimensions of Notex 4$(br2)$(l)The first page of each dimension entry will contain an item you must throw into the portal frame to activate it!/$",
"icon": "minecraft:end_portal_frame",
"sortnum": 1
}

View file

@ -0,0 +1,18 @@
{
"category": "ntx4core:alec",
"name": "The Alecubus",
"icon": "ntx4core:alecubus",
"sortnum": 0,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Alecubus",
"item": "ntx4core:alecubus",
"text": "The $(item)Alecubus/$ is your end goal. It is the cube form of the mighty Alec.\nIt is an item which requires you to master many of the pack's mods to make.$(br2)As an inhabitant of this world it might just be you, yes you, $(l)$(playername)/$, to first create the one and only $(item)Alecubus/$!"
},
{
"type": "patchouli:text",
"text": "In order to create the $(item)Alecubus/$, you must start from nothing but a computer and work your way up through many components in order to arrive at the $(item)Alecubus/$. On this journey, you will venture through $(thing)Create/$, $(thing)Mana and Artifice/$, $(thing)Powah/$, $(thing)Pneumaticcraft/$, $(thing)Botania/$, $(thing)Nuclear Science/$, $(thing)Assembly Line Machines/$, $(thing)PSI/$, $(thing)Blood Magic/$, $(thing)Draconic Evolution/$ and finally $(thing)Mekanism/$.$(br2)Some might say it'd be silly to take on such a journey alone... Or at all."
}
]
}

View file

@ -0,0 +1,30 @@
{
"category": "ntx4core:alec",
"name": "The BORG Kindberg",
"icon": "minecraft:lectern",
"sortnum": 1,
"pages": [
{
"type": "patchouli:text",
"title": "The BORG Kindberg",
"text": "The BORG Kindberg is a legendary structure you might find far, far away on your ventures. Within, you will discover the origins of the Alec. Things to find include but aren't limited to:$(li)The Cafeteria's Menu/$$(li)Ulrike Scheucher's office/$$(li)Juri Höfler's favorite literature/$"
},
{
"type": "patchouli:image",
"images": ["ntx4core:textures/gui/manual/borg_screenshot.png"],
"text": "$(o)The BORG as seen from above/$"
},
{
"type": "patchouli:entity",
"entity": "minecraft:villager",
"name": "Ulrike Scheucher",
"text": "The one and only Ulrike Scheucher, world's best latin teacher"
},
{
"type": "patchouli:entity",
"entity": "minecraft:villager",
"name": "Juri Höfler",
"text": "Juri Höfler, the school's director and passionate Mein Kampf reader"
}
]
}

View file

@ -0,0 +1,68 @@
{
"category": "ntx4core:alec",
"name": "The Components",
"icon": "ntx4core:chaotic_construct",
"sortnum": 2,
"pages": [
{
"type": "patchouli:text",
"title": "The Components",
"text": "The $(thing)components/$ form a hirarchy of crafting components, the greatest one of which is the $(item)Chaotic Core/$. They have other uses but their primary purpose is to form the heart of the $(item)Alecubus/$. To craft the mighty $(item)Alecubus/$, you must work your way up.\n$(o)Click the items to view their recipes./$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:computational_core",
"text": "The $(item)Computational Core/$ is the first step in the long journey ahead of you. It is created by compressing the computational power of an $(l)advanced/$ computer into a core small enough to fit into your hand."
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:energy_infused_core",
"text": "By infusing the $(item)Computational Core/$ with the exceptionally hot $(thing)Classic Lava/$ over the searing inferno of a $(thing)superheated Blaze Burner/$, you make it even faster.$(br2)$(br2)$(o)Kern rennt/$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:magical_core",
"text": "The $(item)Energy-Infused Core/$ is strong in computational power, yet it lacks magical abilities. You think you can fix this by using your $(thing)Arcane Furnace/$, $(l)levelled up to level 5/$."
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:sentient_singularity",
"text": "You have created the perfect magical computer, but it lacks... personality.\nBy combining your $(item)Magical Core/$ with a $(item)Singularity/$, an $(item)Ender Core/$ and $(thing)tons of electricity/$, you try manage to successfully imbue your creation with conscience.\n$(o)It seems to know something you don't/$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:stabilized_sentience",
"text": "Your previous creation, while it does seem to already be smarter than you, doesn't look like it can be trusted to fully use it's power without self-destructing. To remedy this, you figure it'd be good to encase it in a strong and magic-resistant material. $(item)Novasteel Plates/$ seem like just the right choice. By applying them under $(l)high pressure/$, you create a stable container."
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:magically_stabilized_sentience",
"text": "While your previous results have proven themselves at keeping the $(item)Sentient Singularity/$ from self-destruction, it doesn't quite seem to be able to think straight. You don't quite know what to do about this magical instability, but you figure your friends in $(thing)Alfheim/$ might know more. You hand your creation to them."
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:irradiated_essence",
"text": "With your sentient component completed, you see only one way to take this to achieve your ultimate goal of creating the $(item)Alecubus/$. By exposing the $(item)Magically Stabilized Sentience/$ to some highly radioactive $(thing)Uranium Hexafluoride/$, you corrupt the component beyond recognition.$(br2)$(o)Something evil just awoke within/$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:corrupted_essence",
"text": "The result of your previous experiment seems to have something about it the previous iterations didn't, but it's still utterly discombobulated. You assess the horror you've created and figure that the only way to bind this substance back together is using a highly unstable combination of $(thing)Condensed Void/$ and $(item)Strange Matter/$.$(br2)$(o)It seems to be watching you/$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:strange_construct",
"text": "You've gotten some stability into your creation in the previous step, but it's nowhere near usable yet. A discovery you've recently heard about comes to mind. The newly-discovered $(l)$(l:dimensions/mirror)Mirror Dimension/$ seems to have unique magical properties. You think your $(item)$(l)Ebony/$$(item) Psimetal CAD/$ can harness these using the $(thing)Ebony & Ivory/$ trick.$(br2)It's staring right into your soul/$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:awakened_construct",
"text": "The devious look in the eye of the $(item)Strange Construct/$ is already showing, but it's not fully there yet. You decide it would be a good idea to infuse it with the $(#f00)blood of your enemies/$ in your newly-acquired fully upgraded blood altar. You no longer feel safe around your creation.$(br2)$(o)It's plotting against you/$"
},
{
"type": "patchouli:spotlight",
"item": "ntx4core:chaotic_construct",
"text": "The $(item)Awakened Construct/$, while already a force to be reckoned with does not quite fulfill the requirements of the mighty Alec. You infuse it with the remains of the fallen $(#f00)Chaos Guardian/$. $(l)This will be worthy./$$(br2)$(o)The wrath of the Alec in the palm of your hands/$"
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Cavern",
"icon": "minecraft:deepslate",
"sortnum": 0,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Cavern",
"item": "minecraft:amethyst_shard",
"text": "$(thing)The Cavern/$ is an underground dimension of never-ending caves. Perfect for mining and getting lost!"
},
{
"type": "patchouli:multiblock",
"name": "Cavern Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:deepslate"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Chaos",
"icon": "chemlib:oganesson",
"sortnum": 1,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Chaos Dimension",
"item": "chemlib:oganesson",
"text": "$(thing)The Chaos Dimension/$ is a chaotic mess of biomes and blocks in a grid-like layout. It seems tilera might've ran out of ideas here."
},
{
"type": "patchouli:multiblock",
"name": "Chaos Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:end_stone"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Lost Cities",
"icon": "legacy_revived:cyan_flower",
"sortnum": 2,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Lost Cities",
"item": "legacy_revived:cyan_flower",
"text": "By containing the nostalgia energy of the allmighty $(l)Stonecutter/$ and a flower from days long gone, you manage to channel a rift into a long lost city.$(br2)Perfect for exploration!"
},
{
"type": "patchouli:multiblock",
"name": "Lost Cities Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "legacy_revived:legacy_stonecutter"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Flat World",
"icon": "powah:crystal_blazing",
"sortnum": 3,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Flat World",
"item": "powah:crystal_blazing",
"text": "This portal will lead you to a flat world with nothing but endless grass. Ideal for large-scale projects where space takes priority over beautiful terrain!"
},
{
"type": "patchouli:multiblock",
"name": "Flat World Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:quartz_block"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Gateway Portals",
"icon": "minecraft:ender_eye",
"sortnum": 999,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Flat World",
"item": "minecraft:ender_eye",
"text": "Gateway Portals do not lead to new dimensions, but link up within the $(l)same dimension/$. Build 2 portals of the $(l)same size/$ and activate one of them to create a link!"
},
{
"type": "patchouli:multiblock",
"name": "Gateway Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:prismarine"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Islands Dimension",
"icon": "dmlreforged:living_matter_hellish",
"sortnum": 4,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Flat World",
"item": "dmlreforged:living_matter_hellish",
"text": "The $(thing)Islands Dimension/$ is a nether-like dimension made of islands instead of caverns."
},
{
"type": "patchouli:multiblock",
"name": "Islands Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:smooth_basalt"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Mirror Dimension",
"icon": "dmlreforged:living_matter_overworldian",
"sortnum": 5,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Mirror Dimension",
"item": "dmlreforged:living_matter_overworldian",
"text": "The $(thing)Mirror Dimension/$ is completely identical to the overworld... or so it seems.$(br2)Upon further research, you exhibit strange magical fields in this dimension..."
},
{
"type": "patchouli:multiblock",
"name": "Mirror Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:amethyst_block"
},
"symmetrical": true
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"category": "ntx4core:dimensions",
"name": "Skylands Dimension",
"icon": "minecraft:water_bucket",
"sortnum": 6,
"pages": [
{
"type": "patchouli:spotlight",
"title": "The Skylands Dimension",
"item": "minecraft:water_bucket",
"text": "The $(thing)Skylands Dimension/$ is a heavenly place consisting of endless floating islands. $(#f00)Unlike all other portals, it is activated not by dropping, but by placing a water bucket inside./$$(br2)$(o)Seems oddly familiar.../$"
},
{
"type": "patchouli:multiblock",
"name": "Skylands Portal",
"multiblock": {
"pattern": [
["_##_"],
["# #"],
["# #"],
["#0 #"],
["_##_"]
],
"mapping": {
"#": "minecraft:glowstone"
},
"symmetrical": true
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

View file

@ -0,0 +1,15 @@
{
"name": "book.ntx4core.name",
"subtitle": "book.ntx4core.subtitle",
"landing_text": "book.ntx4core.landing",
"book_texture": "patchouli:textures/gui/book_cyan.png",
"model": "ntx4core:manual",
"dont_generate_book": true,
"custom_book_item": "ntx4core:manual",
"show_progress": false,
"advancement_namespaces": ["ntx4core"],
"use_resource_pack": true,
"macros": {
"\n": "$(br)"
}
}