Skip to content

Commit

Permalink
Merge pull request #114 from railcraft-reborn/patchouli-test
Browse files Browse the repository at this point in the history
POC multiblock visualization
  • Loading branch information
Edivad99 committed Sep 21, 2023
2 parents 3b41ab6 + 0453ac6 commit b9e54cb
Show file tree
Hide file tree
Showing 22 changed files with 430 additions and 4 deletions.
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ repositories {
url 'https://repo.spongepowered.org/repository/maven-public'
}
maven {
name 'JEI'
name 'JEI/Patchouli'
url 'https://maven.blamejared.com/'
}
}
Expand All @@ -125,6 +125,8 @@ dependencies {
compileOnly fg.deobf("mezz.jei:jei-$minecraft_version-forge-api:$jei_version")
runtimeOnly fg.deobf("mezz.jei:jei-$minecraft_version-forge:$jei_version")

compileOnly fg.deobf("vazkii.patchouli:Patchouli:$patchouli_version:api")
runtimeOnly fg.deobf("vazkii.patchouli:Patchouli:$patchouli_version")
}

test {
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ mod_version=1.0.8
# Deps
mixin_version=0.8.5
jei_version=15.2.0.22
patchouli_version=1.20.1-81-FORGE
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// 1.20.1 2023-08-28T12:04:48.322875 Loot Tables
// 1.20.1 2023-09-14T09:51:29.144073 Loot Tables
ffb5382640dd4a5184faf3bfe33f8c7cdb323def data/railcraft/loot_tables/advancements/patchouli_book.json
2368bf4f9231f79e11c75fe244dd7a820a896d65 data/railcraft/loot_tables/blocks/abandoned_activator_track.json
9097789b3b5eebaff6d62020fecf494c96348ac7 data/railcraft/loot_tables/blocks/abandoned_booster_track.json
fbbe6fc8014502014e25452e15f95dc665234e15 data/railcraft/loot_tables/blocks/abandoned_buffer_stop_track.json
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
// 1.20.1 2023-06-29T09:24:52.48722 Advancements
// 1.20.1 2023-09-14T09:51:29.149702 Advancements
9154f30a7e388b178d4cc4dbcc6d7c27f8ec93c1 data/railcraft/advancements/carts/bed_cart.json
ac1ce09215a6de90b5ba2a6ab1e43e04388b4dfc data/railcraft/advancements/carts/jukebox_cart.json
2855e9f74385393fc5ad37386124e2b01485ab48 data/railcraft/advancements/carts/link_carts.json
26dc92cc86b0682e6ddfc52bcea59f8bfe2f4186 data/railcraft/advancements/carts/locomotive.json
40c818e5c4fb4b1c7415477dbc084956346bdb0d data/railcraft/advancements/carts/root.json
8e14c98b9b80602ae4c47abe73dbcef32e51f8ab data/railcraft/advancements/carts/seasons.json
e62feb9f6f01ea25600603c0e8a5689f7b3a165e data/railcraft/advancements/carts/surprise.json
94ac1f98594404f0a0c4eeda3a75f9d625f17116 data/railcraft/advancements/grant_book_on_first_join.json
320f2ba585565abc10061e6ccd6754398ca63c3f data/railcraft/advancements/tracks/blast_furnace.json
f5d1861c8bea6d0864b5abd4b633ee21088101dd data/railcraft/advancements/tracks/coke_oven.json
b609a05a9f06b985b482a91848e2c4bd296006e2 data/railcraft/advancements/tracks/crusher.json
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"criteria": {
"tick": {
"conditions": {},
"trigger": "minecraft:tick"
}
},
"requirements": [
[
"tick"
]
],
"rewards": {
"loot": [
"railcraft:advancements/patchouli_book"
]
},
"sends_telemetry_event": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"type": "minecraft:advancement_reward",
"pools": [
{
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:set_nbt",
"tag": "{\"patchouli:book\":\"railcraft:guide_book\"}"
}
],
"name": "patchouli:guide_book"
}
],
"rolls": 1.0
}
],
"random_sequence": "railcraft:advancements/patchouli_book"
}
6 changes: 6 additions & 0 deletions src/main/java/mods/railcraft/client/ClientManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import mods.railcraft.client.renderer.ShuntingAuraRenderer;
import mods.railcraft.client.renderer.blockentity.RailcraftBlockEntityRenderers;
import mods.railcraft.client.renderer.entity.RailcraftEntityRenderers;
import mods.railcraft.integrations.patchouli.Patchouli;
import mods.railcraft.particle.RailcraftParticleTypes;
import mods.railcraft.world.inventory.ManualRollingMachineMenu;
import mods.railcraft.world.inventory.RailcraftMenuTypes;
Expand Down Expand Up @@ -77,6 +78,7 @@
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.loading.FMLLoader;
import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo;
import vazkii.patchouli.api.PatchouliAPI;

public class ClientManager {

Expand Down Expand Up @@ -142,6 +144,10 @@ private static void handleClientSetup(FMLClientSetupEvent event) {
MenuScreens.register(RailcraftMenuTypes.TUNNEL_BORE.get(), TunnelBoreScreen::new);
MenuScreens.register(RailcraftMenuTypes.ROUTING_TRACK.get(), RoutingTrackScreen::new);
MenuScreens.register(RailcraftMenuTypes.DUMPING_TRACK.get(), DumpingTrackScreen::new);

if (ModList.get().isLoaded(PatchouliAPI.MOD_ID)) {
Patchouli.setup();
}
}

private static void handleItemColors(RegisterColorHandlersEvent.Item event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ public RailcraftAdvancementProvider(PackOutput output,
CompletableFuture<HolderLookup.Provider> registries, ExistingFileHelper existingFileHelper) {
super(output, registries, existingFileHelper, List.of(
new RailcraftTrackAdvancements(),
new RailcraftCartAdvancements()
new RailcraftCartAdvancements(),
new RailcraftAdvancements()
));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package mods.railcraft.data.advancements;

import java.util.function.Consumer;
import mods.railcraft.Railcraft;
import mods.railcraft.data.loot.packs.RailcraftAdvancementRewardLoot;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.critereon.PlayerTrigger;
import net.minecraft.core.HolderLookup;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.common.data.ForgeAdvancementProvider;

class RailcraftAdvancements implements ForgeAdvancementProvider.AdvancementGenerator {

@Override
public void generate(HolderLookup.Provider registries, Consumer<Advancement> consumer,
ExistingFileHelper fileHelper) {
Advancement.Builder.advancement()
.addCriterion("tick", PlayerTrigger.TriggerInstance.tick())
.rewards(AdvancementRewards.Builder.loot(RailcraftAdvancementRewardLoot.PATCHOULI_BOOK))
.save(consumer, new ResourceLocation(Railcraft.ID, "grant_book_on_first_join"), fileHelper);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import mods.railcraft.data.loot.packs.RailcraftAdvancementRewardLoot;
import mods.railcraft.data.loot.packs.RailcraftBlockLoot;
import mods.railcraft.data.loot.packs.RailcraftChestLoot;
import net.minecraft.data.PackOutput;
Expand All @@ -24,6 +25,8 @@ public RailcraftLootTableProvider(PackOutput packOutput) {
public List<LootTableProvider.SubProviderEntry> getTables() {
return List.of(
new LootTableProvider.SubProviderEntry(RailcraftBlockLoot::new, LootContextParamSets.BLOCK),
new LootTableProvider.SubProviderEntry(
RailcraftAdvancementRewardLoot::new, LootContextParamSets.ADVANCEMENT_REWARD),
new LootTableProvider.SubProviderEntry(RailcraftChestLoot::new, LootContextParamSets.CHEST));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package mods.railcraft.data.loot.packs;

import java.util.function.BiConsumer;
import mods.railcraft.Railcraft;
import net.minecraft.data.loot.LootTableSubProvider;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.storage.loot.LootPool;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.entries.LootItem;
import net.minecraft.world.level.storage.loot.functions.SetNbtFunction;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
import vazkii.patchouli.api.PatchouliAPI;

public class RailcraftAdvancementRewardLoot implements LootTableSubProvider {

public static final ResourceLocation PATCHOULI_BOOK =
new ResourceLocation(Railcraft.ID, "advancements/patchouli_book");

@Override
public void generate(BiConsumer<ResourceLocation, LootTable.Builder> consumer) {
var bookId = new ResourceLocation(Railcraft.ID, "guide_book");
var book = PatchouliAPI.get().getBookStack(bookId).getItem();
var tag = new CompoundTag();
tag.putString("patchouli:book", bookId.toString());
consumer.accept(PATCHOULI_BOOK, LootTable.lootTable()
.withPool(LootPool.lootPool()
.setRolls(ConstantValue.exactly(1))
.add(LootItem.lootTableItem(book).apply(SetNbtFunction.setTag(tag)))
)
);
}
}
149 changes: 149 additions & 0 deletions src/main/java/mods/railcraft/integrations/patchouli/Patchouli.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package mods.railcraft.integrations.patchouli;

import mods.railcraft.Railcraft;
import mods.railcraft.tags.RailcraftTags;
import mods.railcraft.world.level.block.RailcraftBlocks;
import mods.railcraft.world.level.block.steamboiler.FireboxBlock;
import mods.railcraft.world.level.block.steamboiler.SteamBoilerTankBlock;
import mods.railcraft.world.level.block.tank.IronTankGaugeBlock;
import mods.railcraft.world.level.block.tank.IronTankValveBlock;
import mods.railcraft.world.level.block.tank.IronTankWallBlock;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.level.block.Block;
import vazkii.patchouli.api.IStateMatcher;
import vazkii.patchouli.api.PatchouliAPI;

public class Patchouli {

public static void setup() {
var patchouliApi = PatchouliAPI.get();

var crusherBlock = validBlock(patchouliApi, RailcraftBlocks.CRUSHER.get());
var crusher = patchouliApi.makeMultiblock(new String[][]{
{"BB", "BB", "BB"}, //Y:1
{"BB", "0B", "BB"} //Y:0
}, 'B', crusherBlock, '0', crusherBlock
).setSymmetrical(false);
patchouliApi.registerMultiblock(new ResourceLocation(Railcraft.ID, "crusher"), crusher);

var cokeOvenBlock = validBlock(patchouliApi, RailcraftBlocks.COKE_OVEN_BRICKS.get());
var cokeOven = patchouliApi.makeMultiblock(new String[][]{
{"BBB", "BBB", "BBB"}, //Y:2
{"BBB", "BAB", "BBB"}, //Y:1
{"BBB", "B0B", "BBB"} //Y:0
}, 'B', cokeOvenBlock, '0', cokeOvenBlock, 'A', patchouliApi.airMatcher()
).setSymmetrical(true);
patchouliApi.registerMultiblock(new ResourceLocation(Railcraft.ID, "coke_oven"), cokeOven);

var blastFurnaceBlock = validBlock(patchouliApi, RailcraftBlocks.BLAST_FURNACE_BRICKS.get());
var blastFurnace = patchouliApi.makeMultiblock(new String[][]{
{"BBB", "BBB", "BBB"}, //Y:3
{"BBB", "BAB", "BBB"}, //Y:2
{"BBB", "BAB", "BBB"}, //Y:1
{"BBB", "B0B", "BBB"} //Y:0
}, 'B', blastFurnaceBlock, '0', blastFurnaceBlock, 'A', patchouliApi.airMatcher()
).setSymmetrical(true);
patchouliApi
.registerMultiblock(new ResourceLocation(Railcraft.ID, "blast_furnace"), blastFurnace);

var steamTurbineBlock = validBlock(patchouliApi, RailcraftBlocks.STEAM_TURBINE.get());
var steamTurbine = patchouliApi.makeMultiblock(new String[][]{
{"BB", "BB", "BB"}, //Y:1
{"BB", "0B", "BB"} //Y:0
}, 'B', steamTurbineBlock, '0', steamTurbineBlock
).setSymmetrical(false);
patchouliApi
.registerMultiblock(new ResourceLocation(Railcraft.ID, "steam_turbine"), steamTurbine);

var waterTankBlock = validBlock(patchouliApi, RailcraftBlocks.WATER_TANK_SIDING.get());
var waterTank = patchouliApi.makeMultiblock(new String[][]{
{"BB", "BB"}, //Y:1
{"BB", "0B"} //Y:0
}, 'B', waterTankBlock, '0', waterTankBlock
).setSymmetrical(true);
patchouliApi
.registerMultiblock(new ResourceLocation(Railcraft.ID, "water_tank"), waterTank);

var steamOvenBlock = validBlock(patchouliApi, RailcraftBlocks.STEAM_OVEN.get());
var steamOven = patchouliApi.makeMultiblock(new String[][]{
{"BB", "BB"}, //Y:1
{"BB", "0B"} //Y:0
}, 'B', steamOvenBlock, '0', steamOvenBlock
).setSymmetrical(true);
patchouliApi
.registerMultiblock(new ResourceLocation(Railcraft.ID, "steam_oven"), steamOven);

var ironTankWallBlock = validTankWallBlock(patchouliApi,
RailcraftBlocks.IRON_TANK_WALL.variantFor(DyeColor.WHITE).get());
var ironTankGaugeBlock = validTankGaugeBlock(patchouliApi,
RailcraftBlocks.IRON_TANK_GAUGE.variantFor(DyeColor.WHITE).get());
var ironTankValveBlock = validTankValveBlock(patchouliApi,
RailcraftBlocks.IRON_TANK_VALVE.variantFor(DyeColor.WHITE).get());
var tank = patchouliApi.makeMultiblock(new String[][]{
{"BBBBB", "BBBBB", "BBVBB", "BBBBB", "BBBBB"}, //Y:4
{"BGGGB", "GAAAG", "GAAAG", "GAAAG", "BGGGB"}, //Y:3
{"BGGGB", "GAAAG", "GAAAG", "GAAAG", "BGGGB"}, //Y:2
{"BGGGB", "GAAAG", "GAAAG", "GAAAG", "BGGGB"}, //Y:1
{"BBBBB", "BBBBB", "BBVBB", "BBBBB", "BB0BB"} //Y:0
},
'A', patchouliApi.airMatcher(),
'B', ironTankWallBlock,
'G', ironTankGaugeBlock,
'V', ironTankValveBlock,
'0', ironTankWallBlock
).setSymmetrical(true);
patchouliApi
.registerMultiblock(new ResourceLocation(Railcraft.ID, "iron_tank"), tank);

var solidFueledFireboxBlock = validFireboxBlock(patchouliApi,
RailcraftBlocks.SOLID_FUELED_FIREBOX.get());
var boilerTankBlock = validSteamBoilerTankBlock(patchouliApi,
RailcraftBlocks.LOW_PRESSURE_STEAM_BOILER_TANK.get());
var boiler = patchouliApi.makeMultiblock(new String[][]{
{"TT", "TT"}, //Y:3
{"TT", "TT"}, //Y:2
{"TT", "TT"}, //Y:1
{"B0", "BB"} //Y:0
},
'B', solidFueledFireboxBlock,
'T', boilerTankBlock,
'0', solidFueledFireboxBlock
).setSymmetrical(true);
patchouliApi
.registerMultiblock(new ResourceLocation(Railcraft.ID, "boiler"), boiler);
}

private static IStateMatcher validBlock(PatchouliAPI.IPatchouliAPI api, Block block) {
return api.predicateMatcher(block, state -> state.is(block));
}

private static IStateMatcher validTankWallBlock(PatchouliAPI.IPatchouliAPI api,
IronTankWallBlock block) {
return api.predicateMatcher(block, state -> state.is(RailcraftTags.Blocks.IRON_TANK_WALL));
}

private static IStateMatcher validTankGaugeBlock(PatchouliAPI.IPatchouliAPI api,
IronTankGaugeBlock block) {
return api.predicateMatcher(block, state -> state.is(RailcraftTags.Blocks.IRON_TANK_GAUGE));
}

private static IStateMatcher validTankValveBlock(PatchouliAPI.IPatchouliAPI api,
IronTankValveBlock block) {
return api.predicateMatcher(block, state -> state.is(RailcraftTags.Blocks.IRON_TANK_VALVE));
}

private static IStateMatcher validFireboxBlock(PatchouliAPI.IPatchouliAPI api,
FireboxBlock block) {
return api.predicateMatcher(block,
state -> state.is(RailcraftBlocks.FLUID_FUELED_FIREBOX.get()) ||
state.is(RailcraftBlocks.SOLID_FUELED_FIREBOX.get()));
}

private static IStateMatcher validSteamBoilerTankBlock(PatchouliAPI.IPatchouliAPI api,
SteamBoilerTankBlock block) {
return api.predicateMatcher(block,
state -> state.is(RailcraftBlocks.LOW_PRESSURE_STEAM_BOILER_TANK.get()) ||
state.is(RailcraftBlocks.HIGH_PRESSURE_STEAM_BOILER_TANK.get()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "Multi-block structures",
"description": "Everything you need to build multi-block structures",
"icon": "railcraft:coke_oven_bricks"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "Blast Furnace",
"icon": "railcraft:blast_furnace_bricks",
"category": "railcraft:multiblock",
"pages": [
{
"type": "patchouli:text",
"text": "The Blast Furnace is a 3x3x4 brick structure, hollow in the middle, for converting Iron Ingots into Steel Ingots.$(br2)The Oven is built out of 34 special bricks made from Nether Brick, Soul Sand, and Magma Cream. If broken down, it takes 36 Nether Bricks, 36 Soul Sand, and 9 Magma Creams to build one Blast Furnace. Blast Furnaces cannot be built adjacent to each other – there must be at least one tile in between Furnaces."
},
{
"type": "patchouli:multiblock",
"name": "Blast Furnace",
"multiblock_id": "railcraft:blast_furnace"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "Coke Oven",
"icon": "railcraft:coke_oven_bricks",
"category": "railcraft:multiblock",
"pages": [
{
"type": "patchouli:text",
"text": "The Coke Oven is a 3x3x3 brick structure, hollow in the middle, for converting Coal into Coal Coke or Wood into Charcoal and producing Creosote Oil as a byproduct.$(br2)The Oven is built out of 26 special bricks made from Brick and Sand. If broken down, it takes 104 Clay and 130 Sand to build one Coke Oven. They cannot be built adjacent to each other, there must be at least one tile in between ovens."
},
{
"type": "patchouli:multiblock",
"name": "Coke Oven",
"multiblock_id": "railcraft:coke_oven"
},
{
"type": "patchouli:text",
"text": "The Coal Oven can hold 64,000 units of Creosote Oil. which can be extracted and kept in either Buckets or Glass Bottles. Each Bucket or Bottle can hold 1,000 units of Creosote Oil. The filled Buckets will not stack. The filled Bottles will.$(br2)Converting Coal into Coke is a slow process. You will probably want to build several Ovens if you plan to make a lot rails."
}
]
}

0 comments on commit b9e54cb

Please sign in to comment.