├── 01-packdev-env.md ├── 02-crafttweaker-introduction.zs ├── 03-recipe-removal-and-hiding.zs ├── 04-adding-recipes.zs ├── 05-itemdamage-and-itemtransformers.zs ├── 06-renaming-stuff.zs ├── 07-useful-packdev-mods.md ├── 08-datatype-maps.zs ├── 09-modular-machinery-basics ├── crafttweaker-mm-recipe.zs └── radiation_chamber.json ├── 10-pillar-structure-generation ├── ie_blacksmith.json └── notes.md ├── 11-pillar-loot-table ├── dungeon.json └── notes.md ├── 12-loottweaker-and-crt-dropfunctions └── script.zs ├── 13-extendedcrafting └── extendedcrafting.zs ├── 14-real-examples ├── functioncaller.zs ├── functions.zs ├── oredict-cleaner.zs ├── priority.zs └── replace-occurences.zs ├── 15-dropt ├── example1.json ├── example2.json ├── example3.json └── example4.json ├── 16-contenttweaker-material-system ├── materials.zs └── te.zs ├── 17-contenttweaker-custom-fluids-blocks-items ├── content.zs └── resources │ ├── contenttweaker │ ├── blockstates │ │ ├── light_ash.json │ │ └── liquid_slime.json │ ├── lang │ │ └── en_us.lang │ ├── models │ │ └── item │ │ │ └── windup_clock.json │ └── textures │ │ ├── blocks │ │ └── light_ash.png │ │ └── items │ │ └── windup_clock.png │ └── pack.mcmeta ├── 18-contenttweaker-item-click-functions └── ct.zs ├── 19-scavenge ├── config.cfg ├── pillar │ ├── spawnable.json │ └── structures │ │ └── spawnable.nbt ├── regen_block.json ├── siftable_gravel.json ├── summon_entity.json └── thaumcraft_meteor.json ├── 20-gamestages ├── gated-recipes.zs └── loaders │ └── gamestage_books.zs ├── 21-triumph-introduction └── triumph │ ├── Triumph.txt │ ├── functions │ └── triumph │ │ └── gamestage_functions │ │ └── thermal.txt │ └── script │ └── triumph │ └── test │ ├── adv2.txt │ └── root.txt ├── 22-contenttweaker-chickens ├── readme.md ├── resources │ ├── contenttweaker │ │ ├── lang │ │ │ └── en_us.lang │ │ └── textures │ │ │ └── entities │ │ │ └── voidmetal_chicken.png │ ├── pack.mcmeta │ └── roost │ │ └── textures │ │ ├── blocks │ │ └── chicken │ │ │ └── voidmetal_chicken.png │ │ └── items │ │ └── chicken │ │ └── voidmetal_chicken.png └── scripts │ └── loaders │ └── chickens.zs └── 23-twitch-exporter ├── README.txt ├── build.bat └── build └── general.json /01-packdev-env.md: -------------------------------------------------------------------------------- 1 | ## Packdev Environment 2 | 3 | ### Video Link 4 | https://www.youtube.com/watch?v=mWV8XBvC5ks 5 | 6 | ### Zenscript extension for VSCode 7 | https://marketplace.visualstudio.com/items?itemName=BloodWorkXGaming.zslint 8 | 9 | ### Start zslint with 10 | `/crafttweaker zslint` to start linting 11 | Will output errors into crafttweaker.log and ingame chat when script files are saved with errors in them. 12 | 13 | ### Snaketail, log tailing for windows 14 | http://snakenest.com/snaketail/ 15 | 16 | ### Visual studio code multicursors 17 | Select multiple occurrences with `CTRL + D` 18 | 19 | ### Editing config files while the game is running 20 | If you're editing config files while the game is running do not change mod options in game 21 | as they will trigger an event an overwrite disk changes. 22 | -------------------------------------------------------------------------------- /02-crafttweaker-introduction.zs: -------------------------------------------------------------------------------- 1 | import crafttweaker.item.IItemStack; 2 | 3 | /* 4 | Crafttweaker introduction 5 | https://www.youtube.com/watch?v=bx7VoAmTReo 6 | */ 7 | 8 | # List of common CrT data types 9 | # https://crafttweaker.readthedocs.io/en/latest/#Vanilla/Variable_Types/Variable_Types/ 10 | 11 | # List of globally available fields in CrT 12 | # https://crafttweaker.readthedocs.io/en/latest/#Vanilla/Global_Functions/#global-fields 13 | 14 | /* 15 | Values are saved in either 16 | val, var, global or static (The last 2 are not covered in the video) 17 | val can't change value after being declared 18 | var can change value after being declared 19 | https://ftb.gamepedia.com/How_to_Use_MineTweaker_3#Variables_and_Values 20 | */ 21 | 22 | 23 | /* The vars below will autocast to the commented type */ 24 | # string 25 | var aString = "Hello world"; 26 | # int 27 | var aInteger = 42; 28 | # bool 29 | var aBoolean = false; 30 | # null 31 | var aNullVal = null; 32 | # IItemStack 33 | var aItemStack = ; 34 | # IOreDictEntry 35 | var aOreDictEntry = ; 36 | 37 | # You can implicitly cast types if you don't want to rely on autocasting 38 | var tooltip = "Test" as string; 39 | 40 | /* 41 | IItemStack array, needs to be casted and IItemStack needs to be imported 42 | If you need a IItemStack from an IOreDictEntry you can grab that from the firstItem field 43 | */ 44 | var itemArray as IItemStack[] = [ 45 | aOreDictEntry.firstItem, 46 | , 47 | , 48 | , 49 | , 50 | , 51 | , 52 | , 53 | , 54 | 55 | ]; 56 | 57 | /* 58 | Since tooltip is a var we can set a new value after it's declaration. 59 | We still need to adhere to the original type of the var so if we want to use solely an int we need to cast it to string 60 | */ 61 | tooltip = 12 as string; 62 | 63 | # We can also use string appending if we want to use a integer var without casting 64 | tooltip = "The meaning of life? Well it's: " + aInteger; 65 | 66 | /* 67 | A loop will traverse arrays or maps(not yet covered), the code block inside of the for loop 68 | will execute once per entry in the array/map 69 | item is the handle for the current entry 70 | */ 71 | for item in itemArray { 72 | item.addTooltip(tooltip); 73 | } 74 | 75 | # You can also get the index of the current entry when grabbing 2 vars from the array. 76 | for i, item in itemArray { 77 | # Will output the indexes of itemArray, from 0-9 78 | print(i); 79 | } -------------------------------------------------------------------------------- /03-recipe-removal-and-hiding.zs: -------------------------------------------------------------------------------- 1 | import crafttweaker.item.IItemStack; 2 | import crafttweaker.item.IIngredient; 3 | import mods.jei.JEI; 4 | 5 | /* 6 | Crafttweaker Recipe removal & Hiding things in JEI 7 | Requires Thermal Foundation and JEI for script to run 8 | https://www.youtube.com/watch?v=WeBdH91e_RA 9 | */ 10 | 11 | 12 | var itemArray as IItemStack[] = [ 13 | , 14 | , 15 | , 16 | , 17 | , 18 | , 19 | 20 | ]; 21 | 22 | for item in itemArray { 23 | # The most common way of recipe 24 | recipes.remove(item); 25 | } 26 | 27 | # Furnace removal 28 | furnace.remove(); 29 | 30 | # Removing by recipe id 31 | recipes.removeByRecipeName("minecraft:light_gray_dye_from_white_tulip"); 32 | 33 | /* 34 | You can remove all recipes that's registered to a specific modid with the removeByMod method 35 | This is sadly missing from the CrT wiki but it was added in this commit 36 | https://github.com/CraftTweaker/CraftTweaker/commit/815714fa1f9c6db87585add3702eec4a6ff83227 37 | */ 38 | recipes.removeByMod("thermalfoundation"); 39 | 40 | /* 41 | JEI has a hide ingredients mode and I recommend you use it since it's easier to see what's hidden ingame. 42 | But if you do want to do it in CrT it's done like this 43 | */ 44 | JEI.hide(); 45 | 46 | # You can also combo recipe removal with hiding items in JEI 47 | JEI.removeAndHide(); -------------------------------------------------------------------------------- /04-adding-recipes.zs: -------------------------------------------------------------------------------- 1 | import crafttweaker.item.IItemStack; 2 | import crafttweaker.item.IIngredient; 3 | import mods.jei.JEI; 4 | 5 | /* 6 | Crafttweaker Shaped and Shapeless recipes 7 | https://www.youtube.com/watch?v=xXm10FaAvXY 8 | */ 9 | 10 | # We'll use x as a token for pumpkin seeds in this recipe, as they will become more readable. 11 | var x = ; 12 | 13 | /* 14 | addShaped() 15 | recipename - identifier of the recipe 16 | output - IItemStack 17 | inputs - a two dimensional array of inputs, think of each array entry as a row 18 | Each row can hold 1-3 IIngredients, and you can have 1-3 rows, so the following 3 recipes are valid 19 | */ 20 | # 1 row, each row populated with 2 IIngredients 21 | recipes.addShaped("cropPumpkingExample1", .firstItem, [ 22 | [x, x] 23 | ]); 24 | 25 | # 2 rows, each row populated with 2 IIngredients 26 | recipes.addShaped("cropPumpkingExample2", .firstItem * 2, [ 27 | [x, x], 28 | [x, x] 29 | ]); 30 | 31 | # 3 row, each row populated with 3 IIngredients 32 | recipes.addShaped("cropPumpkingExample3", .firstItem * 3, [ 33 | [x, x, x], 34 | [x, x, x], 35 | [x, x, x] 36 | ]); 37 | 38 | 39 | # Mirrored recipes can be mirrored in the crafting grid, so the following example would match / and \ 40 | recipes.addShapedMirrored("cropPumpkingExample4", .firstItem * 2, [ 41 | [x, null, null], 42 | [null, x, null], 43 | [null, null, x] 44 | ]); 45 | 46 | 47 | /* 48 | addShapeless() 49 | recipename - identifier of the recipe 50 | output - IItemStack 51 | inputs - a one dimensional array of inputs, shape in grid will not matter 52 | */ 53 | recipes.addShapeless("cropPumpkingExample5", .firstItem * 12, [x, x, ]); 54 | -------------------------------------------------------------------------------- /05-itemdamage-and-itemtransformers.zs: -------------------------------------------------------------------------------- 1 | import crafttweaker.item.IItemStack; 2 | 3 | /* 4 | Crafttweaker Item Damage Crafting & Item Transformers 5 | Requires Thermal Foundation mod for script to run 6 | https://www.youtube.com/watch?v=u-j57wF8nw0 7 | */ 8 | 9 | # array filled with IItemStack entries 10 | var teHammers = [ 11 | , 12 | , 13 | , 14 | , 15 | , 16 | , 17 | , 18 | , 19 | , 20 | , 21 | , 22 | , 23 | , 24 | , 25 | 26 | ] as IItemStack[]; 27 | 28 | # when grabbing 2 vars while iterating an array the first one will be the index of the entry 29 | for i, hammer in teHammers { 30 | /* 31 | For each hammer in the array, add a recipe to crush iron ore into pulverized iron 32 | using anyDamage() so that a hammer with any damage can be used for the recipe 33 | and using transformDamage(3) to make sure the hammer takes 3 damage each craft 34 | */ 35 | recipes.addShapeless("te_hammer_crush_iron_" + i, * 2, 36 | [hammer.anyDamage().transformDamage(3), ] 37 | ); 38 | } 39 | 40 | /* 41 | buckets seem to have their own transformers, this recipe will give back an empty bucket even though 42 | we don't attach any transformer to the IItemStack 43 | */ 44 | recipes.addShapeless("poorMansSifting", , 45 | [, .reuse(), ] 46 | ); -------------------------------------------------------------------------------- /06-renaming-stuff.zs: -------------------------------------------------------------------------------- 1 | /* 2 | CraftTweaker Renaming and Localization 3 | https://www.youtube.com/watch?v=VLHfo_G2im0 4 | */ 5 | 6 | # Renaming can be done on items and blocks with the IItemStack brackets 7 | .displayName = "Fly Flogger"; 8 | 9 | var materialName = "Rupee"; 10 | .displayName = materialName + " Ore"; 11 | .displayName = materialName + " Block"; 12 | .displayName = materialName; 13 | 14 | /* 15 | If you want to localize for other languages (or rename entities) you need to use the 16 | setLocalization() method on the global game field. 17 | */ 18 | # Localizing a entityname 19 | game.setLocalization("entity.Sheep.name", "Super Sheep"); 20 | 21 | # Getting the entityname isn't always easy, you can use an IEntityDefinition bracket to get the localizable name, or fetch the definition with game.getEntity() 22 | game.setLocalization("entity." + .name + ".name", "Giant Spider"); 23 | game.setLocalization("entity." + game.getEntity("cow").name + ".name", "Belgian Blue"); 24 | 25 | # You can localize for example blocks with either typing out the unlocalized string manually 26 | game.setLocalization("tile.stone.diorite.name", "All hail diorite"); 27 | 28 | # or grabbing the unlocalized name from the IItemDefinition, however the following will not work since it's a subitem of stone 29 | game.setLocalization(.definition.name + ".name", "Annddeeesssite"); 30 | 31 | # But the following would work since it has no subitems 32 | game.setLocalization(.definition.name + ".name", "Orange cubic melon"); -------------------------------------------------------------------------------- /07-useful-packdev-mods.md: -------------------------------------------------------------------------------- 1 | ## Useful pack dev mods 2 | 1.12.2 is a utopia for pack devs, there are a ton of mods that alter various things in the game and it feels like we're getting a few new pack-dev focused mod every week. And since there's so many of them now I have probably missed a few. 3 | 4 | ### Video Link 5 | https://www.youtube.com/watch?v=QLy3Z8cmUl4 6 | 7 | ### CraftTweaker 8 | * [Crafttweaker](https://minecraft.curseforge.com/projects/crafttweaker) - Can tweak most things there are to tweak, all hail Crafttweaker. 9 | * [Fabricate](https://minecraft.curseforge.com/projects/fabricate) - A in the works alternative to CraftTweaker that uses javascript instead of zenscript. 10 | 11 | ### CraftTweaker AddOns 12 | * [ContentTweaker](https://minecraft.curseforge.com/projects/contenttweaker) - custom items/blocks/enchants/fluids/creative tabs 13 | * [ModTweaker](https://minecraft.curseforge.com/projects/modtweaker) - Adds CrT support for various machines and registries 14 | * [LootTweaker](https://minecraft.curseforge.com/projects/loottweaker) - Alter existing Loot Tables through CrT 15 | * [ArtisanWorktables](https://minecraft.curseforge.com/projects/artisan-worktables) - Custom crafting tables with fluid crafting, tiers and a ton of extra tools. 16 | * [Extended Crafting](https://minecraft.curseforge.com/projects/extended-crafting) - Custom crafting for 3x3, 5x5, 7x7, and 9x9 crafting tables. Also have a "combination crafting" multiblock that allows for pedestal style crafting. 17 | * [TreeTweaker](https://minecraft.curseforge.com/projects/tree-tweaker) - Highly customizable tree spawning rules & custom trees 18 | * [Initial Inventory](https://minecraft.curseforge.com/projects/initial-inventory) - Specify what items the player should start with. 19 | * [Advanced Mortars](https://minecraft.curseforge.com/projects/advanced-mortars) - Custom mortar recipes which could be nice early game. 20 | * [Alfinivia](https://minecraft.curseforge.com/projects/alfinivia) - Adds liquid interactions, and some stuff to Misty World and IE, a lot like Modtweaker. 21 | * [PackMode](https://minecraft.curseforge.com/projects/packmode) - Pack modes similar to 1.7.10 packs, script files can be attached to a certain mode with CrT preprocessors. 22 | * [ArmoreableMobs](https://minecraft.curseforge.com/projects/armoreablemobs) - Give mobs armor/items on spawn using CraftTweaker. 23 | 24 | ### Tweaker mods with CrT support but works standalone 25 | * [Modular Machinery](https://minecraft.curseforge.com/projects/modular-machinery) - Custom multiblock machines, recipes for the machines can be added in JSON or through Crafttweaker. 26 | * [UniDict](https://minecraft.curseforge.com/projects/unidict) - Unifies metals and machine outputs of said metals, very powerful. Have a few methods in Crafttweaker. 27 | 28 | ### Misc tweakers with no Crt support 29 | * [Dropt](https://minecraft.curseforge.com/projects/dropt) - Powerful drop replacer for blocks with a ton of rules and modifiers. JSON Based 30 | * [Block Drops Tweaker](https://minecraft.curseforge.com/projects/block-drops-tweaker) - Similar to Dropt, also JSON based. Have commands to help with rule creation. 31 | * [Scavenge](https://minecraft.curseforge.com/projects/scavenge) - JSON based tweaker that let you scavenge items from blocks, can have rules like that the player has to sneak to scavenge, or that the block has x amounts of uses. 32 | * [Gendustry](https://minecraft.curseforge.com/projects/gendustry) - Can makes custom bees, combs and bee mutations for Forestry 33 | * [Block Tweaker](https://minecraft.curseforge.com/projects/block-tweaker) - Tweak properties of existing blocks. 34 | * [Ex Nihilo Creatio](https://minecraft.curseforge.com/projects/ex-nihilo-creatio) - Config can be changed so it uses json lists for its recipes. Not exactly a pack dev mod but it's really versatile. 35 | * [Erosion 2](https://minecraft.curseforge.com/projects/erosion) - Block fluid erosion, will transform certain blocks under the right conditions. 36 | * [Restriction](https://minecraft.curseforge.com/projects/restriction) - JSON based tweaker that let you limit the players ability to place Blocks/TileEntities depending on a set of rules. Will not stop placed TileEntities from working but it will block any tries to open the GUI if the conditions are not met. 37 | 38 | ### Custom dimension mods 39 | * [Dimensional Control](https://minecraft.curseforge.com/projects/dimensional-control) - Tweaks dimensions. Can do powerful stuff like block replacing at certain Y levels, custom portal structures and more. 40 | * [Just Enough Dimensions](https://minecraft.curseforge.com/projects/just-enough-dimensions) - JSON based custom dimensions. 41 | * [The Lost Cities](https://minecraft.curseforge.com/projects/the-lost-cities) - A custom dimension for city-like landscapes, but it's profile system is very powerful when paired with Just Enough Dimensions. 42 | * [Void Island Control](https://minecraft.curseforge.com/projects/void-island-control) - Highly customizable void dimension control, can generate islands from minecraft structure data. 43 | * [Advanced Rocketry](https://minecraft.curseforge.com/projects/advanced-rocketry) - Included in this list since it can be used to make custom planet dimensions. 44 | 45 | ### Ore Gen & World Gen Tweakers 46 | * [CoFH World](https://minecraft.curseforge.com/projects/cofh-world) - Ore, lakes & biome decorators like bushes grass etc. Very powerful. JSON Based. 47 | * [Ore Tweaker](https://minecraft.curseforge.com/projects/ore-tweaker) - Oregen configured through a config file, can disable vanilla ore gen and do it's own custom ore gen. 48 | * [Hex Lands](https://minecraft.curseforge.com/projects/hex-lands) - tile based world generation. 49 | * [Worley's Caves](https://minecraft.curseforge.com/projects/worleys-caves) - Overhaul of vanilla cavegen, adds continuous larger caves. 50 | * [Cave Generator](https://minecraft.curseforge.com/projects/cave-generator) - Overhaul of vanilla cavegen, can be tweaked with custom presets. 51 | 52 | ### Biome Gen Tweakers 53 | * [Biome Tweaker](https://minecraft.curseforge.com/projects/biometweaker) - Tweak existing biomes or make custom ones 54 | * [Biome Tweaker Core](https://minecraft.curseforge.com/projects/biometweakercore) - Coremod addition to biometweaker, allows for some extra tweaks like foilagecolors. 55 | 56 | ### Custom structure generation 57 | * [Recurrent Complex](https://minecraft.curseforge.com/projects/recurrent-complex) - Versatile custom structure generation system 58 | * [Pillar](https://minecraft.curseforge.com/projects/pillar) - Easier recurrent complex alternative, json based. Generate structures in the world with the use of structure blocks. 59 | * [Roguelike Dungeons](https://minecraft.curseforge.com/projects/roguelike-dungeons) - Dungeon mod that comes with a few new dungeons, but you can make custom dungeons where most things are tweakable. 60 | 61 | ### Mob spawning 62 | * [In Control!](https://minecraft.curseforge.com/projects/in-control) - Very powerful JSON based mod that can set spawning rules, and tweak mob properties on spawn. 63 | 64 | ### Questing 65 | * [Better Questing](https://minecraft.curseforge.com/projects/better-questing) - Questing mod with a very good quest designer. preferable to HQM since HQM has no release version for 1.12, only beta. 66 | * ["Better Questing - Standard Expansion"](https://minecraft.curseforge.com/projects/better-questing-standard-expansion) - Adds Tasks/Rewards/Themes etc. absolutely required to do anything with Better Questing. 67 | * [Triumph](https://minecraft.curseforge.com/projects/triumph) - Custom advancements. Best used with Better Advancements. 68 | * [Better Advancements](https://minecraft.curseforge.com/projects/better-advancements) - Improves the UX of the vanilla advancement GUI. 69 | 70 | ### GameStages - Some of them, there are a ton 71 | * [Game Stages](https://minecraft.curseforge.com/projects/game-stages) - Base API, required for all of the gamestage AddOn mods. 72 | * [Recipe Stages](https://minecraft.curseforge.com/projects/recipe-stages) - Hide and disable certain recipes until the player has a certain stage. 73 | * [MultiBlock Stages](https://minecraft.curseforge.com/projects/multiblock-stages) - Require the player to have stage X to be able to construct a specific multiblock. 74 | * [Ore Stages](https://minecraft.curseforge.com/projects/ore-stages) - Can hide ores behind gamestages, hidden ores can be masked as a different block. 75 | * [Gamestage Books](https://minecraft.curseforge.com/projects/gamestage-books) - Consumable books that unlocks GameStages, mostly added for an alternative to unlocking gamestages by commands. 76 | 77 | ### Misc 78 | * [TellMe](https://minecraft.curseforge.com/projects/tellme) - Mod for dumping metadata for your minecraft instance. Sometimes you want to dump data which crafttweaker cannot dump, for example a list of registered enchantments. Can give information about most things that have a registry. 79 | * [Controlling](https://minecraft.curseforge.com/projects/controlling) - Searchable keybinds, Not a pack dev mod per say, but something every pack should have. 80 | * [FastWorkbench](https://minecraft.curseforge.com/projects/fastworkbench) - Important performance mod for 1.12, caches recipes so the game does not do a full recipe lookup for every recipe when batch crafting. 81 | * [Preston](https://minecraft.curseforge.com/projects/preston) - Block compression for all blocks in the game, you can configure how many compression levels a block have. 82 | * [Custom Main Menu](https://minecraft.curseforge.com/projects/custom-main-menu) - Tweaker for the main menu, can alter buttons, backgrounds etc. 83 | * [Resource Loader](https://minecraft.curseforge.com/projects/resource-loader) - Custom resourceloader thats helpful with Custom Main Menu 84 | * [LaunchGUI](https://minecraft.curseforge.com/projects/launchgui) - Displays custom messages when the modpack is launched. 85 | * [Pickle Tweaks](https://minecraft.curseforge.com/projects/pickle-tweaks) - Adds crafting grid repairing of tools, information tooltips and right clicking crops. 86 | * [World Stripper](https://minecraft.curseforge.com/projects/world-stripper) - Can strip out configured blocks from your world so it's easier to see how your oregen or cavegen looks. 87 | * [Water Control Extreme](https://minecraft.curseforge.com/projects/water-control-extreme) - Limits the minecraft behaviour of having infinite water 88 | * [Custom Tweaks](https://minecraft.curseforge.com/projects/custom-tweaks) - Various meta tweaks to packs, like changing the window title of the java process & encouraging users to update the pack to the latest version. 89 | * [Material Changer](https://minecraft.curseforge.com/projects/material-changer) - Changes properties for certain materials. 90 | * [Infini-TiC](https://minecraft.curseforge.com/projects/infini-tic) - JSON based way to add additional materials to Tinkers Construct. 91 | * [Tweakers Construct](https://minecraft.curseforge.com/projects/tweakers-construct) - Minor Tinkers Construct addition that lets you tweak base durability, cost of parts, and removing tool materials. -------------------------------------------------------------------------------- /08-datatype-maps.zs: -------------------------------------------------------------------------------- 1 | import crafttweaker.oredict.IOreDictEntry; 2 | 3 | /* 4 | Crafttweaker Maps/Associative Arrays 5 | Immersive Engineering Required for script to work (Thermal Foundation is optional) 6 | https://www.youtube.com/watch?v=3hX4XH1VYvw 7 | 8 | A map (or an Associative Array, which is the proper term) is a data-type that's similiar to arrays. 9 | The big difference being that a map can have non-numeric indexes. 10 | 11 | A map is declared with the {} brackets and entries are specified as key: value 12 | 13 | Text before the key separator ":" will be interpreted as strings even if they don't have 14 | the quotation marks, so both iron and "iron" would later be accessed through map["iron"] 15 | 16 | You could fetch the IOreDictEntry for oreIron from the metalObjects map 17 | with -> metalObjects["iron"].ore 18 | 19 | When wondering what key represents what nesting level just read 20 | "as IOreDictEntry[string][string]" LEFT to right 21 | So for example: 22 | First [string] bracket represents the level where the iron, gold and copper keys are 23 | Second [string] bracket represents the level where the ore and dust keys are 24 | Thidrly IOreDictEntry, The value. 25 | */ 26 | var metalObjects as IOreDictEntry[string][string] = { 27 | iron: { 28 | ore: , 29 | dust: 30 | }, 31 | gold: { 32 | ore: , 33 | dust: 34 | }, 35 | copper: { 36 | ore: , 37 | dust: 38 | }, 39 | silver: { 40 | ore: , 41 | dust: 42 | } 43 | }; 44 | 45 | # They can both be accessed with [key][key] or [key].memberGetter 46 | print(metalObjects["iron"]["dust"].firstItem.displayName); # -> Pulverized Iron 47 | print(metalObjects["copper"]["ore"].firstItem.displayName); # -> Copper Ore 48 | print(metalObjects["iron"].dust.firstItem.displayName); # -> Pulverized Iron 49 | print(metalObjects["copper"].ore.firstItem.displayName); # -> Copper Ore 50 | 51 | /* 52 | You can loop nested maps like these with 53 | either the key, value iterator and grab the nested map from -> value 54 | */ 55 | for key, value in metalObjects { 56 | recipes.addShapeless(value.dust.firstItem * 4, 57 | [, value.ore] 58 | ); 59 | } 60 | 61 | # or the key iterator and get the nested map from -> metalObjects[key] 62 | for key in metalObjects { 63 | recipes.addShapeless(metalObjects[key].dust.firstItem * 4, 64 | [, metalObjects[key].ore] 65 | ); 66 | } 67 | -------------------------------------------------------------------------------- /09-modular-machinery-basics/crafttweaker-mm-recipe.zs: -------------------------------------------------------------------------------- 1 | import mods.modularmachinery.RecipeBuilder; 2 | 3 | /* 4 | Modular Machinery Basics 5 | Immersive Engineering Required for script to work 6 | https://www.youtube.com/watch?v=5YiS2-SzSEw 7 | */ 8 | 9 | # Returns a RecipePrimer object, params are recipeName, machine registry name and processing time in ticks 10 | var potatoRecipe = RecipeBuilder.newBuilder("radioactivePotatoes", "radiation_chamber", 120); 11 | 12 | potatoRecipe.addItemInput(); 13 | potatoRecipe.addItemOutput(); 14 | 15 | # If you want to add a chance to something, do it after you've specified the input/output, so here it would be a 50% chance of getting 2 uranium dust from IE 16 | potatoRecipe.addItemOutput( * 2); 17 | potatoRecipe.setChance(0.5); 18 | potatoRecipe.build(); -------------------------------------------------------------------------------- /09-modular-machinery-basics/radiation_chamber.json: -------------------------------------------------------------------------------- 1 | { 2 | "registryname": "radiation_chamber", 3 | "localizedname": "Radiation Chamber", 4 | "color": "0d110d", 5 | "parts": [ 6 | { 7 | "x": -1, 8 | "y": 0, 9 | "z": 0, 10 | "elements": [ 11 | "minecraft:stained_glass@7" 12 | ] 13 | }, 14 | { 15 | "x": -1, 16 | "y": 0, 17 | "z": 1, 18 | "elements": [ 19 | "immersiveengineering:storage@5" 20 | ] 21 | }, 22 | { 23 | "x": -2, 24 | "y": 0, 25 | "z": 2, 26 | "elements": [ 27 | "minecraft:stained_glass@7" 28 | ] 29 | }, 30 | { 31 | "x": 0, 32 | "y": 0, 33 | "z": 1, 34 | "elements": [ 35 | "immersiveengineering:storage@5" 36 | ] 37 | }, 38 | { 39 | "x": 1, 40 | "y": 0, 41 | "z": 0, 42 | "elements": [ 43 | "immersiveengineering:storage@8" 44 | ] 45 | }, 46 | { 47 | "x": -2, 48 | "y": 0, 49 | "z": 0, 50 | "elements": [ 51 | "minecraft:stained_glass@7" 52 | ] 53 | }, 54 | { 55 | "x": -1, 56 | "y": 0, 57 | "z": 2, 58 | "elements": [ 59 | "minecraft:stained_glass@7" 60 | ] 61 | }, 62 | { 63 | "x": 1, 64 | "y": 0, 65 | "z": 1, 66 | "elements": "casings_item_input" 67 | }, 68 | { 69 | "x": 0, 70 | "y": 0, 71 | "z": 2, 72 | "elements": [ 73 | "minecraft:stained_glass@7" 74 | ] 75 | }, 76 | { 77 | "x": -3, 78 | "y": 0, 79 | "z": 0, 80 | "elements": [ 81 | "immersiveengineering:storage@8" 82 | ] 83 | }, 84 | { 85 | "x": 1, 86 | "y": 0, 87 | "z": 2, 88 | "elements": [ 89 | "immersiveengineering:storage@8" 90 | ] 91 | }, 92 | { 93 | "x": -3, 94 | "y": 1, 95 | "z": 0, 96 | "elements": [ 97 | "immersiveengineering:metal_decoration0@7" 98 | ] 99 | }, 100 | { 101 | "x": 1, 102 | "y": -1, 103 | "z": 0, 104 | "elements": [ 105 | "immersiveengineering:metal_decoration0@7" 106 | ] 107 | }, 108 | { 109 | "x": -2, 110 | "y": 1, 111 | "z": 0, 112 | "elements": [ 113 | "immersiveengineering:storage@8" 114 | ] 115 | }, 116 | { 117 | "x": -3, 118 | "y": 1, 119 | "z": 1, 120 | "elements": [ 121 | "immersiveengineering:storage@8" 122 | ] 123 | }, 124 | { 125 | "x": 0, 126 | "y": -1, 127 | "z": 0, 128 | "elements": [ 129 | "immersiveengineering:storage@8" 130 | ] 131 | }, 132 | { 133 | "x": -1, 134 | "y": 1, 135 | "z": 0, 136 | "elements": [ 137 | "immersiveengineering:storage@8" 138 | ] 139 | }, 140 | { 141 | "x": -3, 142 | "y": 1, 143 | "z": 2, 144 | "elements": [ 145 | "immersiveengineering:metal_decoration0@7" 146 | ] 147 | }, 148 | { 149 | "x": -1, 150 | "y": -1, 151 | "z": 0, 152 | "elements": [ 153 | "immersiveengineering:storage@8" 154 | ] 155 | }, 156 | { 157 | "x": 0, 158 | "y": 1, 159 | "z": 0, 160 | "elements": [ 161 | "immersiveengineering:storage@8" 162 | ] 163 | }, 164 | { 165 | "x": -3, 166 | "y": -1, 167 | "z": 1, 168 | "elements": [ 169 | "immersiveengineering:storage@8" 170 | ] 171 | }, 172 | { 173 | "x": -2, 174 | "y": 1, 175 | "z": 2, 176 | "elements": [ 177 | "immersiveengineering:storage@8" 178 | ] 179 | }, 180 | { 181 | "x": -2, 182 | "y": -1, 183 | "z": 0, 184 | "elements": [ 185 | "immersiveengineering:storage@8" 186 | ] 187 | }, 188 | { 189 | "x": 1, 190 | "y": 1, 191 | "z": 0, 192 | "elements": [ 193 | "immersiveengineering:metal_decoration0@7" 194 | ] 195 | }, 196 | { 197 | "x": -2, 198 | "y": -1, 199 | "z": 1, 200 | "elements": [ 201 | "immersiveengineering:storage@8" 202 | ] 203 | }, 204 | { 205 | "x": -3, 206 | "y": -1, 207 | "z": 2, 208 | "elements": [ 209 | "immersiveengineering:metal_decoration0@7" 210 | ] 211 | }, 212 | { 213 | "x": -1, 214 | "y": 1, 215 | "z": 2, 216 | "elements": [ 217 | "immersiveengineering:storage@8" 218 | ] 219 | }, 220 | { 221 | "x": 0, 222 | "y": 1, 223 | "z": 2, 224 | "elements": [ 225 | "immersiveengineering:storage@8" 226 | ] 227 | }, 228 | { 229 | "x": 1, 230 | "y": 1, 231 | "z": 1, 232 | "elements": [ 233 | "immersiveengineering:storage@8" 234 | ] 235 | }, 236 | { 237 | "x": -1, 238 | "y": -1, 239 | "z": 1, 240 | "elements": [ 241 | "immersiveengineering:storage@8" 242 | ] 243 | }, 244 | { 245 | "x": -3, 246 | "y": -1, 247 | "z": 0, 248 | "elements": [ 249 | "immersiveengineering:metal_decoration0@7" 250 | ] 251 | }, 252 | { 253 | "x": -2, 254 | "y": -1, 255 | "z": 2, 256 | "elements": [ 257 | "immersiveengineering:storage@8" 258 | ] 259 | }, 260 | { 261 | "x": 1, 262 | "y": 1, 263 | "z": 2, 264 | "elements": [ 265 | "immersiveengineering:metal_decoration0@7" 266 | ] 267 | }, 268 | { 269 | "x": 0, 270 | "y": -1, 271 | "z": 1, 272 | "elements": [ 273 | "immersiveengineering:storage@8" 274 | ] 275 | }, 276 | { 277 | "x": -1, 278 | "y": -1, 279 | "z": 2, 280 | "elements": [ 281 | "immersiveengineering:storage@8" 282 | ] 283 | }, 284 | { 285 | "x": 0, 286 | "y": -1, 287 | "z": 2, 288 | "elements": [ 289 | "immersiveengineering:storage@8" 290 | ] 291 | }, 292 | { 293 | "x": 1, 294 | "y": -1, 295 | "z": 1, 296 | "elements": [ 297 | "immersiveengineering:storage@8" 298 | ] 299 | }, 300 | { 301 | "x": 1, 302 | "y": -1, 303 | "z": 2, 304 | "elements": [ 305 | "immersiveengineering:metal_decoration0@7" 306 | ] 307 | }, 308 | { 309 | "x": -3, 310 | "y": 0, 311 | "z": 1, 312 | "elements": "casings_item_output" 313 | }, 314 | { 315 | "x": -2, 316 | "y": 0, 317 | "z": 1, 318 | "elements": [ 319 | "immersiveengineering:storage@5" 320 | ] 321 | }, 322 | { 323 | "x": -3, 324 | "y": 0, 325 | "z": 2, 326 | "elements": [ 327 | "immersiveengineering:storage@8" 328 | ] 329 | } 330 | ]} -------------------------------------------------------------------------------- /10-pillar-structure-generation/ie_blacksmith.json: -------------------------------------------------------------------------------- 1 | { 2 | "generatorType": "SURFACE", 3 | "minY": -1, 4 | "maxY": -1, 5 | "offsetX": 0, 6 | "offsetY": 1, 7 | "offsetZ": 0, 8 | 9 | "mirrorType": "NONE", 10 | "rotation": null, 11 | "ignoreEntities": false, 12 | 13 | "dimensionSpawns": [0], 14 | "biomeNameSpawns": ["minecraft:plains"], 15 | "biomeTagSpawns": [], 16 | "isDimensionSpawnsBlacklist": false, 17 | "isBiomeNameSpawnsBlacklist": false, 18 | "isBiomeTagSpawnsBlacklist": false, 19 | "generateEverywhere": false, 20 | 21 | "integrity": 1, 22 | "decay": 0, 23 | 24 | "filling": "minecraft:dirt", 25 | "fillingMetadata": 0, 26 | "fillingType": "AIR", 27 | 28 | "rarity": 20 29 | } -------------------------------------------------------------------------------- /10-pillar-structure-generation/notes.md: -------------------------------------------------------------------------------- 1 | # How to make a Minecraft Modpack | Structure generation basics with Pillar 2 | https://www.youtube.com/watch?v=7f3l2z6GO-I 3 | 4 | # Command to dump loottables (Requires loottweaker) 5 | /crafttweaker loottables all 6 | 7 | # Command to generate a sample of the loot table 8 | /setblock ~ ~2 ~ minecraft:chest 1 0 {LootTable:"minecraft:chests/village_blacksmith"} 9 | 10 | # Data block tag to spawn in said structure with the orientation of north 11 | chest north minecraft:chests/village_blacksmith -------------------------------------------------------------------------------- /11-pillar-loot-table/dungeon.json: -------------------------------------------------------------------------------- 1 | { 2 | "pools": [ 3 | { 4 | "name": "main", 5 | "entries": [ 6 | { 7 | "entryName": "minecraft:iron_ingot", 8 | "weight": 2, 9 | "quality": 0, 10 | "type": "item", 11 | "functions": [ 12 | { 13 | "count": { 14 | "min": 2.0, 15 | "max": 5.0 16 | }, 17 | "function": "minecraft:set_count" 18 | } 19 | ], 20 | "name": "minecraft:iron_ingot" 21 | }, 22 | { 23 | "entryName": "minecraft:gold_ingot", 24 | "weight": 1, 25 | "quality": 0, 26 | "type": "loot_table", 27 | "name": "minecraft:chests/village_blacksmith" 28 | } 29 | ], 30 | "rolls": { 31 | "min": 2.0, 32 | "max": 3.0 33 | } 34 | }, 35 | { 36 | "name": "pool2", 37 | "entries": [ 38 | { 39 | "entryName": "thaumcraft:sapling_silverwood", 40 | "weight": 1, 41 | "quality": 0, 42 | "type": "item", 43 | "functions": [ 44 | { 45 | "count": { 46 | "min": 1.0, 47 | "max": 1.0 48 | }, 49 | "function": "minecraft:set_count" 50 | } 51 | ], 52 | "name": "thaumcraft:sapling_silverwood" 53 | } 54 | ], 55 | "rolls": 1.0 56 | } 57 | ] 58 | } -------------------------------------------------------------------------------- /11-pillar-loot-table/notes.md: -------------------------------------------------------------------------------- 1 | ## How to make a Minecraft Modpack | Pillar Part 2 & Loottables 2 | https://www.youtube.com/watch?v=ojM2UH9ApXw 3 | 4 | ### Spawners in structures are added with a structure block on "data" mode then using the spawner tag. 5 | `spawner Skeleton` 6 | `spawner skeleton` 7 | `spawner minecraft:skeleton` 8 | `spawner thermalfoundation:blizz` 9 | 10 | ### Get full entitynames with 11 | `/tellme dump entities` 12 | 13 | ### Loottable documentation 14 | https://minecraft.gamepedia.com/Loot_table 15 | 16 | ### Loottable json 17 | Each loottable consists of pools, there can be multiple pools and unless the pools have 0 rolls or if the pool has a special condition they will all try and generate loot. 18 | The number of rolls define how many times the pool will try and grab an entry from the entries key in the pool, and those rolls will be completely random unless the entries have different weights. 19 | 20 | Entries can either be a type of "loot_table" or type "item", if it's the item type it can be used with functions to set a integer range on how many of the item should drop, aswell as stuff like setting how much extra items will drop per fortune/looting level. -------------------------------------------------------------------------------- /12-loottweaker-and-crt-dropfunctions/script.zs: -------------------------------------------------------------------------------- 1 | import crafttweaker.entity.IEntityDropFunction; 2 | import loottweaker.vanilla.loot.LootTables; 3 | import loottweaker.vanilla.loot.LootTable; 4 | import loottweaker.vanilla.loot.LootPool; 5 | import loottweaker.vanilla.loot.Conditions; 6 | import loottweaker.vanilla.loot.Functions; 7 | 8 | /* 9 | Adding and removing loot from entities(mobs) 10 | https://www.youtube.com/watch?v=Gam65KJ4RDM 11 | */ 12 | 13 | # Removing items from the final droplist 14 | .removeDrop(); 15 | 16 | # Clears all drops from an entity 17 | .clearDrops(); 18 | 19 | # You can use weighted itemstacks instead of using the final "chance" parameter 20 | .addDrop( % 35, 1, 4); 21 | 22 | # You can add player only drops if you don't want something to be dropped in mobfarms. Some killing mechanics "act" as a player though 23 | .addPlayerOnlyDrop( % 50, 1, 2); 24 | 25 | # Pass a callback to addDropFunction for the entity spider, will be called when the onEntityLivingDeathDrops event triggers in minecraft. 26 | .addDropFunction(function(entity, damageSource) { 27 | // A drop function is useful when you want to do custom logic that extends beyond checking if the attacker was a player. 28 | if(true) { 29 | return * 2; 30 | } 31 | } as IEntityDropFunction); 32 | 33 | 34 | # Get the loottable namespaced as thaumcraft:pech and save it as a var 35 | var pechTable = LootTables.getTable("thaumcraft:pech"); 36 | 37 | # Get the main pool from pechTable and then remove one of the entries (By entryName) 38 | var pechMainPool = pechTable.getPool("main_pech"); 39 | pechMainPool.removeEntry("minecraft:gold_nugget"); 40 | 41 | # Adding a separate pool with 1 to 1 rolls 42 | var customPool = pechTable.addPool("loottweaker1", 1, 1, 0, 0); 43 | customPool.addItemEntryHelper(, 1, 1, [ 44 | Functions.setCount(1, 3), 45 | Functions.lootingEnchantBonus(1, 1, 0) 46 | ], []); -------------------------------------------------------------------------------- /13-extendedcrafting/extendedcrafting.zs: -------------------------------------------------------------------------------- 1 | import mods.extendedcrafting.TableCrafting; 2 | import mods.extendedcrafting.EnderCrafting; 3 | import mods.extendedcrafting.CompressionCrafting; 4 | import mods.extendedcrafting.CombinationCrafting; 5 | 6 | /* 7 | Extended Crafting Tutorial 8 | NYR 9 | */ 10 | 11 | # 7x7, so 7 arrays with 7 entries, null for empty slot 12 | TableCrafting.addShaped(, [ 13 | [, , null, null, null, , ], 14 | [, , , , , , ], 15 | [null, , , , , , null], 16 | [, , , , , , ], 17 | [null, , , , , , null], 18 | [, , , , , , ], 19 | [, , null, null, null, , ] 20 | ]); 21 | 22 | # 3x3, so 3 arrays with 3 entries, null for empty slot 23 | EnderCrafting.addShaped(, [ 24 | [null, , null], 25 | [, , ], 26 | [null, , null] 27 | ]); 28 | 29 | # output, inputitem, amount, catalyst, rfCost 30 | CompressionCrafting.addRecipe( 31 | .withTag({EntityTag: {id: "minecraft:chicken"}}), 32 | , 33 | 1000, 34 | , 35 | 100000 36 | ); 37 | 38 | # output, rfCost, rfRate(optional), input, inputItems[] 39 | CombinationCrafting.addRecipe( 40 | , 41 | 100000, 42 | 1000, 43 | , 44 | [ 45 | , 46 | , 47 | , 48 | , 49 | , 50 | 51 | ] 52 | ); -------------------------------------------------------------------------------- /14-real-examples/functioncaller.zs: -------------------------------------------------------------------------------- 1 | import scripts.functions as f; 2 | 3 | #priority -5 4 | 5 | # scripts.functions point to rootfolder/functions.zs 6 | # For this to work this file has to be loaded after the file functions.zs in root 7 | f.doThings("Hello from file functioncaller.zs"); -------------------------------------------------------------------------------- /14-real-examples/functions.zs: -------------------------------------------------------------------------------- 1 | #priority 999 2 | 3 | # This function is intended to use in other files 4 | # Other files can only import this file if this file is loaded before the requesting file. 5 | function doThing(text as string) { 6 | print("Called doThing with: " + text); 7 | } -------------------------------------------------------------------------------- /14-real-examples/oredict-cleaner.zs: -------------------------------------------------------------------------------- 1 | # Call with a list of oreDictEntries the targeted mod should be removed from 2 | # This function will purge the oredict from any items that have a modname that matches modToRemove 3 | function oreDictModRemove(oreDictEntry as IOreDictEntry, modToRemove as string) { 4 | for item in oreDictEntry.items { 5 | if(item.definition.owner == modToRemove) { 6 | oreDictEntry.remove(item); 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /14-real-examples/priority.zs: -------------------------------------------------------------------------------- 1 | /* 2 | -- Loading w/o priority -- 3 | Alphabetical, subfolders treated as files, so all the files in subfolder "b" 4 | would be read before the file "c.zs" in root 5 | */ 6 | 7 | # ex. 8 | # root 9 | # a.zs -> loads 1st 10 | # c.zs -> loads 4th 11 | # b/ 12 | # r.zs -> loads 2nd 13 | # x.zs -> loads 3rd 14 | 15 | # Order -> A R X C 16 | 17 | /* 18 | -- Loading w priority -- 19 | Files with the priority preprocessor gets read first, higher priority gets higher loadprio and 20 | if 2 files share priority they are read alphabetically. 21 | 22 | The files without the priority preprocessor gets a priority of 0, so files with a 23 | negative priority number gets read after the files with no priority. 24 | */ 25 | # ex. 26 | # root 27 | # a.zs (Priority -5) -> loads 4th 28 | # c.zs (Priority 10) -> loads 1st 29 | # b/ 30 | # r.zs -> loads 2nd 31 | # x.zs -> loads 3rd 32 | 33 | # Order -> C R X A 34 | 35 | #priority 999 -------------------------------------------------------------------------------- /14-real-examples/replace-occurences.zs: -------------------------------------------------------------------------------- 1 | /* 2 | File requires Extra Utilities 2 to work 3 | */ 4 | recipes.replaceAllOccurences(, ); -------------------------------------------------------------------------------- /15-dropt/example1.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": [ 3 | { 4 | "match": { 5 | "blocks": { 6 | "blocks": [ 7 | "minecraft:stone:0" 8 | ] 9 | } 10 | }, 11 | "replaceStrategy": "ADD", 12 | "drops": [ 13 | { 14 | "item": { 15 | "items": [ 16 | "minecraft:stone:5", 17 | "minecraft:gravel" 18 | ], 19 | "quantity": { 20 | "fixed": 1 21 | } 22 | } 23 | } 24 | ] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /15-dropt/example2.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": [ 3 | { 4 | "match": { 5 | "drops": { 6 | "drops": [ 7 | "minecraft:dirt" 8 | ] 9 | } 10 | }, 11 | "replaceStrategy": "REPLACE_ALL_IF_SELECTED", 12 | "drops": [ 13 | { 14 | "selector": { 15 | "weight": { 16 | "value": 25 17 | } 18 | }, 19 | "item": { 20 | "items": [ 21 | "minecraft:sapling" 22 | ], 23 | "quantity": { 24 | "fixed": 1 25 | } 26 | } 27 | }, 28 | { 29 | "selector": { 30 | "weight": { 31 | "value": 75 32 | } 33 | } 34 | } 35 | ] 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /15-dropt/example3.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": [ 3 | { 4 | "debug": true, 5 | "match": { 6 | "blocks": { 7 | "blocks": [ 8 | "minecraft:cobblestone" 9 | ] 10 | }, 11 | "harvester": { 12 | "heldItemMainHand": { 13 | "items": [ 14 | "thermalfoundation:tool.hammer_copper:*", 15 | "thermalfoundation:tool.hammer_tin:*", 16 | "thermalfoundation:tool.hammer_silver:*", 17 | "thermalfoundation:tool.hammer_lead:*", 18 | "thermalfoundation:tool.hammer_aluminum:*", 19 | "thermalfoundation:tool.hammer_nickel:*", 20 | "thermalfoundation:tool.hammer_platinum:*", 21 | "thermalfoundation:tool.hammer_steel:*", 22 | "thermalfoundation:tool.hammer_electrum:*", 23 | "thermalfoundation:tool.hammer_invar:*", 24 | "thermalfoundation:tool.hammer_bronze:*", 25 | "thermalfoundation:tool.hammer_constantan:*", 26 | "thermalfoundation:tool.hammer_iron:*", 27 | "thermalfoundation:tool.hammer_diamond:*", 28 | "thermalfoundation:tool.hammer_gold:*" 29 | ] 30 | } 31 | } 32 | }, 33 | "replaceStrategy": "REPLACE_ALL", 34 | "drops": [ 35 | { 36 | "item": { 37 | "items": [ 38 | "minecraft:sand" 39 | ], 40 | "quantity": { 41 | "fixed": 4 42 | } 43 | } 44 | } 45 | ] 46 | } 47 | ] 48 | } -------------------------------------------------------------------------------- /15-dropt/example4.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": [ 3 | { 4 | "match": { 5 | "blocks": { 6 | "blocks": [ 7 | "minecraft:soul_sand" 8 | ] 9 | } 10 | }, 11 | "replaceStrategy": "ADD", 12 | "drops": [ 13 | { 14 | "selector": { 15 | "silktouch": "REQUIRED" 16 | }, 17 | "item": { 18 | "items": [ 19 | "minecraft:ghast_tear" 20 | ], 21 | "quantity": { 22 | "min": 0, 23 | "max": 1 24 | } 25 | } 26 | } 27 | ] 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /16-contenttweaker-material-system/materials.zs: -------------------------------------------------------------------------------- 1 | #loader contenttweaker 2 | 3 | import mods.contenttweaker.Color; 4 | import mods.contenttweaker.MaterialSystem; 5 | 6 | var color = Color.fromHex("72c641") as Color; 7 | 8 | var slimeIron = MaterialSystem.getMaterialBuilder().setName("Slime Iron").setColor(color).build(); 9 | 10 | slimeIron.registerParts(["gear", "plate", "nugget", "ingot", "rod", "dust"] as string[]); 11 | 12 | var molten = slimeIron.registerPart("molten").getData(); 13 | molten.addDataValue("temperature", "400"); 14 | molten.addDataValue("luminosity", "10"); 15 | 16 | var block = slimeIron.registerPart("block").getData(); 17 | block.addDataValue("hardness", "5"); 18 | block.addDataValue("resistance", "30"); 19 | block.addDataValue("harvestTool", "pickaxe"); 20 | 21 | var ore = slimeIron.registerPart("ore").getData(); 22 | ore.addDataValue("variants", "minecraft:stone"); 23 | ore.addDataValue("hardness", "3"); 24 | ore.addDataValue("resistance", "15"); 25 | ore.addDataValue("harvestLevel", "1"); 26 | ore.addDataValue("harvestTool", "pickaxe"); 27 | 28 | var armor = slimeIron.registerPart("armor").getData(); 29 | armor.addDataValue("durability", "522"); 30 | armor.addDataValue("enchantability", "10"); 31 | armor.addDataValue("reduction", "2,5,6,2"); 32 | armor.addDataValue("toughness", "2"); -------------------------------------------------------------------------------- /16-contenttweaker-material-system/te.zs: -------------------------------------------------------------------------------- 1 | import mods.thermalexpansion.RedstoneFurnace; 2 | import mods.thermalexpansion.Crucible; 3 | 4 | RedstoneFurnace.addRecipe(.firstItem, .firstItem, 3600); 5 | 6 | Crucible.addRecipe( * 144, .firstItem, 7200); 7 | Crucible.addRecipe( * 144, .firstItem, 7200); -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/content.zs: -------------------------------------------------------------------------------- 1 | #loader contenttweaker 2 | 3 | import mods.contenttweaker.Color; 4 | import mods.contenttweaker.VanillaFactory; 5 | 6 | var liquidSlime = VanillaFactory.createFluid("liquid_slime", Color.fromHex("66d1ad")); 7 | liquidSlime.register(); 8 | 9 | var lightAsh = VanillaFactory.createBlock("light_ash", ); 10 | lightAsh.setBlockHardness(0.5); 11 | lightAsh.setBlockResistance(2.5); 12 | lightAsh.setToolClass("shovel"); 13 | lightAsh.setToolLevel(0); 14 | lightAsh.setBlockSoundType(); 15 | lightAsh.register(); 16 | 17 | var windupClock = VanillaFactory.createItem("windup_clock"); 18 | windupClock.maxStackSize = 1; 19 | windupClock.register(); -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/blockstates/light_ash.json: -------------------------------------------------------------------------------- 1 | { 2 | "forge_marker": 1, 3 | "defaults": { 4 | "textures": { 5 | "all": "contenttweaker:blocks/light_ash" 6 | }, 7 | "model": "cube_all", 8 | "uvlock": true, 9 | "transform": "forge:default-block" 10 | }, 11 | "variants": { 12 | "normal": [{}], 13 | "inventory": [{}] 14 | } 15 | } -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/blockstates/liquid_slime.json: -------------------------------------------------------------------------------- 1 | { 2 | "forge_marker": 1, 3 | "defaults": { 4 | "model": "forge:fluid", 5 | "custom": { 6 | "fluid": "liquid_slime" 7 | } 8 | }, 9 | "variants": { 10 | "normal": [{}] 11 | } 12 | } -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/lang/en_us.lang: -------------------------------------------------------------------------------- 1 | tile.contenttweaker.light_ash.name=Light Ash 2 | 3 | fluid.liquid_slime=Liquid Slime 4 | 5 | item.contenttweaker.windup_clock.name=Windup Clock -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/models/item/windup_clock.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer0": "contenttweaker:items/windup_clock" 5 | } 6 | } -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/textures/blocks/light_ash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xt9/Modpack-Series-Examples/511e0f3beddf14f6db304bc56d6154bbc5ffc068/17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/textures/blocks/light_ash.png -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/textures/items/windup_clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xt9/Modpack-Series-Examples/511e0f3beddf14f6db304bc56d6154bbc5ffc068/17-contenttweaker-custom-fluids-blocks-items/resources/contenttweaker/textures/items/windup_clock.png -------------------------------------------------------------------------------- /17-contenttweaker-custom-fluids-blocks-items/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | {"pack":{"pack_format":3,"description":"B.A.S.E External Resources"}} -------------------------------------------------------------------------------- /18-contenttweaker-item-click-functions/ct.zs: -------------------------------------------------------------------------------- 1 | #loader contenttweaker 2 | 3 | import mods.contenttweaker.Color; 4 | import mods.contenttweaker.VanillaFactory; 5 | import mods.contenttweaker.IItemRightClick; 6 | import mods.contenttweaker.Commands; 7 | 8 | var liquidSlime = VanillaFactory.createFluid("liquid_slime", Color.fromHex("66d1ad")); 9 | liquidSlime.register(); 10 | 11 | var lightAsh = VanillaFactory.createBlock("light_ash", ); 12 | lightAsh.setBlockHardness(0.5); 13 | lightAsh.setBlockResistance(2.5); 14 | lightAsh.setToolClass("shovel"); 15 | lightAsh.setToolLevel(0); 16 | lightAsh.setBlockSoundType(); 17 | lightAsh.register(); 18 | 19 | var windupClock = VanillaFactory.createItem("windup_clock"); 20 | 21 | windupClock.maxStackSize = 1; 22 | windupClock.itemRightClick = function(stack, world, player, hand) { 23 | # Return early in the function if the world is on the client side. Prevents serious desyncs. 24 | if(world.isRemote()) { return "PASS"; } 25 | 26 | # Get the blockpos that is under the player. 27 | var pos = player.position.asPosition3f(); 28 | pos.y = pos.y - 1; 29 | var blockPosBelowPlayer = pos.asBlockPos(); 30 | 31 | # Check if the blockstate that is under the player matches obsidian. 32 | if(world.getBlockState(blockPosBelowPlayer) == ) { 33 | Commands.call("time add 2000", player, world, false, true); 34 | return "PASS"; 35 | } else { 36 | Commands.call('title @p times 10 30 10', player, world, false, true); 37 | Commands.call("title @p subtitle {\"text\":\"You need to stand on Obsidian to do that...\"}", player, world, false, true); 38 | Commands.call('title @p title {"text":"Hey donkey!","color":"aqua"}', player, world, false, true); 39 | return "FAIL"; 40 | } 41 | }; 42 | windupClock.register(); -------------------------------------------------------------------------------- /19-scavenge/config.cfg: -------------------------------------------------------------------------------- 1 | # Configuration file 2 | 3 | general { 4 | # Selects the files that are being loaded [default: ] 5 | S:LoadingFiles < 6 | regen_block.json 7 | siftable_gravel.json 8 | summon_entity.json 9 | thaumcraft_meteor.json 10 | > 11 | 12 | # Selects the files that load into the NBTStorage [default: ] 13 | S:NBTFiles < 14 | > 15 | B:printDocumentation=false 16 | B:printDocumentationInCurseFormat=false 17 | } 18 | 19 | 20 | plugins { 21 | B:Forge=true 22 | B:Loot=true 23 | B:Player=true 24 | B:Score=true 25 | B:Utils=true 26 | B:World=true 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /19-scavenge/pillar/spawnable.json: -------------------------------------------------------------------------------- 1 | { 2 | "generatorType": "NONE", 3 | "minY": -1, 4 | "maxY": -1, 5 | "offsetX": 0, 6 | "offsetY": 0, 7 | "offsetZ": 0, 8 | "mirrorType": "NONE", 9 | "rotation": "NONE", 10 | "ignoreEntities": false, 11 | "dimensionSpawns": [], 12 | "biomeNameSpawns": [], 13 | "biomeTagSpawns": [], 14 | "isDimensionSpawnsBlacklist": false, 15 | "isBiomeNameSpawnsBlacklist": false, 16 | "isBiomeTagSpawnsBlacklist": false, 17 | "generateEverywhere": false, 18 | "integrity": 1, 19 | "decay": 0, 20 | "filling": "", 21 | "fillingMetadata": 0, 22 | "fillingType": "AIR", 23 | "rarity": 100 24 | } -------------------------------------------------------------------------------- /19-scavenge/pillar/structures/spawnable.nbt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xt9/Modpack-Series-Examples/511e0f3beddf14f6db304bc56d6154bbc5ffc068/19-scavenge/pillar/structures/spawnable.nbt -------------------------------------------------------------------------------- /19-scavenge/regen_block.json: -------------------------------------------------------------------------------- 1 | { 2 | "block_pools": [ 3 | { 4 | "name": "RegenBlock", 5 | "type": { 6 | "type": "block", 7 | "name": "thermalfoundation:rockwool", 8 | "meta": 9 9 | }, 10 | "clicktype": "leftclick", 11 | "properties": [ 12 | { 13 | "type": "require_item", 14 | "name": "minecraft:beetroot" 15 | }, 16 | { 17 | "type": "consume_block" 18 | }, 19 | { 20 | "type": "consume_item", 21 | "amount": 1 22 | }, 23 | { 24 | "type": "spawn_particles", 25 | "name": "dragonbreath", 26 | "amount": 90, 27 | "xOffset": 0.2, 28 | "yOffset": 0.2, 29 | "zOffset": 0.2, 30 | "disableJEI": true 31 | }, 32 | { 33 | "type": "play_sound", 34 | "name": "minecraft:entity.witch.drink", 35 | "category": "master", 36 | "pitch": 1.0, 37 | "disableJEI": true 38 | }, 39 | { 40 | "type": "add_potions", 41 | "potions": [ 42 | { 43 | "name": "minecraft:regeneration", 44 | "duration": 3600, 45 | "amplifier": 3 46 | } 47 | ] 48 | } 49 | ], 50 | "drops": [], 51 | "messages": [ 52 | { 53 | "id": "require_item", 54 | "message": "You must hold a Beetroot!" 55 | }, 56 | { 57 | "id": "consume_block", 58 | "message": "You feel really good. §b(Gained regeneration 4)§r" 59 | } 60 | ] 61 | } 62 | ] 63 | } -------------------------------------------------------------------------------- /19-scavenge/siftable_gravel.json: -------------------------------------------------------------------------------- 1 | { 2 | "block_pools": [ 3 | { 4 | "name": "SiftableGravel", 5 | "type": { 6 | "type": "ore", 7 | "name": "gravel" 8 | }, 9 | "clicktype": "rightclick", 10 | "properties": [ 11 | { 12 | "type": "per_block_limit", 13 | "usage": 1, 14 | "max": 3 15 | }, 16 | { 17 | "type": "require_tool", 18 | "tool": "shovel", 19 | "level": 0 20 | }, 21 | { 22 | "type": "require_sneak" 23 | }, 24 | { 25 | "type": "damage_item", 26 | "amount": 4 27 | }, 28 | { 29 | "type": "swing_hand", 30 | "disableJEI": true 31 | }, 32 | { 33 | "type": "play_sound", 34 | "name": "minecraft:item.shovel.flatten", 35 | "category": "block", 36 | "volume": 0.5, 37 | "disableJEI": true 38 | } 39 | ], 40 | "drops": [ 41 | { 42 | "name": "thaumcraft:cluster", 43 | "meta": 0, 44 | "amount": 2, 45 | "weight": 10 46 | }, 47 | { 48 | "name": "thaumcraft:cluster", 49 | "meta": 1, 50 | "amount": 2, 51 | "weight": 1 52 | }, 53 | { 54 | "name": "thaumcraft:cluster", 55 | "meta": 2, 56 | "amount": 2, 57 | "weight": 6 58 | }, 59 | { 60 | "name": "thaumcraft:cluster", 61 | "meta": 3, 62 | "amount": 2, 63 | "weight": 6 64 | }, 65 | { 66 | "name": "thaumcraft:cluster", 67 | "meta": 4, 68 | "amount": 2, 69 | "weight": 3 70 | }, 71 | { 72 | "name": "thaumcraft:cluster", 73 | "meta": 4, 74 | "amount": 2, 75 | "weight": 3 76 | }, 77 | { 78 | "name": "thaumcraft:cluster", 79 | "meta": 5, 80 | "amount": 2, 81 | "weight": 3 82 | }, 83 | { 84 | "name": "thaumcraft:cluster", 85 | "meta": 6, 86 | "amount": 2, 87 | "weight": 2 88 | }, 89 | { 90 | "name": "thaumcraft:cluster", 91 | "meta": 7, 92 | "amount": 2, 93 | "weight": 2 94 | } 95 | ], 96 | "messages": [ 97 | { 98 | "id": "require_tool", 99 | "message": "You must hold a Shovel to do that!" 100 | }, 101 | { 102 | "id": "require_sneak", 103 | "message": "You must sneak to do that!" 104 | } 105 | ] 106 | } 107 | ] 108 | } -------------------------------------------------------------------------------- /19-scavenge/summon_entity.json: -------------------------------------------------------------------------------- 1 | { 2 | "block_pools": [ 3 | { 4 | "name": "SummonEntity", 5 | "type": { 6 | "type": "block", 7 | "name": "thaumcraft:stone_ancient_glyphed" 8 | }, 9 | "clicktype": "rightclick", 10 | "properties": [ 11 | { 12 | "type": "require_sneak" 13 | }, 14 | { 15 | "type": "require_item", 16 | "name": "thaumcraft:void_seed" 17 | }, 18 | { 19 | "type": "consume_item", 20 | "amount": 1 21 | }, 22 | { 23 | "type": "use_command", 24 | "name": "summon", 25 | "arguments": "thaumcraft:cultistportallesser ~ ~1 ~" 26 | }, 27 | { 28 | "type": "use_command", 29 | "name": "particle", 30 | "arguments": "enchantmenttable ~0 ~1.2 ~0 1 1 1 0.5 75" 31 | }, 32 | { 33 | "type": "play_sound", 34 | "name": "thaumcraft:whispers", 35 | "category": "master", 36 | "volume": 0.3, 37 | "disableJEI": true 38 | } 39 | ], 40 | "drops": [], 41 | "messages": [ 42 | { 43 | "id": "require_sneak", 44 | "message": "You must sneak to do that!" 45 | }, 46 | { 47 | "id": "require_item", 48 | "message": "Requires a §bVoid Seed§r in your Main Hand." 49 | }, 50 | { 51 | "id": "consume_item", 52 | "message": "You stare into the §bVoid§r, the §bVoid§r stares back." 53 | } 54 | ] 55 | } 56 | ] 57 | } -------------------------------------------------------------------------------- /19-scavenge/thaumcraft_meteor.json: -------------------------------------------------------------------------------- 1 | { 2 | "block_pools": [ 3 | { 4 | "name": "MeteorRitual", 5 | "type": { 6 | "type": "block", 7 | "name": "thaumcraft:pedestal_arcane" 8 | }, 9 | "clicktype": "leftclick", 10 | "properties": [ 11 | { 12 | "type": "require_item", 13 | "name": "thaumcraft:caster_basic" 14 | }, 15 | { 16 | "type": "consume_tile_items", 17 | "side": "down", 18 | "items": { 19 | "name": "thaumcraft:salis_mundus" 20 | } 21 | }, 22 | { 23 | "type": "play_sound", 24 | "name": "thaumcraft:craftstart", 25 | "category": "master", 26 | "volume": 0.2, 27 | "pitch": 1.0, 28 | "disableJEI": true 29 | }, 30 | { 31 | "type": "play_sound", 32 | "name": "thaumcraft:evilportal", 33 | "category": "master", 34 | "volume": 0.2, 35 | "disableJEI": true 36 | }, 37 | { 38 | "type": "spawn_particles", 39 | "name": "enchantmenttable", 40 | "amount": 100, 41 | "disableJEI": true 42 | }, 43 | { 44 | "type": "use_command", 45 | "name": "particle", 46 | "arguments": "explode ~0 ~2.5 ~0 1.5 3 1.5 0.2 50" 47 | }, 48 | { 49 | "type": "use_command", 50 | "name": "pillar-spawn", 51 | "arguments": "spawnable ~-1 ~2 ~-1" 52 | } 53 | ], 54 | "drops": [], 55 | "messages": [ 56 | { 57 | "id": "require_item", 58 | "message": "You must hold a Caster's Gauntlet!" 59 | } 60 | ] 61 | } 62 | ] 63 | } -------------------------------------------------------------------------------- /20-gamestages/gated-recipes.zs: -------------------------------------------------------------------------------- 1 | import mods.recipestages.Recipes; 2 | 3 | # Set the stage of a existing recipe 4 | Recipes.setRecipeStage("te_stage", ); 5 | 6 | ## Removing default recipe and adding a new one that is gated 7 | recipes.remove(); 8 | Recipes.addShaped("te_frame", "te_stage", , [ 9 | [, , ], 10 | [, null, ], 11 | [, , ] 12 | ]); 13 | 14 | # Gating entire mods behind a stage. 15 | # Not recommended since it hides large sections of progression from the player in many cases 16 | Recipes.setRecipeStageByMod("te_stage", "thermalexpansion"); -------------------------------------------------------------------------------- /20-gamestages/loaders/gamestage_books.zs: -------------------------------------------------------------------------------- 1 | #loader gamestagebooks 2 | import mods.gamestagebooks.Book; 3 | 4 | /* 5 | Add a book that unlocks stage "te_stage" 6 | With a unlock title of "Thermal Machinery" 7 | The books item name being "Machine Manual" 8 | and the unlock icon being "thermalexpansion:frame" 9 | Colors take plain integers but if you want to use hex colors prefix with "0x" 10 | */ 11 | Book.addBook("te_stage", "Thermal Machinery", "Machine Manual", "thermalexpansion:frame", 0x2271f9); -------------------------------------------------------------------------------- /21-triumph-introduction/triumph/Triumph.txt: -------------------------------------------------------------------------------- 1 | printDefaultConfigs(false) 2 | printDocumentation(false) 3 | removeVanillaAdvancements(true) 4 | removeModAdvancements(true) 5 | keepAdvancements([""]) 6 | removeAdvancements([""]) 7 | allowDragging(true) 8 | useNewParentCompletionCriteriaNames() 9 | pageOrder([""]) -------------------------------------------------------------------------------- /21-triumph-introduction/triumph/functions/triumph/gamestage_functions/thermal.txt: -------------------------------------------------------------------------------- 1 | gamestage silentadd @p te_stage 2 | time set 17000 -------------------------------------------------------------------------------- /21-triumph-introduction/triumph/script/triumph/test/adv2.txt: -------------------------------------------------------------------------------- 1 | setIcon("minecraft:stone") 2 | 3 | setTitle("Getting tha tech") 4 | setDescription("Kill a blizz!") 5 | 6 | setShowToast(false) 7 | setAnnounceToChat(false) 8 | 9 | addParent("triumph:test/root") 10 | alwaysVisible() 11 | hideLines() 12 | 13 | cr = addCriteria("kill_thermal_blizz", "minecraft:player_killed_entity") 14 | cr.setEntityType("thermalfoundation:blizz") 15 | addRewardFunction("triumph:gamestage_functions/thermal") 16 | setPos(0,1) -------------------------------------------------------------------------------- /21-triumph-introduction/triumph/script/triumph/test/root.txt: -------------------------------------------------------------------------------- 1 | setIcon("minecraft:stone") 2 | setTitle("Root Advancement, Will set page title") 3 | 4 | setBackground("minecraft:textures/gui/advancements/backgrounds/stone.png") 5 | setDescription("") 6 | 7 | setHidden(true) 8 | addCriteria("l", "minecraft:location") 9 | setPos(-28,1) -------------------------------------------------------------------------------- /22-contenttweaker-chickens/readme.md: -------------------------------------------------------------------------------- 1 | ### 1. Register chicken 2 | ### 2. Setup langkey 3 | ### 3. Populate entity texture 4 | ### 4. Add Roost textures -------------------------------------------------------------------------------- /22-contenttweaker-chickens/resources/contenttweaker/lang/en_us.lang: -------------------------------------------------------------------------------- 1 | entity.voidmetal_chicken.name=Voidmetal Chicken -------------------------------------------------------------------------------- /22-contenttweaker-chickens/resources/contenttweaker/textures/entities/voidmetal_chicken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xt9/Modpack-Series-Examples/511e0f3beddf14f6db304bc56d6154bbc5ffc068/22-contenttweaker-chickens/resources/contenttweaker/textures/entities/voidmetal_chicken.png -------------------------------------------------------------------------------- /22-contenttweaker-chickens/resources/pack.mcmeta: -------------------------------------------------------------------------------- 1 | {"pack":{"pack_format":3,"description":"B.A.S.E External Resources"}} -------------------------------------------------------------------------------- /22-contenttweaker-chickens/resources/roost/textures/blocks/chicken/voidmetal_chicken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xt9/Modpack-Series-Examples/511e0f3beddf14f6db304bc56d6154bbc5ffc068/22-contenttweaker-chickens/resources/roost/textures/blocks/chicken/voidmetal_chicken.png -------------------------------------------------------------------------------- /22-contenttweaker-chickens/resources/roost/textures/items/chicken/voidmetal_chicken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xt9/Modpack-Series-Examples/511e0f3beddf14f6db304bc56d6154bbc5ffc068/22-contenttweaker-chickens/resources/roost/textures/items/chicken/voidmetal_chicken.png -------------------------------------------------------------------------------- /22-contenttweaker-chickens/scripts/loaders/chickens.zs: -------------------------------------------------------------------------------- 1 | #loader contenttweaker 2 | #modloaded chickens 3 | 4 | import mods.contenttweaker.ChickenFactory; 5 | import mods.contenttweaker.Color; 6 | 7 | var voidChickenColor = Color.fromHex("210042"); 8 | var voidChickenColorFG = Color.fromHex("853ad1"); 9 | 10 | var voidChicken = ChickenFactory.createChicken("voidmetal_chicken", voidChickenColor, * 4); 11 | voidChicken.setForegroundColor(voidChickenColorFG); 12 | voidChicken.register(); -------------------------------------------------------------------------------- /23-twitch-exporter/README.txt: -------------------------------------------------------------------------------- 1 | Requires twitch exporter executable. 2 | Found at: https://github.com/Gaz492/twitch-export-builder -------------------------------------------------------------------------------- /23-twitch-exporter/build.bat: -------------------------------------------------------------------------------- 1 | set PACKNAME=The_Pack_Name 2 | set VERSION=0.1 3 | set FILENAME=%PACKNAME%-%VERSION%.zip 4 | set BUILD_JSON=./general.json 5 | 6 | twitch_export.exe -p %VERSION% -n %PACKNAME% -c %BUILD_JSON% 7 | move %FILENAME% build/ 8 | pause -------------------------------------------------------------------------------- /23-twitch-exporter/build/general.json: -------------------------------------------------------------------------------- 1 | { 2 | "packAuthor": "IterationFunk", 3 | "minecraftVersion": "1.12.2", 4 | "modLoader": "forge", 5 | "modLoaderVersion": "14.23.5.2798", 6 | "includes": ["config", "scripts"] 7 | } --------------------------------------------------------------------------------