diff --git a/gradle.properties b/gradle.properties index 7d017dcf9a..44686c633d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,8 +18,8 @@ minecraft_version=1.21.1 # as they do not follow standard versioning conventions. minecraft_version_range=[1.21.1, 1.22) # The Neo version must agree with the Minecraft version to get a valid artifact -neo_version=21.1.179 -mdg_version=2.0.93 +neo_version=21.1.213 +mdg_version=2.0.115 # The Neo version range can use any version of Neo as bounds neo_version_range=[21.1.0,) # The loader version range can only use the major version of FML as bounds diff --git a/notes.txt b/notes.txt index 69444737db..413a10b9d6 100644 --- a/notes.txt +++ b/notes.txt @@ -9,7 +9,8 @@ Altar - datapackable structure, by default looking at tags (bloodmagic:altar/runes, bloodmagic:altar/tN_capstones, bloodmagic:altar/pillars) with the pillars tag being special in that when its empty it just requires solid blocks - should be working exactly like the old one from user perspective - the blocks to enable redstone pulse on crafting and reading the soul network instead of the altar fill level are based on the block tags bloodmagic:altar/pulse_on_crafting and bloodmagic:altar/soul_network_comparator -- now has its 2 in/out put tanks visible for jade +- now has its 2 in/out put tanks visible for jade (as well as the main tank) +- there is a 5 second grace period when swapping altar structure before the tanks get capped at current max capacity instead of it happening immediately Blood Tank - stores any fluid (emits the same light level the inserted fluid does) @@ -51,4 +52,6 @@ Tartaric gems Training Bracelet - will allow at most the minimum exp required for the selected level for each of the set tomes - in deny others mode all "unknown" upgrades (the ones not set) will return the limit of 0 meaning nothing else can be trained - - in allow others mode all "unknown" upgrades will return the limit of -1 signifying that there is no limit set and can be trained as normal \ No newline at end of file + - in allow others mode all "unknown" upgrades will return the limit of -1 signifying that there is no limit set and can be trained as normal + +Transfer Nodes diff --git a/src/datagen/java/wayoftime/bloodmagic/Datagen.java b/src/datagen/java/wayoftime/bloodmagic/Datagen.java index d1900f85ac..19dc578cb7 100644 --- a/src/datagen/java/wayoftime/bloodmagic/Datagen.java +++ b/src/datagen/java/wayoftime/bloodmagic/Datagen.java @@ -15,7 +15,7 @@ import wayoftime.bloodmagic.datagen.content.LivingUpgrades; import wayoftime.bloodmagic.datagen.provider.*; -@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) +@EventBusSubscriber public class Datagen { @SubscribeEvent diff --git a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMBlockstateProvider.java b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMBlockstateProvider.java index 3fdd68512a..2320b51ac9 100644 --- a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMBlockstateProvider.java +++ b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMBlockstateProvider.java @@ -3,13 +3,16 @@ import net.minecraft.core.Direction; import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.client.model.generators.BlockStateProvider; import net.neoforged.neoforge.client.model.generators.ModelFile; +import net.neoforged.neoforge.client.model.generators.MultiPartBlockStateBuilder; import net.neoforged.neoforge.client.model.generators.VariantBlockStateBuilder; import net.neoforged.neoforge.common.data.ExistingFileHelper; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.common.block.ARCBlock; import wayoftime.bloodmagic.common.block.BMBlocks; +import wayoftime.bloodmagic.common.block.RoutingNodeBlock; import wayoftime.bloodmagic.common.datacomponent.EnumWillType; public class BMBlockstateProvider extends BlockStateProvider { @@ -23,6 +26,31 @@ protected void registerStatesAndModels() { simpleBlockWithItem(block.get(), cubeAll(block.get())); }); + buildArc(); + + buildRoutingNode(BMBlocks.ROUTING_NODE.block().get(), ""); + buildRoutingNode(BMBlocks.MASTER_NODE.block().get(), "_master"); + buildRoutingNode(BMBlocks.INPUT_ROUTING_NODE.block().get(), "_input"); + buildRoutingNode(BMBlocks.OUTPUT_ROUTING_NODE.block().get(), "_output"); + } + + private void buildRoutingNode(Block node, String type) { + MultiPartBlockStateBuilder builder = getMultipartBuilder(node); + + ModelFile base = models().getExistingFile(bm("block/routing_node_base" + type)); + ModelFile core = models().getExistingFile(bm("block/routing_node_core" + type)); + + builder.part().modelFile(core).addModel().end(); + + builder.part().modelFile(base).addModel().condition(RoutingNodeBlock.DOWN, true).end(); + builder.part().modelFile(base).rotationX(180).addModel().condition(RoutingNodeBlock.UP, true).end(); + builder.part().modelFile(base).rotationX(270).addModel().condition(RoutingNodeBlock.NORTH, true).end(); + builder.part().modelFile(base).rotationX(90).addModel().condition(RoutingNodeBlock.SOUTH, true).end(); + builder.part().modelFile(base).rotationY(90).rotationX(90).addModel().condition(RoutingNodeBlock.WEST, true).end(); + builder.part().modelFile(base).rotationY(90).rotationX(270).addModel().condition(RoutingNodeBlock.EAST, true).end(); + } + + private void buildArc() { VariantBlockStateBuilder builder = getVariantBuilder(BMBlocks.ARC_BLOCK.block().get()); String bottom = "block/arc_bottom"; String lit = "_lit"; diff --git a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMItemTagProvider.java b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMItemTagProvider.java index 21c9939e83..25a6bab021 100644 --- a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMItemTagProvider.java +++ b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMItemTagProvider.java @@ -6,6 +6,7 @@ import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.common.data.ExistingFileHelper; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BMBlocks; import wayoftime.bloodmagic.common.item.BMItems; import wayoftime.bloodmagic.common.tag.BMTags; @@ -48,5 +49,28 @@ protected void addTags(HolderLookup.Provider provider) { .addTag(BMTags.Items.CUTTING_FLUIDS) .addTag(BMTags.Items.HYDRATION) .addTag(BMTags.Items.ARC_FURNACE); + + tag(BMTags.Items.SOUL_GEM) + .add(BMItems.SOUL_GEM_PETTY.get()) + .add(BMItems.SOUL_GEM_LESSER.get()) + .add(BMItems.SOUL_GEM_COMMON.get()) + .add(BMItems.SOUL_GEM_GREATER.get()) + .add(BMItems.SOUL_GEM_GRAND.get()); + + tag(BMTags.Items.NODE_DEBUGGER) + .add(BMItems.NODE_ROUTER.get()) + .add(BMBlocks.MASTER_NODE.asItem(), BMBlocks.ROUTING_NODE.asItem(), BMBlocks.INPUT_ROUTING_NODE.asItem(), BMBlocks.OUTPUT_ROUTING_NODE.asItem()) + .addTag(BMTags.Items.SOUL_GEM); + + tag(BMTags.Items.TAG_FILTER) + .add(BMItems.TAG_FILTER.get()); + + tag(BMTags.Items.ENCHANT_FILTER) + .add(BMItems.ENCHANT_FILTER.get()); + + tag(BMTags.Items.FILTERS) + .addTag(BMTags.Items.TAG_FILTER) + .addTag(BMTags.Items.ENCHANT_FILTER) + .add(BMItems.STANDARD_FILTER.get(), BMItems.MOD_FILTER.get(), BMItems.COMPOSITE_FILTER.get()); } } diff --git a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMLanguageProvider.java b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMLanguageProvider.java index 414876dece..73eb563b50 100644 --- a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMLanguageProvider.java +++ b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/BMLanguageProvider.java @@ -139,6 +139,30 @@ protected void addTranslations() { add("chat.bloodmagic.living_upgrade.level_up", "%s has levelled up to %s!"); LivingUpgrades.translations(this::add); + + addTooltip("stored_position", "Stored: %s in %s"); + + add(BMBlocks.ROUTING_NODE, "Routing Node"); + add(BMBlocks.MASTER_NODE, "Master Routing Node"); + add(BMBlocks.INPUT_ROUTING_NODE, "Input Routing Node"); + add(BMBlocks.OUTPUT_ROUTING_NODE, "Output Routing Node"); + add(BMItems.NODE_ROUTER.get(), "Node Router"); + + add(BMItems.NODE_AMOUNT_UPGRADE.get(), "Basic Routing Logic Upgrade"); + add(BMItems.NODE_SPEED_UPGRADE.get(), "Basic Routing Speed Upgrade"); + + add("gui.bloodmagic.node.master", "Master Routing Node"); + add("gui.bloodmagic.node.input", "Input Routing Node"); + add("gui.bloodmagic.node.output", "Output Routing Node"); + + addTooltip("router.connected", "Successfully connected nodes!"); + addTooltip("router.pos_cleared", "Cleared stored position!"); + addTooltip("router.pos_set", "Stored %s!"); + + addTooltip("router.master_child", "Cannot add Master as a child node!"); + addTooltip("router.no_node", "Block at %s is not a Routing Node!"); + addTooltip("router.distance", "Nodes are too far apart, max 16 blocks"); + addTooltip("router.same", "Cannot link node to itself!"); } public void addCommand(String key, String value) { diff --git a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/ProviderHelper.java b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/ProviderHelper.java index ae36ead71a..9d911cb7be 100644 --- a/src/datagen/java/wayoftime/bloodmagic/datagen/provider/ProviderHelper.java +++ b/src/datagen/java/wayoftime/bloodmagic/datagen/provider/ProviderHelper.java @@ -25,7 +25,6 @@ public GatherDataEvent.DataProviderFromOutputLookup> tagsFor protected void addTags(HolderLookup.Provider provider) { adder.accept(this::tag); } - }; } } diff --git a/src/generated/resources/assets/bloodmagic/blockstates/hellforged_block.json b/src/generated/resources/assets/bloodmagic/blockstates/hellforged_block.json deleted file mode 100644 index 724de93110..0000000000 --- a/src/generated/resources/assets/bloodmagic/blockstates/hellforged_block.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "bloodmagic:block/hellforged_block" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/hellforged_block_default.json b/src/generated/resources/assets/bloodmagic/blockstates/hellforged_block_default.json new file mode 100644 index 0000000000..edae94248b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/hellforged_block_default.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/hellforged_block_default" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/routing_node.json b/src/generated/resources/assets/bloodmagic/blockstates/routing_node.json new file mode 100644 index 0000000000..f03a84c340 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/routing_node.json @@ -0,0 +1,64 @@ +{ + "multipart": [ + { + "apply": { + "model": "bloodmagic:block/routing_node_core" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base" + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base", + "x": 180 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base", + "x": 270 + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base", + "x": 90 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base", + "x": 90, + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base", + "x": 270, + "y": 90 + }, + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/routing_node_input.json b/src/generated/resources/assets/bloodmagic/blockstates/routing_node_input.json new file mode 100644 index 0000000000..b0b650492e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/routing_node_input.json @@ -0,0 +1,64 @@ +{ + "multipart": [ + { + "apply": { + "model": "bloodmagic:block/routing_node_core_input" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_input" + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_input", + "x": 180 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_input", + "x": 270 + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_input", + "x": 90 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_input", + "x": 90, + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_input", + "x": 270, + "y": 90 + }, + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/routing_node_master.json b/src/generated/resources/assets/bloodmagic/blockstates/routing_node_master.json new file mode 100644 index 0000000000..3ffae37e61 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/routing_node_master.json @@ -0,0 +1,64 @@ +{ + "multipart": [ + { + "apply": { + "model": "bloodmagic:block/routing_node_core_master" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_master" + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_master", + "x": 180 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_master", + "x": 270 + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_master", + "x": 90 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_master", + "x": 90, + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_master", + "x": 270, + "y": 90 + }, + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/routing_node_output.json b/src/generated/resources/assets/bloodmagic/blockstates/routing_node_output.json new file mode 100644 index 0000000000..88cfee2a15 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/routing_node_output.json @@ -0,0 +1,64 @@ +{ + "multipart": [ + { + "apply": { + "model": "bloodmagic:block/routing_node_core_output" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_output" + }, + "when": { + "down": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_output", + "x": 180 + }, + "when": { + "up": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_output", + "x": 270 + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_output", + "x": 90 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_output", + "x": 90, + "y": 90 + }, + "when": { + "west": "true" + } + }, + { + "apply": { + "model": "bloodmagic:block/routing_node_base_output", + "x": 270, + "y": 90 + }, + "when": { + "east": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json index de191142c0..0e2ba7f1d5 100644 --- a/src/generated/resources/assets/bloodmagic/lang/en_us.json +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -8,9 +8,13 @@ "block.bloodmagic.crystal_cluster_brick": "Crystal Cluster Brick", "block.bloodmagic.doubt_block": "Liquid Doubt", "block.bloodmagic.hellfire_forge": "Hellfire Forge", - "block.bloodmagic.hellforged_block": "Hellforged Block", + "block.bloodmagic.hellforged_block_default": "Hellforged Block", "block.bloodmagic.life_essence_block": "Life Essence", "block.bloodmagic.living_station": "Living Upgrade Station", + "block.bloodmagic.routing_node": "Routing Node", + "block.bloodmagic.routing_node_input": "Input Routing Node", + "block.bloodmagic.routing_node_master": "Master Routing Node", + "block.bloodmagic.routing_node_output": "Output Routing Node", "block.bloodmagic.rune_2_acceleration": "Reinforced Acceleration Rune", "block.bloodmagic.rune_2_capacity": "Reinforced Capacity Rune", "block.bloodmagic.rune_2_capacity_augmented": "Reinforced Augmented Capacity Rune", @@ -44,6 +48,9 @@ "commands.bloodmagic.upgrade.set": "Set %s to %s exp for %s", "fluid.bloodmagic.doubt_fluid": "Liquid Doubt", "fluid.bloodmagic.life_essence_fluid": "Life Essence", + "gui.bloodmagic.node.input": "Input Routing Node", + "gui.bloodmagic.node.master": "Master Routing Node", + "gui.bloodmagic.node.output": "Output Routing Node", "item.bloodmagic.blood_orb_apprentice": "Apprentice Blood Orb", "item.bloodmagic.blood_orb_archmage": "Archmage Blood Orb", "item.bloodmagic.blood_orb_magician": "Magician Blood Orb", @@ -57,6 +64,9 @@ "item.bloodmagic.living_leggings": "Living Leggings", "item.bloodmagic.living_plate": "Living Plate", "item.bloodmagic.living_plate.dead": "Formerly Living Plate", + "item.bloodmagic.node_router": "Node Router", + "item.bloodmagic.node_upgrade_amount": "Basic Routing Logic Upgrade", + "item.bloodmagic.node_upgrade_speed": "Basic Routing Speed Upgrade", "item.bloodmagic.raw_will": "Raw Will", "item.bloodmagic.sacrificial_dagger": "Sacrificial Dagger", "item.bloodmagic.soul_gem_common": "Common Tartaric Gem", @@ -139,6 +149,13 @@ "tooltip.bloodmagic.fluid_content_empty": "Empty", "tooltip.bloodmagic.has_living_stats": "Theres some kind of notes, but you cant decipher them", "tooltip.bloodmagic.no_owner": "Not bound yet", + "tooltip.bloodmagic.router.connected": "Successfully connected nodes!", + "tooltip.bloodmagic.router.distance": "Nodes are too far apart, max 16 blocks", + "tooltip.bloodmagic.router.master_child": "Cannot add Master as a child node!", + "tooltip.bloodmagic.router.no_node": "Block at %s is not a Routing Node!", + "tooltip.bloodmagic.router.pos_cleared": "Cleared stored position!", + "tooltip.bloodmagic.router.pos_set": "Stored %s!", + "tooltip.bloodmagic.router.same": "Cannot link node to itself!", "tooltip.bloodmagic.save_for_decoration": "Save for Decoration", "tooltip.bloodmagic.scrap": "Contained Upgrade Points: %s", "tooltip.bloodmagic.soul_gem.soul_gem_common": "A gem used to contain more will.", @@ -146,6 +163,7 @@ "tooltip.bloodmagic.soul_gem.soul_gem_greater": "A gem used to contain a greater amount of will.", "tooltip.bloodmagic.soul_gem.soul_gem_lesser": "A gem used to contain some will.", "tooltip.bloodmagic.soul_gem.soul_gem_petty": "A gem used to contain a little will.", + "tooltip.bloodmagic.stored_position": "Stored: %s in %s", "tooltip.bloodmagic.upgrade_points": "Upgrade Points: %s/%s", "tooltip.bloodmagic.will": "Will Quality: %s", "trainer.bloodmagic.allow_others": "Allow Others", diff --git a/src/generated/resources/assets/bloodmagic/models/block/hellforged_block.json b/src/generated/resources/assets/bloodmagic/models/block/hellforged_block_default.json similarity index 53% rename from src/generated/resources/assets/bloodmagic/models/block/hellforged_block.json rename to src/generated/resources/assets/bloodmagic/models/block/hellforged_block_default.json index 1a385e60e6..f6cb9ed7ad 100644 --- a/src/generated/resources/assets/bloodmagic/models/block/hellforged_block.json +++ b/src/generated/resources/assets/bloodmagic/models/block/hellforged_block_default.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "bloodmagic:block/hellforged_block" + "all": "bloodmagic:block/hellforged_block_default" } } \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/filter_composite.json b/src/generated/resources/assets/bloodmagic/models/item/filter_composite.json new file mode 100644 index 0000000000..74bf92cf9b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/filter_composite.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/filter_composite" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/filter_enchant.json b/src/generated/resources/assets/bloodmagic/models/item/filter_enchant.json new file mode 100644 index 0000000000..3d9091461d --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/filter_enchant.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/filter_enchant" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/filter_mod.json b/src/generated/resources/assets/bloodmagic/models/item/filter_mod.json new file mode 100644 index 0000000000..1c81149037 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/filter_mod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/filter_mod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/filter_standard.json b/src/generated/resources/assets/bloodmagic/models/item/filter_standard.json new file mode 100644 index 0000000000..76b7c9546f --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/filter_standard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/filter_standard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/filter_tag.json b/src/generated/resources/assets/bloodmagic/models/item/filter_tag.json new file mode 100644 index 0000000000..0118d346b4 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/filter_tag.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/filter_tag" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/hellforged_block.json b/src/generated/resources/assets/bloodmagic/models/item/hellforged_block.json deleted file mode 100644 index d323830c9c..0000000000 --- a/src/generated/resources/assets/bloodmagic/models/item/hellforged_block.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "bloodmagic:block/hellforged_block" -} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/hellforged_block_default.json b/src/generated/resources/assets/bloodmagic/models/item/hellforged_block_default.json new file mode 100644 index 0000000000..e08fa33ce9 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/hellforged_block_default.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/hellforged_block_default" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/node_router.json b/src/generated/resources/assets/bloodmagic/models/item/node_router.json new file mode 100644 index 0000000000..d15ee8f177 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/node_router.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/node_router" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/node_upgrade_amount.json b/src/generated/resources/assets/bloodmagic/models/item/node_upgrade_amount.json new file mode 100644 index 0000000000..15bf6c90f1 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/node_upgrade_amount.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/node_upgrade_amount" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/node_upgrade_speed.json b/src/generated/resources/assets/bloodmagic/models/item/node_upgrade_speed.json new file mode 100644 index 0000000000..3f7fcb757a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/node_upgrade_speed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "bloodmagic:item/node_upgrade_speed" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/bloodmagic/living_upgrades/exp/arrow_protect.json b/src/generated/resources/data/bloodmagic/bloodmagic/living_upgrades/exp/arrow_protect.json index 3fc7b04a7a..a67f2773de 100644 --- a/src/generated/resources/data/bloodmagic/bloodmagic/living_upgrades/exp/arrow_protect.json +++ b/src/generated/resources/data/bloodmagic/bloodmagic/living_upgrades/exp/arrow_protect.json @@ -26,11 +26,7 @@ ] }, "levels": { - "exp_to_level": { - "1": 1 - }, - "level_to_cost": { - "1": 0 - } + "exp_to_level": {}, + "level_to_cost": {} } } \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_table/blocks/hellforged_block.json b/src/generated/resources/data/bloodmagic/loot_table/blocks/hellforged_block_default.json similarity index 70% rename from src/generated/resources/data/bloodmagic/loot_table/blocks/hellforged_block.json rename to src/generated/resources/data/bloodmagic/loot_table/blocks/hellforged_block_default.json index 19c00defe9..d5050389fa 100644 --- a/src/generated/resources/data/bloodmagic/loot_table/blocks/hellforged_block.json +++ b/src/generated/resources/data/bloodmagic/loot_table/blocks/hellforged_block_default.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "bloodmagic:hellforged_block" + "name": "bloodmagic:hellforged_block_default" } ], "rolls": 1.0 } ], - "random_sequence": "bloodmagic:blocks/hellforged_block" + "random_sequence": "bloodmagic:blocks/hellforged_block_default" } \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/block/altar/t5_capstones.json b/src/generated/resources/data/bloodmagic/tags/block/altar/t5_capstones.json index a936971747..81e804e270 100644 --- a/src/generated/resources/data/bloodmagic/tags/block/altar/t5_capstones.json +++ b/src/generated/resources/data/bloodmagic/tags/block/altar/t5_capstones.json @@ -1,5 +1,5 @@ { "values": [ - "bloodmagic:hellforged_block" + "bloodmagic:hellforged_block_default" ] } \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/item/node_debugger.json b/src/generated/resources/data/bloodmagic/tags/item/node_debugger.json new file mode 100644 index 0000000000..f4c1010004 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/tags/item/node_debugger.json @@ -0,0 +1,10 @@ +{ + "values": [ + "bloodmagic:node_router", + "bloodmagic:routing_node_master", + "bloodmagic:routing_node", + "bloodmagic:routing_node_input", + "bloodmagic:routing_node_output", + "#bloodmagic:soul_gems" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/item/routing_filter.json b/src/generated/resources/data/bloodmagic/tags/item/routing_filter.json new file mode 100644 index 0000000000..44c13cba68 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/tags/item/routing_filter.json @@ -0,0 +1,9 @@ +{ + "values": [ + "#bloodmagic:routing_filter/tag", + "#bloodmagic:routing_filter/enchant", + "bloodmagic:filter_standard", + "bloodmagic:filter_mod", + "bloodmagic:filter_composite" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/item/routing_filter/enchant.json b/src/generated/resources/data/bloodmagic/tags/item/routing_filter/enchant.json new file mode 100644 index 0000000000..4a9b06d85c --- /dev/null +++ b/src/generated/resources/data/bloodmagic/tags/item/routing_filter/enchant.json @@ -0,0 +1,5 @@ +{ + "values": [ + "bloodmagic:filter_enchant" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/item/routing_filter/tag.json b/src/generated/resources/data/bloodmagic/tags/item/routing_filter/tag.json new file mode 100644 index 0000000000..1ba02e6bd9 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/tags/item/routing_filter/tag.json @@ -0,0 +1,5 @@ +{ + "values": [ + "bloodmagic:filter_tag" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/tags/item/soul_gems.json b/src/generated/resources/data/bloodmagic/tags/item/soul_gems.json new file mode 100644 index 0000000000..01db0b4797 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/tags/item/soul_gems.json @@ -0,0 +1,9 @@ +{ + "values": [ + "bloodmagic:soul_gem_petty", + "bloodmagic:soul_gem_lesser", + "bloodmagic:soul_gem_common", + "bloodmagic:soul_gem_greater", + "bloodmagic:soul_gem_grand" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/block/storage_blocks/hellforged.json b/src/generated/resources/data/c/tags/block/storage_blocks/hellforged.json index a936971747..81e804e270 100644 --- a/src/generated/resources/data/c/tags/block/storage_blocks/hellforged.json +++ b/src/generated/resources/data/c/tags/block/storage_blocks/hellforged.json @@ -1,5 +1,5 @@ { "values": [ - "bloodmagic:hellforged_block" + "bloodmagic:hellforged_block_default" ] } \ No newline at end of file diff --git a/src/generated/resources/data/c/tags/item/storage_blocks/hellforged.json b/src/generated/resources/data/c/tags/item/storage_blocks/hellforged.json index a936971747..81e804e270 100644 --- a/src/generated/resources/data/c/tags/item/storage_blocks/hellforged.json +++ b/src/generated/resources/data/c/tags/item/storage_blocks/hellforged.json @@ -1,5 +1,5 @@ { "values": [ - "bloodmagic:hellforged_block" + "bloodmagic:hellforged_block_default" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/beacon_base_blocks.json b/src/generated/resources/data/minecraft/tags/block/beacon_base_blocks.json index a936971747..81e804e270 100644 --- a/src/generated/resources/data/minecraft/tags/block/beacon_base_blocks.json +++ b/src/generated/resources/data/minecraft/tags/block/beacon_base_blocks.json @@ -1,5 +1,5 @@ { "values": [ - "bloodmagic:hellforged_block" + "bloodmagic:hellforged_block_default" ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index 00086dd83d..5d11f5b997 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -4,7 +4,7 @@ "bloodmagic:blood_tank", "bloodmagic:bloodstone", "bloodmagic:bloodstone_brick", - "bloodmagic:hellforged_block", + "bloodmagic:hellforged_block_default", "bloodmagic:crystal_cluster", "bloodmagic:crystal_cluster_brick", "bloodmagic:rune_blank", diff --git a/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json b/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json index a936971747..81e804e270 100644 --- a/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json +++ b/src/generated/resources/data/minecraft/tags/block/needs_iron_tool.json @@ -1,5 +1,5 @@ { "values": [ - "bloodmagic:hellforged_block" + "bloodmagic:hellforged_block_default" ] } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/BloodMagic.java b/src/main/java/wayoftime/bloodmagic/BloodMagic.java index cd6a0d2788..4fa038ded8 100644 --- a/src/main/java/wayoftime/bloodmagic/BloodMagic.java +++ b/src/main/java/wayoftime/bloodmagic/BloodMagic.java @@ -22,6 +22,7 @@ import wayoftime.bloodmagic.common.fluid.BMFluids; import wayoftime.bloodmagic.common.item.BMItems; import wayoftime.bloodmagic.common.item.BMMaterialsAndTiers; +import wayoftime.bloodmagic.common.network.BMPackets; import wayoftime.bloodmagic.common.recipe.BMRecipes; import wayoftime.bloodmagic.common.registry.BMRegistries; import wayoftime.bloodmagic.common.structure.BMMultiblock; @@ -37,10 +38,17 @@ public class BloodMagic { public static final ServerConfig SERVER_CONFIG; private static final ModConfigSpec SERVER_CONFIG_SPEC; + public static final ClientConfig CLIENT_CONFIG; + private static final ModConfigSpec CLIENT_CONFIG_SPEC; + static { - Pair pair = new ModConfigSpec.Builder().configure(ServerConfig::new); - SERVER_CONFIG = pair.getLeft(); - SERVER_CONFIG_SPEC = pair.getRight(); + Pair serverConf = new ModConfigSpec.Builder().configure(ServerConfig::new); + SERVER_CONFIG = serverConf.getLeft(); + SERVER_CONFIG_SPEC = serverConf.getRight(); + + Pair clientConf = new ModConfigSpec.Builder().configure(ClientConfig::new); + CLIENT_CONFIG = clientConf.getLeft(); + CLIENT_CONFIG_SPEC = clientConf.getRight(); } public BloodMagic(IEventBus modBus, ModContainer container) { @@ -52,6 +60,7 @@ public BloodMagic(IEventBus modBus, ModContainer container) { BMMaterialsAndTiers.register(modBus); BMItems.register(modBus); modBus.addListener(BMDataMaps::register); + modBus.addListener(BMPackets::register); BMDataAttachments.register(modBus); BMAttributes.register(modBus); BMRecipes.register(modBus); @@ -60,6 +69,7 @@ public BloodMagic(IEventBus modBus, ModContainer container) { BMTabs.register(modBus); container.registerConfig(ModConfig.Type.SERVER, SERVER_CONFIG_SPEC); + container.registerConfig(ModConfig.Type.CLIENT, CLIENT_CONFIG_SPEC); NeoForge.EVENT_BUS.addListener(BMCommands::register); } diff --git a/src/main/java/wayoftime/bloodmagic/ClientConfig.java b/src/main/java/wayoftime/bloodmagic/ClientConfig.java new file mode 100644 index 0000000000..d2ba6e8ea2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/ClientConfig.java @@ -0,0 +1,12 @@ +package wayoftime.bloodmagic; + +import net.neoforged.neoforge.common.ModConfigSpec; + +public class ClientConfig { + + public final ModConfigSpec.BooleanValue ALWAYS_RENDER_NODE_LINES; + + protected ClientConfig(ModConfigSpec.Builder builder) { + ALWAYS_RENDER_NODE_LINES = builder.define("always_render_lines", false); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/ServerConfig.java b/src/main/java/wayoftime/bloodmagic/ServerConfig.java index a71fbd71a9..d32ccfa2a8 100644 --- a/src/main/java/wayoftime/bloodmagic/ServerConfig.java +++ b/src/main/java/wayoftime/bloodmagic/ServerConfig.java @@ -5,12 +5,33 @@ public class ServerConfig { public final ModConfigSpec.ConfigValue SELF_SACRIFICE_CONVERSION; + public final ModConfigSpec.ConfigValue SACRIFICE_CONVERSION; public final ModConfigSpec.ConfigValue DEFAULT_UPGRADE_POINTS; - public final ModConfigSpec.ConfigValue EVOLUTION_UPGRADE_POINTS; // might as well put that here already + public final ModConfigSpec.ConfigValue EVOLUTION_UPGRADE_POINTS; + + public final ModConfigSpec.ConfigValue BASE_ITEM_TRANSFER; + public final ModConfigSpec.ConfigValue UPGRADE_ITEM_TRANSFER; + + public final ModConfigSpec.ConfigValue BASE_FLUID_TRANSFER; + public final ModConfigSpec.ConfigValue UPGRADE_FLUID_TRANSFER; + + public final ModConfigSpec.ConfigValue MAX_AMOUNT_UPGRADES; + public final ModConfigSpec.ConfigValue MAX_SPEED_UPGRADES; protected ServerConfig(ModConfigSpec.Builder builder) { - SELF_SACRIFICE_CONVERSION = builder.define("self_sacrifice_conversion", 100); - DEFAULT_UPGRADE_POINTS = builder.define("default_upgrade_points", 100); - EVOLUTION_UPGRADE_POINTS = builder.define("evolution_upgrade_points", 300); + builder.comment("Range: > 0 means between " + Integer.MAX_VALUE + " and 0 inclusive"); + SELF_SACRIFICE_CONVERSION = builder.defineInRange("self_sacrifice_conversion", 100, 0, Integer.MAX_VALUE); + SACRIFICE_CONVERSION = builder.defineInRange("sacrifice_conversion", 25, 0, Integer.MAX_VALUE); + DEFAULT_UPGRADE_POINTS = builder.defineInRange("default_upgrade_points", 100, 0, Integer.MAX_VALUE); + EVOLUTION_UPGRADE_POINTS = builder.defineInRange("evolution_upgrade_points", 300, 0, Integer.MAX_VALUE); + + BASE_ITEM_TRANSFER = builder.defineInRange("base_item_transfer", 16, 0, Integer.MAX_VALUE); + UPGRADE_ITEM_TRANSFER = builder.defineInRange("upgrade_item_transfer", 16, 0, Integer.MAX_VALUE); + + BASE_FLUID_TRANSFER = builder.defineInRange("base_fluid_transfer", 4000, 0, Integer.MAX_VALUE); + UPGRADE_FLUID_TRANSFER = builder.defineInRange("upgrade_fluid_transfer", 4000, 0, Integer.MAX_VALUE); + + MAX_AMOUNT_UPGRADES = builder.defineInRange("max_amount_upgrades", 9, 0, 64); + MAX_SPEED_UPGRADES = builder.defineInRange("max_speed_upgrades", 9, 0, 19); } } diff --git a/src/main/java/wayoftime/bloodmagic/client/event/ClientEventHandler.java b/src/main/java/wayoftime/bloodmagic/client/event/ClientEventHandler.java index 35db49aae0..00096db6b6 100644 --- a/src/main/java/wayoftime/bloodmagic/client/event/ClientEventHandler.java +++ b/src/main/java/wayoftime/bloodmagic/client/event/ClientEventHandler.java @@ -1,18 +1,23 @@ package wayoftime.bloodmagic.client.event; import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; import net.minecraft.core.component.DataComponentType; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.TooltipProvider; +import net.minecraft.world.level.Level; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.util.ChatUtil; import java.util.ArrayList; import java.util.List; @@ -38,11 +43,15 @@ public static void onHoverText(ItemTooltipEvent event) { } addToTooltip(BMDataComponents.UPGRADES.get(), context, toAdd::add, flags, stack); + if (stack.has(BMDataComponents.STORED_POSITION)) { + GlobalPos storedPos = stack.get(BMDataComponents.STORED_POSITION); + toAdd.add(Component.translatable("tooltip.bloodmagic.stored_position", ChatUtil.posString(storedPos.pos()), ChatUtil.dimensionString(storedPos.dimension())).withStyle(ChatFormatting.GRAY)); + } + // add after name. idgaf tooltip.addAll(1, toAdd); } - public static void addToTooltip( DataComponentType component, Item.TooltipContext context, Consumer tooltipAdder, TooltipFlag tooltipFlag, ItemStack stack ) { diff --git a/src/main/java/wayoftime/bloodmagic/client/event/ClientModEventHandler.java b/src/main/java/wayoftime/bloodmagic/client/event/ClientModEventHandler.java index ac9b77dd23..3fcbf51e6c 100644 --- a/src/main/java/wayoftime/bloodmagic/client/event/ClientModEventHandler.java +++ b/src/main/java/wayoftime/bloodmagic/client/event/ClientModEventHandler.java @@ -10,16 +10,14 @@ import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import wayoftime.bloodmagic.BloodMagic; -import wayoftime.bloodmagic.client.screen.TrainerScreen; +import wayoftime.bloodmagic.client.screen.*; import wayoftime.bloodmagic.common.menu.BMMenus; import wayoftime.bloodmagic.client.render.entity.layer.LivingElytraLayer; -import wayoftime.bloodmagic.client.screen.ARCScreen; -import wayoftime.bloodmagic.client.screen.LivingStationScreen; import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; import wayoftime.bloodmagic.common.datacomponent.EnumWillType; import wayoftime.bloodmagic.common.item.BMItems; -@EventBusSubscriber(value = Dist.CLIENT, modid = BloodMagic.MODID, bus = EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(value = Dist.CLIENT, modid = BloodMagic.MODID) public class ClientModEventHandler { @SubscribeEvent @@ -47,5 +45,8 @@ public static void registerScreens(RegisterMenuScreensEvent event) { event.register(BMMenus.ARC.get(), ARCScreen::new); event.register(BMMenus.LIVING_STATION.get(), LivingStationScreen::new); event.register(BMMenus.TRAINER.get(), TrainerScreen::new); + event.register(BMMenus.MASTER_NODE.get(), NodeMasterScreen::new); + event.register(BMMenus.FILTERED_NODE.get(), NodeFilterScreen::new); + event.register(BMMenus.ITEM_FILTER.get(), FilterScreen::new); } } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/client/render/blockentity/NodeRenderer.java b/src/main/java/wayoftime/bloodmagic/client/render/blockentity/NodeRenderer.java new file mode 100644 index 0000000000..c0164c4422 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/blockentity/NodeRenderer.java @@ -0,0 +1,187 @@ +package wayoftime.bloodmagic.client.render.blockentity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.RoutingNodeBlock; +import wayoftime.bloodmagic.common.blockentity.RoutingNodeTile; +import wayoftime.bloodmagic.common.tag.BMTags; + +public class NodeRenderer implements BlockEntityRenderer { + + public static final ResourceLocation BEAM = ResourceLocation.withDefaultNamespace("textures/entity/beacon_beam.png"); + public static final int DEFAULT = 0x91CCC6; + public static final int CORROSIVE = 0xA7CE90; + public static final int DESTRUCTIVE = 0xD9BFA2; + public static final int STEADFAST = 0x9794CD; + public static final int VENGEFUL = 0xCFB98F; + public NodeRenderer(BlockEntityRendererProvider.Context context) { + } + + public void render(RoutingNodeTile node, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + BlockPos parentPos = node.getParentPos(); + if (parentPos == BlockPos.ZERO) { + return; + } + + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) { // what are we even doing lmao + return; + } + boolean shouldRenderLine = BloodMagic.CLIENT_CONFIG.ALWAYS_RENDER_NODE_LINES.get() // config override + || node.getBlockState().getValue(RoutingNodeBlock.RENDER_LINE) // node override + || player.getMainHandItem().is(BMTags.Items.NODE_DEBUGGER) + || player.getOffhandItem().is(BMTags.Items.NODE_DEBUGGER); + + if (!shouldRenderLine) { + return; + } + + long gameTime = node.getLevel().getGameTime(); + float time = (float)Math.floorMod(gameTime, 40) + partialTick; + + BlockPos offsetPos = node.getBlockPos().subtract(parentPos); + int xd = offsetPos.getX(); + int yd = offsetPos.getY(); + int zd = offsetPos.getZ(); + + double distance = Math.sqrt(xd * xd + yd * yd + zd * zd); + double subLength = Math.sqrt(xd * xd + zd * zd); + float rotYaw = -((float) (Math.atan2(xd, zd) * 180.0D / Math.PI)); + float rotPitch = ((float) (Math.atan2(yd, subLength) * 180.0D / Math.PI)); + + poseStack.pushPose(); + poseStack.translate(0.5f, 0.5f, 0.5f); + poseStack.mulPose(Axis.YP.rotationDegrees(-rotYaw)); + poseStack.mulPose(Axis.XN.rotationDegrees(rotPitch - 90)); + poseStack.translate(0, -distance, 0); + + int colour = switch (node.getBlockState().getValue(RoutingNodeBlock.WILL)) { + case DEFAULT -> DEFAULT; + case CORROSIVE -> CORROSIVE; + case DESTRUCTIVE -> DESTRUCTIVE; + case STEADFAST -> STEADFAST; + case VENGEFUL -> VENGEFUL; + }; + + renderBeaconBeam(poseStack, bufferSource, BEAM, colour, time, (float) distance, 0.06f, node.getBlockState().getValue(RoutingNodeBlock.ENABLED)); + poseStack.popPose(); + } + + public static void renderBeaconBeam( + PoseStack poseStack, + MultiBufferSource bufferSource, + ResourceLocation beamLocation, + int colour, + float time, + float height, + float beamRadius, + boolean isConnected + ) { + float f1 = height < 0 ? time : -time; + float f2 = Mth.frac(f1 * 0.2F - (float)Mth.floor(f1 * 0.1F)); + float v1 = -1 + f2; + float v0 = height * (0.5F / beamRadius) + v1; + + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(time * 2.25F - 45.0F)); + renderPart( + poseStack, + bufferSource.getBuffer(RenderType.beaconBeam(beamLocation, false)), + colour, + 0, + height, + 0.0F, + beamRadius, + beamRadius, + 0.0F, + -beamRadius, + 0.0F, + 0.0F, + -beamRadius, + v0, + v1, + isConnected + ); + poseStack.popPose(); + } + private static void renderPart( + PoseStack poseStack, + VertexConsumer consumer, + int colour, + int minY, + float maxY, + float x1, + float z1, + float x2, + float z2, + float x3, + float z3, + float x4, + float z4, + float v0, + float v1, + boolean isConnected + ) { + PoseStack.Pose posestack$pose = poseStack.last(); + renderQuad( + posestack$pose, consumer, colour, minY, maxY, x1, z1, x2, z2, v0, v1, isConnected + ); + renderQuad( + posestack$pose, consumer, colour, minY, maxY, x4, z4, x3, z3, v0, v1, isConnected + ); + renderQuad( + posestack$pose, consumer, colour, minY, maxY, x2, z2, x4, z4, v0, v1, isConnected + ); + renderQuad( + posestack$pose, consumer, colour, minY, maxY, x3, z3, x1, z1, v0, v1, isConnected + ); + } + + private static void renderQuad( + PoseStack.Pose pose, + VertexConsumer consumer, + int colour, + int minY, + float maxY, + float minX, + float minZ, + float maxX, + float maxZ, + float v0, + float v1, + boolean isConnected + ) { + addVertex(pose, consumer, colour, maxY, minX, minZ, 1, v0, isConnected); + addVertex(pose, consumer, colour, minY, minX, minZ, 1, v1, isConnected); + addVertex(pose, consumer, colour, minY, maxX, maxZ, 0, v1, isConnected); + addVertex(pose, consumer, colour, maxY, maxX, maxZ, 0, v0, isConnected); + } + + private static void addVertex( + PoseStack.Pose pose, VertexConsumer consumer, int colour, float y, float x, float z, float u, float v, boolean isConnected + ) { + consumer.addVertex(pose, x, y, z) + .setColor((isConnected ? colour : 0x666666)) + .setUv(u, v) + .setOverlay(OverlayTexture.NO_OVERLAY) + .setLight(15728880) + .setNormal(pose, 0.0F, 1.0F, 0.0F); + } + + @Override + public boolean shouldRenderOffScreen(RoutingNodeTile blockEntity) { + return true; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/screen/AbstractGhostScreen.java b/src/main/java/wayoftime/bloodmagic/client/screen/AbstractGhostScreen.java index fc824f12a6..e1c9c08e7e 100644 --- a/src/main/java/wayoftime/bloodmagic/client/screen/AbstractGhostScreen.java +++ b/src/main/java/wayoftime/bloodmagic/client/screen/AbstractGhostScreen.java @@ -6,19 +6,37 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerListener; import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.client.widgets.MultiIconButton; import wayoftime.bloodmagic.common.menu.AbstractGhostMenu; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public abstract class AbstractGhostScreen> extends AbstractContainerScreen { public static final ResourceLocation SELECTED = BloodMagic.rl("container/ghost_selected"); public AbstractGhostScreen(T menu, Inventory playerInventory, Component title) { super(menu, playerInventory, title); + ContainerListener buttonListener = new ContainerListener() { + @Override + public void slotChanged(AbstractContainerMenu containerToSend, int dataSlotIndex, ItemStack stack) { + } + + @Override + public void dataChanged(AbstractContainerMenu containerMenu, int dataSlotIndex, int value) { + if (updateButtons.containsKey(dataSlotIndex)) { + updateButtons.get(dataSlotIndex).setState(value); + } + } + }; + menu.addSlotListener(buttonListener); } @Override @@ -27,31 +45,30 @@ protected void init() { this.inventoryLabelY = this.imageHeight - 94; // auto recalc } - private final List> updateButtons = new ArrayList<>(); + private final Map updateButtons = new HashMap<>(); public void addMultiIconButton(int dataIndex, MultiIconButton button) { - updateButtons.add(Pair.of(button, dataIndex)); + updateButtons.put(dataIndex, button); addRenderableWidget(button); } @Override - protected void containerTick() { - super.containerTick(); - updateButtons.forEach(pair -> pair.left().setState(this.menu.getData(pair.right()))); + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + super.render(guiGraphics, mouseX, mouseY, partialTick); + renderTooltip(guiGraphics, mouseX, mouseY); } - public abstract ResourceLocation background(); - @Override protected void renderTooltip(GuiGraphics guiGraphics, int x, int y) { super.renderTooltip(guiGraphics, x, y); - updateButtons.forEach(pair -> { - MultiIconButton button = pair.left(); + updateButtons.forEach((key, button) -> { if (button.isHovered()) { guiGraphics.renderTooltip(this.font, button.getHoverText(), x, y); } }); } + + public abstract ResourceLocation background(); @Override protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { guiGraphics.blit(this.background(), leftPos, topPos, 0, 0, imageWidth, imageHeight); diff --git a/src/main/java/wayoftime/bloodmagic/client/screen/FilterScreen.java b/src/main/java/wayoftime/bloodmagic/client/screen/FilterScreen.java new file mode 100644 index 0000000000..6db95d64d7 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screen/FilterScreen.java @@ -0,0 +1,205 @@ +package wayoftime.bloodmagic.client.screen; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerListener; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.PacketDistributor; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.client.widgets.MultiIconButton; +import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.common.menu.FilterMenu; +import wayoftime.bloodmagic.common.network.GhostAmountPacket; +import wayoftime.bloodmagic.util.helper.FilterHelper; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static wayoftime.bloodmagic.util.helper.FilterHelper.*; + +public class FilterScreen extends AbstractGhostScreen { + public static final ResourceLocation background = BloodMagic.rl("textures/gui/container/filter_item.png"); + + // sprites dont need .png I guess? + public static final ResourceLocation whitelist = BloodMagic.rl("container/filter/whitelist"); + public static final ResourceLocation blacklist = BloodMagic.rl("container/filter/blacklist"); + public static final ResourceLocation tag = BloodMagic.rl("container/filter/tag"); + public static final ResourceLocation tag_all = BloodMagic.rl("container/filter/tag_all"); + public static final ResourceLocation enchant = BloodMagic.rl("container/filter/enchant"); + public static final ResourceLocation enchant_any = BloodMagic.rl("container/filter/enchant_any"); + public static final ResourceLocation enchant_every = BloodMagic.rl("container/filter/enchant_every"); + public static final ResourceLocation enchant_level_any = BloodMagic.rl("container/filter/enchant_level_any"); + public static final ResourceLocation enchant_level_exact = BloodMagic.rl("container/filter/enchant_level_exact"); + + public FilterScreen(FilterMenu menu, Inventory playerInventory, Component title) { + super(menu, playerInventory, title); + imageWidth = 176; + imageHeight = 187; + } + + private EditBox amountBox; + @Override + protected void init() { + super.init(); + amountBox = new EditBox(font, Button.DEFAULT_WIDTH, Button.DEFAULT_HEIGHT, Component.literal("message?")); + amountBox.setEditable(true); + amountBox.setFilter(newValueString -> { + if (newValueString.equalsIgnoreCase("")) { + return true; + } + try { + Integer.decode(newValueString); + return true; + } catch (final NumberFormatException e) { + return false; + } + }); + amountBox.setResponder(newValueString -> { + BloodMagic.LOGGER.info("responding to '{}'", newValueString); + try { + int amount = Integer.decode(newValueString); + setGhostAmount(amount); + } catch (NumberFormatException e) { + // ignored + } + }); + amountBox.setTooltip(Tooltip.create(Component.translatable("filter.bloodmagic.amount_box"))); + amountBox.setPosition(leftPos + 20, topPos + 16); + amountBox.setSize(77, 14); + + addRenderableWidget(amountBox); + + if (menu.heldSlot == -1) { + addRenderableWidget(Button.builder(FilterHelper.translate("return"), button -> sendButtonClick(BUTTON_RETURN)) + .pos(leftPos + 8, topPos + 55) + .size(50, 20) + .build()); + } + + addMultiIconButton(DATA_BWLIST, MultiIconButton.builder(button -> sendButtonClick(BUTTON_BWLIST)) + .icons(whitelist, blacklist) + .tooltips(FilterHelper.translate("whitelist"), FilterHelper.translate("blacklist")) + .pos(leftPos + 8, topPos + 32) + .size(20, 20) + .build() + ); + + if (menu.isTag) { + addPerSlotButton(DATA_TAG, MultiIconButton.builder(button -> sendButtonClick(BUTTON_TAG)) + .icons(tag_all, tag) + .stateGetter(state -> state == 0 ? 0 : 1) + .pos(leftPos + 28, topPos + 32) + .size(20, 20) + .build() + ); + } + + if (menu.isEnchant) { + addPerSlotButton(DATA_ENCHANT, MultiIconButton.builder(button -> sendButtonClick(BUTTON_ENCHANT)) + .icons(enchant_every, enchant_any, enchant) + .stateGetter(state -> switch (state) { + case 0 -> 0; + case 1 -> 1; + + default -> 2; + }) + .pos(leftPos + 28, topPos + 32) + .size(20, 20) + .build() + ); + + addPerSlotButton(DATA_ENCHANT_LVL, MultiIconButton.builder(button -> sendButtonClick(BUTTON_ENCHANT_LVL)) + .icons(enchant_level_exact, enchant_level_any) + .pos(leftPos + 48, topPos + 32) + .size(20, 20) + .build() + ); + } + } + + private Map perSlotButton = new HashMap<>(); + @Override + protected void containerTick() { + super.containerTick(); + perSlotButton.forEach((index, button) -> { + int slot = menu.getData(DATA_SLOT); + int state = menu.getData(index + slot); + button.setState(state); + }); + } + + @Override + protected void renderTooltip(GuiGraphics guiGraphics, int x, int y) { + super.renderTooltip(guiGraphics, x, y); + perSlotButton.forEach((key, button) -> { + if (button.isHovered()) { + guiGraphics.renderTooltip(this.font, buttonHoverText(key), Optional.empty(), x, y); + } + }); + } + + private List buttonHoverText(int data) { + int slot = menu.getData(DATA_SLOT); + return switch (data) { + case DATA_TAG -> FilterHelper.tagButtonText(menu.handler.getStackInSlot(slot)); + case DATA_ENCHANT -> FilterHelper.enchantButtonText(menu.handler.getStackInSlot(slot)); + case DATA_ENCHANT_LVL -> FilterHelper.enchantLevelButtonText(menu.handler.getStackInSlot(slot)); + + default -> List.of(Component.literal("Huh. dont know button %d".formatted(data))); + }; + } + + private void addPerSlotButton(int dataOffset, MultiIconButton button) { + perSlotButton.put(dataOffset, button); + addRenderableWidget(button); + } + + private void setGhostAmount(int amount) { + int slot = menu.getData(DATA_SLOT); + ItemStack stack = menu.getSlot(slot).getItem(); + int oldAmount = stack.getOrDefault(BMDataComponents.GHOST_AMOUNT, 0); + if (oldAmount == amount) { + return; + } + + GhostAmountPacket packet = new GhostAmountPacket(slot, amount); + PacketDistributor.sendToServer(packet); + } + + private void sendButtonClick(int buttonId) { + this.minecraft.gameMode.handleInventoryButtonClick(this.menu.containerId, buttonId); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + super.mouseClicked(mouseX, mouseY, button); // otherwise screen dies + + if (menu.getData(DATA_SLOT) != -1 && amountBox.isMouseOver(mouseX, mouseY)) { // Text box only selectable if a ghost slot has been clicked. + if (button == 1) { + amountBox.setValue(""); + setGhostAmount(0); + amountBox.setFocused(true); + } + if (button == 0) { + amountBox.setFocused(true); + } + return true; + } + + amountBox.setFocused(false); + return true; + } + + @Override + public ResourceLocation background() { + return background; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/screen/NodeFilterScreen.java b/src/main/java/wayoftime/bloodmagic/client/screen/NodeFilterScreen.java new file mode 100644 index 0000000000..38e520ab81 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screen/NodeFilterScreen.java @@ -0,0 +1,182 @@ +package wayoftime.bloodmagic.client.screen; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.menu.NodeFilterMenu; +import wayoftime.bloodmagic.util.helper.FilterHelper; + +public class NodeFilterScreen extends AbstractContainerScreen { + + private static final ResourceLocation background = BloodMagic.rl("textures/gui/container/node_filter.png"); + private static final ResourceLocation selected = BloodMagic.rl("container/ghost_selected"); + // TODO name these better. up means leftmost or topmost... + private static final int upLeft = 109 + 1; + private static final int upTop = 11 + 1; + private static final int midLeft = upLeft + 20; + private static final int midTop = upTop + 20; + private static final int bottomLeft = midLeft + 20; + private static final int bottomTop = midTop + 20; + private final Direction down; + private final Pair downLocation = Pair.of(midLeft, bottomTop); + private final Direction up; + private final Pair upLocation = Pair.of(midLeft, upTop); + private final Direction front; + private final Pair frontLocation = Pair.of(midLeft, midTop); + private final Direction back; + private final Pair backLocation = Pair.of(bottomLeft, bottomTop); + private final Direction left; + private final Pair leftLocation = Pair.of(upLeft, midTop); + private final Direction right; + private final Pair rightLocation = Pair.of(bottomLeft, midTop); + + public NodeFilterScreen(NodeFilterMenu menu, Inventory playerInv, Component title) { + super(menu, playerInv, title); + imageWidth = 176; + imageHeight = 187; + + Vec3 rot = Vec3.directionFromRotation(playerInv.player.getRotationVector()); + Direction playerFacing = Direction.getNearest(rot.x, rot.y, rot.z); + Direction horizontalFacing = playerInv.player.getDirection(); + back = playerFacing; + front = playerFacing.getOpposite(); + left = horizontalFacing.getCounterClockWise(); + right = horizontalFacing.getClockWise(); + if (playerFacing.getAxis().isVertical()) { + up = playerFacing == Direction.DOWN ? horizontalFacing : horizontalFacing.getOpposite(); + down = playerFacing == Direction.DOWN ? horizontalFacing.getOpposite() : horizontalFacing; + } else { + up = Direction.UP; + down = Direction.DOWN; + } + } + + @Override + protected void init() { + super.init(); + + addRenderableWidget(directionButton(down, downLocation)); + addRenderableWidget(directionButton(up, upLocation)); + addRenderableWidget(directionButton(front, frontLocation)); + addRenderableWidget(directionButton(back, backLocation)); + addRenderableWidget(directionButton(left, leftLocation)); + addRenderableWidget(directionButton(right, rightLocation)); + + addRenderableWidget(Button.builder(Component.literal("<"), button -> sendButtonClick(NodeFilterMenu.BUTTON_PRIO_DOWN)) + .pos(leftPos + 61, topPos + 50) + .size(8, 20) + .build() + ); + addRenderableWidget(Button.builder(Component.literal(">"), button -> sendButtonClick(NodeFilterMenu.BUTTON_PRIO_UP)) + .pos(leftPos + 89, topPos + 50) + .size(8, 20) + .build() + ); + + addRenderableWidget(Button.builder(FilterHelper.translate("edit"), button -> sendButtonClick(NodeFilterMenu.BUTTON_EDIT)) + .pos(leftPos + 8, topPos + 31) + .size(50, 20) + .build() + ); + + // sendButtonClick(front.get3DDataValue()); // not sure whether to always focus front or to keep track of last selected + } + + private Button directionButton(Direction dir, Pair pos) { + return Button.builder(Component.empty(), getPress(dir)) + .pos(leftPos + pos.getFirst(), topPos + pos.getSecond()) + .size(18, 18) + .build(); + } + + private Button.OnPress getPress(Direction dir) { + return button -> { + if(!(menu.getData(6) == dir.get3DDataValue())) { + sendButtonClick(dir.get3DDataValue()); + } + }; + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { + guiGraphics.blit(background, leftPos, topPos, 0, 0, imageWidth, imageHeight); + } + + @Override + protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { + super.renderLabels(guiGraphics, mouseX, mouseY); + // TODO figure out why its 71 + 5 and 51 + 5 instead of 76 and 56 + guiGraphics.drawString(this.font, Component.literal("" + menu.getData(menu.getData(6))), 71 + 5, 51 + 5, 0xFFFFFF, false); + + drawBlock(guiGraphics, up, upLocation.getFirst(), upLocation.getSecond()); + drawBlock(guiGraphics, down, downLocation.getFirst(), downLocation.getSecond()); + drawBlock(guiGraphics, left, leftLocation.getFirst(), leftLocation.getSecond()); + drawBlock(guiGraphics, right, rightLocation.getFirst(), rightLocation.getSecond()); + drawBlock(guiGraphics, front, frontLocation.getFirst(), frontLocation.getSecond()); + drawBlock(guiGraphics, back, backLocation.getFirst(), backLocation.getSecond()); + + Pair activePos = getPosForDir(Direction.from3DDataValue(menu.getData(6))); + guiGraphics.blitSprite(selected, activePos.getFirst() - 3, activePos.getSecond() - 3, 24, 24); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + // TODO implement E/esc/backspace to "go back" one layer + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean shouldCloseOnEsc() { + return false; // we handle esc ourselves, so ignore in super + } + + private Pair getPosForDir(Direction dir) { + if (dir == up) { + return upLocation; + } + if (dir == down) { + return downLocation; + } + if (dir == front) { + return frontLocation; + } + if (dir == back) { + return backLocation; + } + if (dir == left) { + return leftLocation; + } + if (dir == right) { + return rightLocation; + } + + return Pair.of(0, 0); + } + + private void drawBlock(GuiGraphics guiGraphics, Direction dir, int x, int y) { + BlockState blockState = this.menu.player.level().getBlockState(this.menu.nodePos.relative(dir)); + Block block = blockState.getBlock(); + ItemStack stack = new ItemStack(block); + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(x + 3, y + 3, 0); + guiGraphics.pose().scale(0.75f, 0.75f, 0.75f); + guiGraphics.renderItem(stack, 0, 0); + guiGraphics.pose().popPose(); + } + + private void sendButtonClick(int id) { + Minecraft.getInstance().gameMode.handleInventoryButtonClick(this.menu.containerId, id); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/screen/NodeMasterScreen.java b/src/main/java/wayoftime/bloodmagic/client/screen/NodeMasterScreen.java new file mode 100644 index 0000000000..6f0791a776 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screen/NodeMasterScreen.java @@ -0,0 +1,40 @@ +package wayoftime.bloodmagic.client.screen; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.menu.NodeMasterMenu; + +public class NodeMasterScreen extends AbstractContainerScreen { + + private final ResourceLocation background = ResourceLocation.fromNamespaceAndPath(BloodMagic.MODID, "textures/gui/container/node_master.png"); + public NodeMasterScreen(NodeMasterMenu menu, Inventory playerInventory, Component title) { + super(menu, playerInventory, title); + this.imageWidth = 176; + this.imageHeight = 125; + + this.inventoryLabelY = 28; + } + + @Override + public void init() + { + super.init(); + this.leftPos = (this.width - this.imageWidth) / 2; + this.topPos = (this.height - this.imageHeight) / 2; + } + + @Override + public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { + super.render(guiGraphics, mouseX, mouseY, partialTick); + this.renderTooltip(guiGraphics, mouseX, mouseY); + } + + @Override + protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) { + guiGraphics.blit(background, leftPos, topPos, 0, 0, imageWidth, imageHeight); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/screen/TrainerScreen.java b/src/main/java/wayoftime/bloodmagic/client/screen/TrainerScreen.java index 4710c357f4..5eec67f507 100644 --- a/src/main/java/wayoftime/bloodmagic/client/screen/TrainerScreen.java +++ b/src/main/java/wayoftime/bloodmagic/client/screen/TrainerScreen.java @@ -60,11 +60,6 @@ public String getLevelString() { private static final ResourceLocation allow = ResourceLocation.fromNamespaceAndPath(BloodMagic.MODID, "container/trainer/allow_others"); private static final ResourceLocation deny = ResourceLocation.fromNamespaceAndPath(BloodMagic.MODID, "container/trainer/deny_others"); - @Override - public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - super.render(guiGraphics, mouseX, mouseY, partialTick); - renderTooltip(guiGraphics, mouseX, mouseY); - } @Override protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { diff --git a/src/main/java/wayoftime/bloodmagic/client/widgets/MultiIconButton.java b/src/main/java/wayoftime/bloodmagic/client/widgets/MultiIconButton.java index 3fd91a8373..7af71c1cbd 100644 --- a/src/main/java/wayoftime/bloodmagic/client/widgets/MultiIconButton.java +++ b/src/main/java/wayoftime/bloodmagic/client/widgets/MultiIconButton.java @@ -4,28 +4,35 @@ import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import wayoftime.bloodmagic.BloodMagic; + +import java.util.function.Function; +import java.util.function.Supplier; public class MultiIconButton extends AbstractButton { private final ResourceLocation[] icons; private final Component[] tooltips; private final OnPress onPress; - public MultiIconButton(int x, int y, int width, int height, Component[] tooltips, ResourceLocation[] icons, OnPress onPress) { + private final Function stateGetter; + public MultiIconButton(int x, int y, int width, int height, Component[] tooltips, ResourceLocation[] icons, OnPress onPress, Function stateGetter) { super(x, y, width, height, Component.literal("")); this.onPress = onPress; this.icons = icons; this.tooltips = tooltips; + this.stateGetter = stateGetter; } public MultiIconButton(Builder builder) { - this(builder.x, builder.y, builder.width, builder.height, builder.tooltips, builder.icons, builder.onPress); + this(builder.x, builder.y, builder.width, builder.height, builder.tooltips, builder.icons, builder.onPress, builder.stateGetter); } private int state = 0; public int getState() { - return this.state; + return this.stateGetter.apply(state); } public void setState(int state) { @@ -38,13 +45,16 @@ public void onPress() { } public Component getHoverText() { - return tooltips[state % tooltips.length]; + return tooltips.length > 0 ? tooltips[stateGetter.apply(state) % tooltips.length] : CommonComponents.EMPTY; } @Override protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super.renderWidget(guiGraphics, mouseX, mouseY, partialTick); - guiGraphics.blitSprite(icons[state % icons.length], this.getX(), this.getY(), this.getWidth(), this.getHeight()); + int index = stateGetter.apply(state); + ResourceLocation sprite = icons[index % icons.length]; + // BloodMagic.LOGGER.info("got state {}, index {} and res loc {}", state, index, sprite); + guiGraphics.blitSprite(sprite, this.getX(), this.getY(), this.getWidth(), this.getHeight()); } @Override @@ -64,6 +74,7 @@ public static class Builder { private int height = 20; private ResourceLocation[] icons; private Component[] tooltips; + private Function stateGetter = Function.identity(); public Builder(OnPress onPress) { this.onPress = onPress; @@ -100,6 +111,11 @@ public Builder icons(ResourceLocation... icons) { return this; } + public Builder stateGetter(Function stateGetter) { + this.stateGetter = stateGetter; + return this; + } + public MultiIconButton build() { return build(MultiIconButton::new); } diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BMBlocks.java b/src/main/java/wayoftime/bloodmagic/common/block/BMBlocks.java index 4adced0806..1e6b8fe672 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BMBlocks.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BMBlocks.java @@ -1,6 +1,7 @@ package wayoftime.bloodmagic.common.block; import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.BlockItem; @@ -8,11 +9,17 @@ import net.minecraft.world.item.component.ItemLore; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredRegister; +import org.jetbrains.annotations.Nullable; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.blockentity.BMTiles; +import wayoftime.bloodmagic.common.blockentity.FilterNodeTile; import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.util.ChatUtil; import wayoftime.bloodmagic.util.helper.BlockEntityHelper; import wayoftime.bloodmagic.util.helper.BlockWithItemHolder; import wayoftime.bloodmagic.util.helper.BlockWithItemRegister; @@ -34,11 +41,16 @@ public class BMBlocks { public static final BlockWithItemHolder HELLFIRE_FORGE = BLOCK_REG.register("hellfire_forge", HellfireForgeBlock::new); public static final BlockWithItemHolder ARC_BLOCK = BLOCK_REG.register("arc", ARCBlock::new); + public static final BlockWithItemHolder MASTER_NODE = BLOCK_REG.register("routing_node_master", MasterNodeBlock::new); + public static final BlockWithItemHolder ROUTING_NODE = BLOCK_REG.register("routing_node", RoutingNodeBlock::new); + public static final BlockWithItemHolder INPUT_ROUTING_NODE = BLOCK_REG.register("routing_node_input", () -> new FilterNodeBlock(false)); + public static final BlockWithItemHolder OUTPUT_ROUTING_NODE = BLOCK_REG.register("routing_node_output", () -> new FilterNodeBlock(true)); + // TODO add model/textures for this and change registry to BASIC_REG public static final BlockWithItemHolder LIVING_STATION = BLOCK_REG.register("living_station", LivingStationBlock::new); private static final BlockBehaviour.Properties rune_properties = BlockBehaviour.Properties.of().strength(2.0F, 5.0F).sound(SoundType.STONE).requiresCorrectToolForDrops(); - private static final ItemLore save_decoration = new ItemLore(List.of(BlockEntityHelper.translatableHover("tooltip.bloodmagic.save_for_decoration").withStyle(ChatFormatting.ITALIC))); + private static final ItemLore save_decoration = new ItemLore(List.of(ChatUtil.translatableHover("tooltip.bloodmagic.save_for_decoration").withStyle(ChatFormatting.ITALIC))); private static final Item.Properties decoration_item_properties = new Item.Properties().component(DataComponents.LORE, save_decoration); public static final BlockWithItemHolder RUNE_BLANK = BASIC_REG.register("rune_blank", rune_properties, decoration_item_properties); @@ -68,7 +80,7 @@ public class BMBlocks { public static final BlockWithItemHolder BLOODSTONE = BASIC_REG.register("bloodstone", rune_properties, decoration_item_properties); public static final BlockWithItemHolder BLOODSTONE_BRICK = BASIC_REG.register("bloodstone_brick", rune_properties, decoration_item_properties); - public static final BlockWithItemHolder HELLFORGED_BLOCK = BASIC_REG.register("hellforged_block", BlockBehaviour.Properties.of().strength(5, 6).sound(SoundType.METAL).requiresCorrectToolForDrops(), new Item.Properties()); + public static final BlockWithItemHolder HELLFORGED_BLOCK = BASIC_REG.register("hellforged_block_default", BlockBehaviour.Properties.of().strength(5, 6).sound(SoundType.METAL).requiresCorrectToolForDrops(), new Item.Properties()); public static final BlockWithItemHolder CRYSTAL_CLUSTER = BASIC_REG.register("crystal_cluster", rune_properties, decoration_item_properties); public static final BlockWithItemHolder CRYSTAL_CLUSTER_BRICK = BASIC_REG.register("crystal_cluster_brick", rune_properties, decoration_item_properties); diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodTankBlock.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodTankBlock.java index 5a6f9c4de8..3db91ec1f8 100644 --- a/src/main/java/wayoftime/bloodmagic/common/block/BloodTankBlock.java +++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodTankBlock.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.Nullable; import wayoftime.bloodmagic.common.blockentity.BloodTankTile; import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.util.ChatUtil; import wayoftime.bloodmagic.util.helper.BlockEntityHelper; import java.util.List; @@ -67,14 +68,14 @@ public void appendHoverText(ItemStack stack, Item.TooltipContext context, List buf.writeBlockPos(pos).writeBoolean(isOutput)); + } + return InteractionResult.sidedSuccess(level.isClientSide); + } + + @Nullable + @Override + protected MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { + BlockEntity BE = level.getBlockEntity(pos); + if (!(BE instanceof FilterNodeTile tile)) { + return null; + } + return tile; + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new FilterNodeTile(pos, state, isOutput); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/MasterNodeBlock.java b/src/main/java/wayoftime/bloodmagic/common/block/MasterNodeBlock.java new file mode 100644 index 0000000000..ca261311ae --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/MasterNodeBlock.java @@ -0,0 +1,51 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; +import wayoftime.bloodmagic.common.blockentity.BMTiles; +import wayoftime.bloodmagic.common.blockentity.MasterNodeTile; +import wayoftime.bloodmagic.util.helper.BlockEntityHelper; + +public class MasterNodeBlock extends RoutingNodeBlock { + public MasterNodeBlock() { + super(); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + if (!level.isClientSide && player instanceof ServerPlayer serverPlayer) { + serverPlayer.openMenu(state.getMenuProvider(level, pos)); + } + return InteractionResult.sidedSuccess(level.isClientSide); + } + + @Nullable + @Override + protected MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { + BlockEntity BE = level.getBlockEntity(pos); + if (!(BE instanceof MasterNodeTile tile)) { + return null; + } + return tile; + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return BlockEntityHelper.getTicker(blockEntityType, BMTiles.MASTER_ROUTING_NODE.get(), MasterNodeTile::tick); + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new MasterNodeTile(pos, state); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/RoutingNodeBlock.java b/src/main/java/wayoftime/bloodmagic/common/block/RoutingNodeBlock.java new file mode 100644 index 0000000000..adb37e57ea --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/RoutingNodeBlock.java @@ -0,0 +1,185 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import wayoftime.bloodmagic.common.blockentity.BMTiles; +import wayoftime.bloodmagic.common.blockentity.RoutingNodeTile; +import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.common.datacomponent.EnumWillType; +import wayoftime.bloodmagic.common.tag.BMTags; +import wayoftime.bloodmagic.util.helper.BlockEntityHelper; + +public class RoutingNodeBlock extends Block implements EntityBlock { + public static final BooleanProperty ENABLED = BlockStateProperties.ENABLED; + public static final BooleanProperty DOWN = BlockStateProperties.DOWN; + public static final BooleanProperty UP = BlockStateProperties.UP; + public static final BooleanProperty NORTH = BlockStateProperties.NORTH; + public static final BooleanProperty SOUTH = BlockStateProperties.SOUTH; + public static final BooleanProperty WEST = BlockStateProperties.WEST; + public static final BooleanProperty EAST = BlockStateProperties.EAST; + public static final EnumProperty WILL = EnumProperty.create("will_type", EnumWillType.class); + public static final BooleanProperty RENDER_LINE = BooleanProperty.create("render_line"); + + public static final VoxelShape SHAPE = Block.box(6, 6, 6, 10, 10, 10); + public RoutingNodeBlock() { + super( + Properties.of() + .strength(2, 5) + .requiresCorrectToolForDrops() + .forceSolidOn() // not washed away by water + .dynamicShape() // not sure needed, but it should update its connections + .noOcclusion() // dont cull blocks + .pushReaction(PushReaction.BLOCK) // dont move, even if moving BEs is allowed + ); + + this.registerDefaultState( + this.getStateDefinition().any() + .setValue(ENABLED, true) + .setValue(DOWN, false) + .setValue(UP, false) + .setValue(NORTH, false) + .setValue(SOUTH, false) + .setValue(WEST, false) + .setValue(EAST, false) + .setValue(WILL, EnumWillType.DEFAULT) + .setValue(RENDER_LINE, false) + ); + } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) { + return BlockEntityHelper.getTicker(blockEntityType, BMTiles.ROUTING_NODE.get(), RoutingNodeTile::tick); + } + + @Override + protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { + if (player.isShiftKeyDown()) { + level.setBlock(pos, state.setValue(RENDER_LINE, true), UPDATE_ALL); + level.scheduleTick(pos, state.getBlock(), 20 * 5); + } + return super.useWithoutItem(state, level, pos, player, hitResult); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (!state.getValue(ENABLED) && random.nextFloat() < 0.3) { + level.addParticle(new DustParticleOptions(DustParticleOptions.REDSTONE_PARTICLE_COLOR, 1.1f), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5f, 0.0, 0.0, 0.0); + } + } + + @Override + protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + level.setBlock(pos, state.setValue(RENDER_LINE, false), UPDATE_ALL); + } + + @Override + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { + if (stack.is(BMTags.Items.SOUL_GEM)) { + EnumWillType gemType = stack.getOrDefault(BMDataComponents.DEMON_WILL_TYPE, EnumWillType.DEFAULT); + EnumWillType setType = state.getValue(WILL) == gemType ? EnumWillType.DEFAULT : gemType; + level.setBlock(pos, state.setValue(WILL, setType), UPDATE_ALL); + return ItemInteractionResult.sidedSuccess(level.isClientSide); + } + + return super.useItemOn(stack, state, level, pos, player, hand, hitResult); + } + + @Override + protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + // adapted from HopperBlock + boolean enabled = !level.hasNeighborSignal(pos); + if (enabled != state.getValue(ENABLED)) { + level.setBlock(pos, state.setValue(ENABLED, enabled), 2); + } + } + + @Override + public @Nullable BlockState getStateForPlacement(BlockPlaceContext context) { + Level level = context.getLevel(); + BlockPos blockpos = context.getClickedPos(); + BlockState returnState = defaultBlockState(); + returnState = returnState.setValue(ENABLED, !level.hasNeighborSignal(blockpos)); + + for (Direction dir : Direction.values()) + { + BlockPos attachedPos = blockpos.relative(dir); + BlockState attachedState = level.getBlockState(attachedPos); + BooleanProperty prop = switch (dir) { + case DOWN -> DOWN; + case EAST -> EAST; + case NORTH -> NORTH; + case SOUTH -> SOUTH; + case UP -> UP; + case WEST -> WEST; + }; + returnState = returnState.setValue(prop, attachedState.isFaceSturdy(level, attachedPos, dir.getOpposite())); + } + + return returnState; + } + + @Override + protected BlockState updateShape(BlockState state, Direction dir, BlockState neighborState, LevelAccessor level, BlockPos pos, BlockPos neighborPos) { + BlockPos attachedPos = pos.relative(dir); + BlockState attachedState = level.getBlockState(attachedPos); + BooleanProperty prop = switch (dir) { + case DOWN -> DOWN; + case EAST -> EAST; + case NORTH -> NORTH; + case SOUTH -> SOUTH; + case UP -> UP; + case WEST -> WEST; + }; + state = state.setValue(prop, attachedState.isFaceSturdy(level, attachedPos, dir.getOpposite())); + + return state; + } + + @Override + protected RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(ENABLED, DOWN, UP, NORTH, SOUTH, WEST, EAST, WILL, RENDER_LINE); + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new RoutingNodeTile(BMTiles.ROUTING_NODE.get(), pos, state); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/blockentity/BMTiles.java b/src/main/java/wayoftime/bloodmagic/common/blockentity/BMTiles.java index 3e2e8ed8fc..56b87c3098 100644 --- a/src/main/java/wayoftime/bloodmagic/common/blockentity/BMTiles.java +++ b/src/main/java/wayoftime/bloodmagic/common/blockentity/BMTiles.java @@ -2,6 +2,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.capabilities.Capabilities; @@ -14,6 +15,7 @@ import wayoftime.bloodmagic.client.render.blockentity.BloodAltarRenderer; import wayoftime.bloodmagic.client.render.blockentity.BloodTankRenderer; import wayoftime.bloodmagic.client.render.blockentity.HellfireForgeRenderer; +import wayoftime.bloodmagic.client.render.blockentity.NodeRenderer; import wayoftime.bloodmagic.common.block.BMBlocks; import java.util.Set; @@ -36,6 +38,15 @@ public class BMTiles { public static final DeferredHolder, BlockEntityType> LIVING_STATION_TYPE = TILES.register("living_station", () -> new BlockEntityType<>(LivingStationTile::new, Set.of(BMBlocks.LIVING_STATION.block().get()), null)); + public static final DeferredHolder, BlockEntityType> ROUTING_NODE = TILES.register("routing_node", + () -> new BlockEntityType<>(RoutingNodeTile::new, Set.of(BMBlocks.ROUTING_NODE.block().get()), null)); + + public static final DeferredHolder, BlockEntityType> FILTER_ROUTING_NODE = TILES.register("filter_routing_node", + () -> new BlockEntityType<>(FilterNodeTile::new, Set.of(BMBlocks.INPUT_ROUTING_NODE.block().get(), BMBlocks.OUTPUT_ROUTING_NODE.block().get()), null)); + + public static final DeferredHolder, BlockEntityType> MASTER_ROUTING_NODE = TILES.register("master_routing_node", + () -> new BlockEntityType<>(MasterNodeTile::new, Set.of(BMBlocks.MASTER_NODE.block().get()), null)); + private static void registerTileCapabilities(RegisterCapabilitiesEvent event) { event.registerBlockEntity( Capabilities.ItemHandler.BLOCK, @@ -86,6 +97,8 @@ private static void registerBlockEntityRenderer(EntityRenderersEvent.RegisterRen event.registerBlockEntityRenderer(HELLFIRE_FORGE_TYPE.get(), HellfireForgeRenderer::new); event.registerBlockEntityRenderer(BLOOD_ALTAR_TYPE.get(), BloodAltarRenderer::new); event.registerBlockEntityRenderer(BLOOD_TANK_TYPE.get(), BloodTankRenderer::new); + event.registerBlockEntityRenderer(ROUTING_NODE.get(), NodeRenderer::new); + event.registerBlockEntityRenderer(FILTER_ROUTING_NODE.get(), NodeRenderer::new); } public static void register(IEventBus modBus) { diff --git a/src/main/java/wayoftime/bloodmagic/common/blockentity/BloodAltarTile.java b/src/main/java/wayoftime/bloodmagic/common/blockentity/BloodAltarTile.java index fb2536f7e2..442072b78b 100644 --- a/src/main/java/wayoftime/bloodmagic/common/blockentity/BloodAltarTile.java +++ b/src/main/java/wayoftime/bloodmagic/common/blockentity/BloodAltarTile.java @@ -90,6 +90,7 @@ public void calculateStats(Map upgrades) { efficiencyMod = (float) Math.pow(0.85, upgrades.getOrDefault(EnumRuneType.EFFICIENCY, 0)); } + private int changingGrace = 0; public static void tick(Level level, BlockPos pos, BlockState state, BloodAltarTile tile) { if (level.isClientSide) { return; @@ -110,26 +111,39 @@ public static void tick(Level level, BlockPos pos, BlockState state, BloodAltarT } } + if (tile.mainTank > tile.getMainCapacity()) { + tile.changingGrace++; + } else { + tile.changingGrace = 0; + } + + if (tile.changingGrace >= 20 * 5) { + tile.mainTank = Math.min(tile.mainTank, tile.getMainCapacity()); + tile.inputTank = Math.min(tile.inputTank, tile.getIOCapacity()); + tile.outputTank = Math.min(tile.inputTank, tile.getIOCapacity()); + } + if (tile.ticks % Math.max(tile.tickRate, 1) == 0) { float ioAmount = 20F * tile.dislocationMod; int input = (int) Math.min(tile.inputTank, ioAmount); - input = (int) Math.min(input, tile.getMainCapacity() - tile.mainTank); + input = Math.clamp(input, 0, tile.getMainCapacity() - tile.mainTank); tile.inputTank -= input; tile.mainTank += input; int output = (int) Math.min(tile.mainTank, ioAmount); - output = (int) Math.min(output, tile.getIOCapacity() - tile.outputTank); + output = Math.clamp(output, 0, tile.getIOCapacity() - tile.outputTank); tile.mainTank -= output; tile.outputTank += output; if (!tile.isActive) { tile.progress = 0; int charge = (int) Math.min(tile.mainTank, tile.chargeAmountMod); - charge = (int) Math.min(charge, tile.getChargingCapacity() - tile.chargingTank); + charge = Math.clamp(charge, 0, tile.getChargingCapacity() - tile.chargingTank); tile.mainTank -= charge; tile.chargingTank += charge; } } + tile.setChanged(); if (!tile.isActive && tile.cooldownAfterCrafting > 0) { tile.cooldownAfterCrafting--; @@ -212,7 +226,7 @@ public static void tick(Level level, BlockPos pos, BlockState state, BloodAltarT } public void sacrificialDaggerCall(int lpAdded, boolean isSacrifice) { - mainTank = mainTank + Math.min((getMainCapacity() - mainTank), (int) ((isSacrifice ? 1 + sacrificeMod : 1 + selfSacMod) * lpAdded)); + mainTank = mainTank + Math.clamp((int) ((isSacrifice ? 1f + sacrificeMod : 1f + selfSacMod) * (float) lpAdded), 0, getMainCapacity() - mainTank); setChanged(); } diff --git a/src/main/java/wayoftime/bloodmagic/common/blockentity/FilterNodeTile.java b/src/main/java/wayoftime/bloodmagic/common/blockentity/FilterNodeTile.java new file mode 100644 index 0000000000..9f1eeb75ff --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/blockentity/FilterNodeTile.java @@ -0,0 +1,127 @@ +package wayoftime.bloodmagic.common.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.*; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemStackHandler; +import org.jetbrains.annotations.Nullable; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.RoutingNodeBlock; +import wayoftime.bloodmagic.common.capability.BMCaps; +import wayoftime.bloodmagic.common.menu.NodeFilterMenu; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; +import wayoftime.bloodmagic.common.routing.NodeContext; +import wayoftime.bloodmagic.common.tag.BMTags; + +import java.util.*; +import java.util.function.BiConsumer; + +public class FilterNodeTile extends RoutingNodeTile implements MenuProvider { + + public static final int MAX_PRIO = 10; + public final boolean isOutput; + public FilterNodeTile(BlockPos pos, BlockState blockState, boolean isOutput) { + super(BMTiles.FILTER_ROUTING_NODE.get(), pos, blockState); + this.isOutput = isOutput; + } + + public FilterNodeTile(BlockPos pos, BlockState state) { + this(pos, state, false); + } + + public int[] priorities = new int[] {0, 0, 0, 0, 0, 0, 0}; + + public final ItemStackHandler filterInv = new ItemStackHandler(6) { + @Override + public int getSlotLimit(int slot) { + return 1; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + //return stack.getCapability(BMCaps.ROUTING_FILTER_PROVIDER, NodeContext.EMPTY) != null; + // TODO temporary convenience + return stack.is(BMTags.Items.FILTERS); + } + + @Override + protected void onContentsChanged(int slot) { + setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + } + }; + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + CompoundTag invTag = filterInv.serializeNBT(registries); + tag.put("filter_inv", invTag); + IntArrayTag prioTag = new IntArrayTag(priorities); + tag.put("priorities", prioTag); + } + + @Override + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + filterInv.deserializeNBT(registries, tag.getCompound("filter_inv")); + priorities = tag.getIntArray("priorities"); + } + + public void propagateNetwork(BiConsumer> collector, boolean requireEnabled) { + if (requireEnabled && !getBlockState().getValue(RoutingNodeBlock.ENABLED)) { + return; + } + + collector.accept(getBlockPos(), Optional.of(isOutput)); + + for (BlockPos pos : children) { + if (level.getBlockEntity(pos) instanceof RoutingNodeTile node) { + node.propagateNetwork(collector, requireEnabled); + } + } + } + + @Override + public Component getDisplayName() { + return Component.translatable("gui.bloodmagic.node." + (isOutput ? "output" : "input")); + } + + @Override + public @Nullable AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { + return new NodeFilterMenu(containerId, playerInventory, filterInv, new ContainerData() { + @Override + public int get(int index) { + return FilterNodeTile.this.priorities[index]; + } + + @Override + public void set(int index, int value) { + FilterNodeTile.this.priorities[index] = value; + FilterNodeTile.this.setChanged(); + } + + @Override + public int getCount() { + return FilterNodeTile.this.priorities.length; + } + }, getBlockPos(), isOutput); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/blockentity/MasterNodeTile.java b/src/main/java/wayoftime/bloodmagic/common/blockentity/MasterNodeTile.java new file mode 100644 index 0000000000..25cc46d9ed --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/blockentity/MasterNodeTile.java @@ -0,0 +1,112 @@ +package wayoftime.bloodmagic.common.blockentity; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.items.ItemStackHandler; +import org.jetbrains.annotations.Nullable; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BMBlocks; +import wayoftime.bloodmagic.common.item.BMItems; +import wayoftime.bloodmagic.common.menu.NodeMasterMenu; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; + +import java.util.*; + +public class MasterNodeTile extends RoutingNodeTile implements MenuProvider { + + public MasterNodeTile(BlockPos pos, BlockState blockState) { + super(BMTiles.MASTER_ROUTING_NODE.get(), pos, blockState); + } + + public ItemStackHandler upgradeInv = new ItemStackHandler(2) { + @Override + public int getSlotLimit(int slot) { + return switch (slot) { + case 0 -> BloodMagic.SERVER_CONFIG.MAX_AMOUNT_UPGRADES.get(); + case 1 -> BloodMagic.SERVER_CONFIG.MAX_SPEED_UPGRADES.get(); + default -> 0; + }; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return switch (slot) { + // TODO replace with the actual upgrades after adding them + case 0 -> stack.is(BMItems.NODE_AMOUNT_UPGRADE.get()); + case 1 -> stack.is(BMItems.NODE_SPEED_UPGRADE.get()); + default -> false; + }; + } + + @Override + protected void onContentsChanged(int slot) { + setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + } + }; + + public int ticks = 0; + private Set outputNodes; + private Set inputNodes; + public static void tick(Level level, BlockPos pos, BlockState state, MasterNodeTile node) { + if (level.isClientSide) { + return; + } + + if (node.inputNodes == null || node.outputNodes == null) { + + } + + if (node.ticks % Math.min(1, 20 - node.upgradeInv.getStackInSlot(1).getCount()) != 0) { + return; + } + + } + + public void markNodeDirty(BlockPos nodePos) { + + } + + @Override + public boolean addToNetwork(BlockPos parent) { + return false; + } + + @Override + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + ticks = tag.getInt("ticks"); + upgradeInv.deserializeNBT(registries, tag.getCompound("upgrades")); + } + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + tag.putInt("ticks", ticks % 20); + tag.put("upgrades", upgradeInv.serializeNBT(registries)); + } + + // TODO fix these two + @Override + public Component getDisplayName() { + return Component.translatable("gui.bloodmagic.node.master"); + } + + @Override + public @Nullable AbstractContainerMenu createMenu(int containerId, Inventory playerInventory, Player player) { + return new NodeMasterMenu(containerId, playerInventory, this.upgradeInv); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/blockentity/RoutingNodeTile.java b/src/main/java/wayoftime/bloodmagic/common/blockentity/RoutingNodeTile.java new file mode 100644 index 0000000000..889de09c0b --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/blockentity/RoutingNodeTile.java @@ -0,0 +1,165 @@ +package wayoftime.bloodmagic.common.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.RoutingNodeBlock; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class RoutingNodeTile extends BaseTile { + + // somebody please think of the children + public RoutingNodeTile(BlockEntityType type, BlockPos pos, BlockState blockState) { + super(type, pos, blockState); + } + + public RoutingNodeTile(BlockPos pos, BlockState state) { + super(BMTiles.ROUTING_NODE.get(), pos, state); + } + + public static void tick(Level level, BlockPos blockPos, BlockState blockState, RoutingNodeTile node) { + if (!(level.getGameTime() % 20 == 0)) { + return; + } + + if (!node.hasMaster() && node.hasParent()) { + if (level.getBlockEntity(node.parentPos) instanceof RoutingNodeTile parent) { + if (parent.hasMaster()) { + node.masterPos = parent.masterPos; + } + } + } + } + + protected BlockPos masterPos = BlockPos.ZERO; + protected BlockPos parentPos = BlockPos.ZERO; + protected Set children = new HashSet<>(); + + public void propagateNetwork(BiConsumer> collector, boolean requireEnabled) { + if (requireEnabled && !getBlockState().getValue(RoutingNodeBlock.ENABLED)) { + return; + } + + collector.accept(getBlockPos(), Optional.empty()); + + for (BlockPos pos : children) { + if (level.getBlockEntity(pos) instanceof RoutingNodeTile node) { + node.propagateNetwork(collector, requireEnabled); + } + } + } + + public void setParent(BlockPos parent) { + this.parentPos = parent; + } + + public boolean hasParent() { + return this.parentPos != BlockPos.ZERO; + } + + public BlockPos getParentPos() { + return this.parentPos; + } + + public boolean addToNetwork(BlockPos parent) { + if (!(level.getBlockEntity(parent) instanceof RoutingNodeTile parentNode)) { + return false; + } + if (masterPos != BlockPos.ZERO && parentNode.masterPos != BlockPos.ZERO) { + return false; + } + + parentPos = parent; + if (masterPos == BlockPos.ZERO && parentNode.masterPos != BlockPos.ZERO) { + masterPos = parentNode.masterPos; + } else if (masterPos != BlockPos.ZERO && parentNode.masterPos == BlockPos.ZERO) { + parentNode.masterPos = masterPos; + } + + parentNode.addChild(getBlockPos()); + parentNode.setChanged(); + level.sendBlockUpdated(parentPos, parentNode.getBlockState(), parentNode.getBlockState(), Block.UPDATE_CLIENTS); + + this.setChanged(); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_CLIENTS); + + return true; + } + + public void addChild(BlockPos child) { + this.children.add(child); + } + + public void removeFromNetwork() { + this.masterPos = BlockPos.ZERO; + + // TODO filtering nodes should remove their info from master here + children.forEach(child -> { + if (level.getBlockEntity(child) instanceof RoutingNodeTile node) { + node.removeFromNetwork(); + } else { // you in da wrong neighbourhood dawg + children.remove(child); + } + }); + } + + public boolean hasMaster() { + return this.masterPos != BlockPos.ZERO; + } + + public BlockPos getMasterPos() { + return this.masterPos; + } + + @Override + protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.saveAdditional(tag, registries); + CompoundTag nodeInfo = new CompoundTag(); + nodeInfo.put("master", posToTag(masterPos)); + nodeInfo.put("parent", posToTag(parentPos)); + ListTag childTag = new ListTag(); + children.forEach(pos -> childTag.add(posToTag(pos))); + nodeInfo.put("children", childTag); + tag.put("node_info", nodeInfo); + } + + @Override + protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) { + super.loadAdditional(tag, registries); + CompoundTag nodeInfo = tag.getCompound("node_info"); + masterPos = tagToPos(nodeInfo.getCompound("master")); + parentPos = tagToPos(nodeInfo.getCompound("parent")); + ListTag childrenTag = nodeInfo.getList("children", ListTag.TAG_COMPOUND); + children.clear(); // just to be sure theres no weird overflow happening + childrenTag.forEach(childTag -> children.add(tagToPos((CompoundTag) childTag))); // cast should be fine since we tell .getList its a list of TC's. I *think* + } + + protected CompoundTag posToTag(BlockPos pos) { + CompoundTag tag = new CompoundTag(); + if (pos != BlockPos.ZERO) { + tag.putInt("x", pos.getX()); + tag.putInt("y", pos.getY()); + tag.putInt("z", pos.getZ()); + } + return tag; + } + + protected BlockPos tagToPos(CompoundTag tag) { + if (tag.contains("x") && tag.contains("y") && tag.contains("z")) { + return new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z")); + } + return BlockPos.ZERO; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/capability/BMCaps.java b/src/main/java/wayoftime/bloodmagic/common/capability/BMCaps.java new file mode 100644 index 0000000000..e5b83a19ec --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/capability/BMCaps.java @@ -0,0 +1,15 @@ +package wayoftime.bloodmagic.common.capability; + +import net.neoforged.neoforge.capabilities.ItemCapability; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.routing.IRoutingFilter; +import wayoftime.bloodmagic.common.routing.NodeContext; + +public class BMCaps { + // TODO does it matter that its IRF instead of IRF here? like both permit any (afaik) but specifying it makes IC#create complain + public static final ItemCapability ROUTING_FILTER_PROVIDER = ItemCapability.create( + BloodMagic.rl("routing_filter_provider"), + IRoutingFilter.class, + NodeContext.class + ); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/datacomponent/BMDataComponents.java b/src/main/java/wayoftime/bloodmagic/common/datacomponent/BMDataComponents.java index 9ea3d68560..6cd4a32525 100644 --- a/src/main/java/wayoftime/bloodmagic/common/datacomponent/BMDataComponents.java +++ b/src/main/java/wayoftime/bloodmagic/common/datacomponent/BMDataComponents.java @@ -2,6 +2,7 @@ import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; +import net.minecraft.core.GlobalPos; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.Registries; @@ -9,6 +10,7 @@ import net.minecraft.resources.RegistryFixedCodec; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; +import net.minecraft.world.item.component.ItemContainerContents; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.fluids.SimpleFluidContent; import net.neoforged.neoforge.registries.DeferredHolder; @@ -18,6 +20,7 @@ import wayoftime.bloodmagic.common.registry.BMRegistries; import java.util.function.Function; +import java.util.function.Supplier; public class BMDataComponents { public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, BloodMagic.MODID); @@ -32,6 +35,8 @@ public class BMDataComponents { public static final DeferredHolder, DataComponentType> ARC_CHANCE = DATA_COMPONENTS.registerComponentType("arc_chance", builder -> builder.persistent(Codec.DOUBLE)); public static final DeferredHolder, DataComponentType> ARC_SPEED = DATA_COMPONENTS.registerComponentType("arc_speed", builder -> builder.persistent(Codec.DOUBLE)); + public static final DeferredHolder, DataComponentType> STORED_POSITION = DATA_COMPONENTS.registerComponentType("stored_position", builder -> builder.persistent(GlobalPos.CODEC).networkSynchronized(GlobalPos.STREAM_CODEC)); + public static final DeferredHolder, DataComponentType> CONTAINER_TIER = DATA_COMPONENTS.registerComponentType("container_tier", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.INT)); public static final DeferredHolder, DataComponentType> FLUID_CONTENT = DATA_COMPONENTS.registerComponentType("fluid_content", builder -> builder.persistent(SimpleFluidContent.CODEC).networkSynchronized(SimpleFluidContent.STREAM_CODEC)); public static final DeferredHolder, DataComponentType> ENERGY_CONTENT = DATA_COMPONENTS.registerComponentType("energy_content", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.INT)); @@ -51,6 +56,17 @@ public class BMDataComponents { public static final DeferredHolder, DataComponentType> PREVIOUS_DAMAGE = DATA_COMPONENTS.registerComponentType("previous_damage", builder -> builder.persistent(Codec.INT)); + public static final DeferredHolder, DataComponentType> FILTER_INVENTORY = DATA_COMPONENTS.registerComponentType("filter_inventory", builder -> builder.persistent(ItemContainerContents.CODEC).networkSynchronized(ItemContainerContents.STREAM_CODEC)); + public static final DeferredHolder, DataComponentType> GHOST_SLOT = DATA_COMPONENTS.registerComponentType("ghost_slot", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT)); + public static final DeferredHolder, DataComponentType> FILTER_BLACKWHITELIST = DATA_COMPONENTS.registerComponentType("filter_blackwhitelist", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT)); + + public static final DeferredHolder, DataComponentType> FILTER_ENCHANT_LEVEL = DATA_COMPONENTS.registerComponentType("filter_enchant_level", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT)); + public static final DeferredHolder, DataComponentType> FILTER_ENCHANT_INDEX = DATA_COMPONENTS.registerComponentType("filter_enchant_index", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT)); + + public static final DeferredHolder, DataComponentType> FILTER_TAG_INDEX = DATA_COMPONENTS.registerComponentType("filter_tag_index", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT)); + public static final DeferredHolder, DataComponentType>> FILTER_TAG = DATA_COMPONENTS.registerComponentType("filter_tag", builder -> builder.persistent(TagKey.codec(Registries.ITEM)).networkSynchronized(ByteBufCodecs.fromCodecWithRegistries(TagKey.codec(Registries.ITEM)))); + public static final DeferredHolder, DataComponentType> GHOST_AMOUNT = DATA_COMPONENTS.registerComponentType("ghost_amount", builder -> builder.persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT)); + public static void register(IEventBus modBus) { DATA_COMPONENTS.register(modBus); } diff --git a/src/main/java/wayoftime/bloodmagic/common/datacomponent/Binding.java b/src/main/java/wayoftime/bloodmagic/common/datacomponent/Binding.java index e91c1ccf6c..d4ee0870ff 100644 --- a/src/main/java/wayoftime/bloodmagic/common/datacomponent/Binding.java +++ b/src/main/java/wayoftime/bloodmagic/common/datacomponent/Binding.java @@ -11,6 +11,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.component.TooltipProvider; +import wayoftime.bloodmagic.util.ChatUtil; import wayoftime.bloodmagic.util.helper.BlockEntityHelper; import java.nio.charset.StandardCharsets; @@ -41,9 +42,9 @@ public boolean isEmpty() { @Override public void addToTooltip(Item.TooltipContext context, Consumer tooltip, TooltipFlag tooltipFlag) { if (this.isEmpty()) { - tooltip.accept(BlockEntityHelper.translatableHover("tooltip.bloodmagic.no_owner")); + tooltip.accept(ChatUtil.translatableHover("tooltip.bloodmagic.no_owner")); } else { - tooltip.accept(BlockEntityHelper.translatableHover("tooltip.bloodmagic.current_owner", this.name)); + tooltip.accept(ChatUtil.translatableHover("tooltip.bloodmagic.current_owner", this.name)); } } } diff --git a/src/main/java/wayoftime/bloodmagic/common/event/CommonEventHandler.java b/src/main/java/wayoftime/bloodmagic/common/event/CommonEventHandler.java index 8d6ce02de9..b0de99fbf2 100644 --- a/src/main/java/wayoftime/bloodmagic/common/event/CommonEventHandler.java +++ b/src/main/java/wayoftime/bloodmagic/common/event/CommonEventHandler.java @@ -32,7 +32,6 @@ public static void onInteract(PlayerInteractEvent.RightClickItem event) { Binding binding = held.get(BMDataComponents.BINDING); if (binding == null) { - BloodMagic.LOGGER.info("binding was null"); return; } BloodMagic.LOGGER.info("binding: {}:{}", binding.name(), binding.uuid()); diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BMItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BMItems.java index 3ccf4b7d86..3af207c584 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/BMItems.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/BMItems.java @@ -35,6 +35,16 @@ public class BMItems { public static final DeferredHolder ORB_ARCHMAGE = BASIC_ITEMS.register("blood_orb_archmage", BloodOrbItem::new); public static final DeferredHolder ORB_TRANSCENDENT = BASIC_ITEMS.register("blood_orb_transcendent", BloodOrbItem::new); + public static final DeferredHolder NODE_ROUTER = BASIC_ITEMS.register("node_router", NodeRouterItem::new); + public static final DeferredHolder NODE_AMOUNT_UPGRADE = BASIC_ITEMS.register("node_upgrade_amount", () -> new Item(new Item.Properties())); + public static final DeferredHolder NODE_SPEED_UPGRADE = BASIC_ITEMS.register("node_upgrade_speed", () -> new Item(new Item.Properties().stacksTo(19))); + + public static final DeferredHolder STANDARD_FILTER = BASIC_ITEMS.register("filter_standard", () -> new FilterItem(new Item.Properties().stacksTo(16))); + public static final DeferredHolder TAG_FILTER = BASIC_ITEMS.register("filter_tag", () -> new FilterItem(new Item.Properties().stacksTo(16))); + public static final DeferredHolder ENCHANT_FILTER = BASIC_ITEMS.register("filter_enchant", () -> new FilterItem(new Item.Properties().stacksTo(16))); + public static final DeferredHolder MOD_FILTER = BASIC_ITEMS.register("filter_mod", () -> new FilterItem(new Item.Properties().stacksTo(16))); + public static final DeferredHolder COMPOSITE_FILTER = BASIC_ITEMS.register("filter_composite", () -> new FilterItem(new Item.Properties().stacksTo(16))); + private static Supplier makeLivingArmour(ArmorItem.Type type) { return () -> new ArmorItem(BMMaterialsAndTiers.LIVING_ARMOUR_MATERIAL, type, new Item.Properties().durability(type.getDurability(33))); } diff --git a/src/main/java/wayoftime/bloodmagic/common/item/FilterItem.java b/src/main/java/wayoftime/bloodmagic/common/item/FilterItem.java new file mode 100644 index 0000000000..6a196b12e9 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/FilterItem.java @@ -0,0 +1,138 @@ +package wayoftime.bloodmagic.common.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemContainerContents; +import net.minecraft.world.level.Level; +import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.common.menu.FilterData; +import wayoftime.bloodmagic.common.menu.FilterMenu; +import wayoftime.bloodmagic.common.menu.GhostItemHandler; +import wayoftime.bloodmagic.common.tag.BMTags; +import wayoftime.bloodmagic.util.helper.FilterHelper; + +import java.util.ArrayList; +import java.util.List; + +import static wayoftime.bloodmagic.util.helper.FilterHelper.*; + +public class FilterItem extends Item { + + public FilterItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand usedHand) { + ItemStack filterStack = player.getItemInHand(usedHand); + if (!(filterStack.getItem() instanceof FilterItem)) { + return InteractionResultHolder.pass(filterStack); + } + + if (!level.isClientSide) { + int slot = usedHand == InteractionHand.MAIN_HAND ? player.getInventory().selected : 0; + player.openMenu(getFilterProvider(filterStack, slot, BlockPos.ZERO), buf -> writeBuf(filterStack, slot, BlockPos.ZERO, buf)); + } + return InteractionResultHolder.sidedSuccess(filterStack, level.isClientSide); + } + + public static void writeBuf(ItemStack filterStack, int slot, BlockPos nodePos, RegistryFriendlyByteBuf buf) { + buf.writeInt(slot); + buf.writeBoolean(filterStack.is(BMTags.Items.TAG_FILTER)); + buf.writeBoolean(filterStack.is(BMTags.Items.ENCHANT_FILTER)); + buf.writeBlockPos(nodePos); + } + + public static MenuProvider getFilterProvider(ItemStack filterStack, int slotHeldIn, BlockPos nodePos) { + NonNullList stacks = NonNullList.withSize(9, ItemStack.EMPTY); + if (filterStack.has(BMDataComponents.FILTER_INVENTORY)) { + ItemContainerContents contents = filterStack.get(BMDataComponents.FILTER_INVENTORY); + contents.copyInto(stacks); + } + + GhostItemHandler filterInv = new GhostItemHandler(stacks) { + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return !stack.is(BMTags.Items.FILTERS); + } + + @Override + public void onContentsChanged(int slot) { + filterStack.set(BMDataComponents.FILTER_INVENTORY, this.toContents()); + } + }; + List rawData = new ArrayList<>(CONTAINER_DATA_SIZE); + for (int i = 0; i < CONTAINER_DATA_SIZE; i++) { + rawData.add(0); + } + rawData.set(DATA_SLOT, filterStack.getOrDefault(BMDataComponents.GHOST_SLOT, 0)); // dont wanna deal with -1 here really + rawData.set(DATA_BWLIST, filterStack.getOrDefault(BMDataComponents.FILTER_BLACKWHITELIST, 0)); + + for (int i = 0; i < 9; i++) { + ItemStack slotStack = stacks.get(i); + rawData.set(DATA_TAG + i, slotStack.getOrDefault(BMDataComponents.FILTER_TAG_INDEX, 0)); + rawData.set(DATA_ENCHANT + i, slotStack.getOrDefault(BMDataComponents.FILTER_ENCHANT_INDEX, 0)); + rawData.set(DATA_ENCHANT_LVL + i, slotStack.getOrDefault(BMDataComponents.FILTER_ENCHANT_LEVEL, 0)); + } + + FilterData data = new FilterData(rawData) { + @Override + public void set(int index, int value) { + super.set(index, value); + + if (index == DATA_SLOT) { + filterStack.set(BMDataComponents.GHOST_SLOT, value); + return; + } + + if (index == DATA_BWLIST) { + filterStack.set(BMDataComponents.FILTER_BLACKWHITELIST, value); + return; + } + + int kind = (index - 2) / 9; + int offset = (index - 2) % 9; + ItemStack targetStack = filterInv.getStackInSlot(offset); + DataComponentType component = switch (kind) { + case 0 -> { + if (value == 0) { + targetStack.remove(BMDataComponents.FILTER_TAG); + } else { + targetStack.set(BMDataComponents.FILTER_TAG, FilterHelper.getTag(targetStack, value)); + } + yield BMDataComponents.FILTER_TAG_INDEX.get(); + } + case 1 -> BMDataComponents.FILTER_ENCHANT_INDEX.get(); + case 2 -> BMDataComponents.FILTER_ENCHANT_LEVEL.get(); + + default -> throw new IllegalStateException("got {} for index -> {} for kind"); + }; + targetStack.set(component, value); + filterInv.setChanged(offset); + } + }; + + return new SimpleMenuProvider( + (containerId, playerInv, player) -> new FilterMenu( + containerId, + playerInv, + filterInv, + data, + slotHeldIn, + filterStack.has(BMDataComponents.FILTER_TAG_INDEX), + filterStack.has(BMDataComponents.FILTER_ENCHANT_INDEX), + nodePos + ), + filterStack.getDisplayName() + ); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/LivingArmourItem.java b/src/main/java/wayoftime/bloodmagic/common/item/LivingArmourItem.java index c94b0d19b0..4aeba1fd71 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/LivingArmourItem.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/LivingArmourItem.java @@ -14,6 +14,6 @@ public LivingArmourItem() { .durability(Type.CHESTPLATE.getDurability(33)) .component(BMDataComponents.REQUIRED_SET, BMTags.Items.LIVING_SET) .component(BMDataComponents.CURRENT_UPGRADE_POINTS, 0) - ); + ); } } diff --git a/src/main/java/wayoftime/bloodmagic/common/item/NodeRouterItem.java b/src/main/java/wayoftime/bloodmagic/common/item/NodeRouterItem.java new file mode 100644 index 0000000000..1ba2ab51b5 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/NodeRouterItem.java @@ -0,0 +1,100 @@ +package wayoftime.bloodmagic.common.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import wayoftime.bloodmagic.common.blockentity.MasterNodeTile; +import wayoftime.bloodmagic.common.blockentity.RoutingNodeTile; +import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.util.ChatUtil; + +public class NodeRouterItem extends Item { + + public NodeRouterItem() { + super( + new Properties().stacksTo(1) + ); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + if (context.getHand() == InteractionHand.OFF_HAND) { + return InteractionResult.PASS; + } + ItemStack routerStack = context.getItemInHand(); + if (context.isSecondaryUseActive()) { + routerStack.remove(BMDataComponents.STORED_POSITION); + if (context.getLevel().isClientSide) { + ChatUtil.sendChat(context.getPlayer(), ChatUtil.translatableHover("tooltip.bloodmagic.router.pos_cleared")); + } + return InteractionResult.sidedSuccess(context.getLevel().isClientSide); + } else { + BlockPos clickedPos = context.getClickedPos(); + Level level = context.getLevel(); + if (!(level.getBlockEntity(clickedPos) instanceof RoutingNodeTile clickedNode)) { + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), ChatUtil.translatableHover("tooltip.bloodmagic.router.no_node", ChatUtil.posString(clickedPos))); + } + return InteractionResult.FAIL; + } + if (!routerStack.has(BMDataComponents.STORED_POSITION)) { + // first node, this is the parent + routerStack.set(BMDataComponents.STORED_POSITION, new GlobalPos(context.getLevel().dimension(), clickedPos)); + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), ChatUtil.translatableHover("tooltip.bloodmagic.router.pos_set", ChatUtil.posString(clickedPos))); + } + } else { + // second node, this is the child + if (clickedNode instanceof MasterNodeTile) { + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), Component.translatable("tooltip.bloodmagic.router.master_child")); + } + return InteractionResult.FAIL; + } + + GlobalPos storedPos = routerStack.get(BMDataComponents.STORED_POSITION); + if (clickedPos.distSqr(storedPos.pos()) > 16 * 16) { + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), Component.translatable("tooltip.bloodmagic.router.distance")); + } + return InteractionResult.FAIL; + } + + if (clickedPos.equals(storedPos.pos())) { + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), Component.translatable("tooltip.bloodmagic.router.same")); + } + return InteractionResult.FAIL; + } + + if (!(level.getBlockEntity(storedPos.pos()) instanceof RoutingNodeTile)) { + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), Component.translatable("tooltip.bloodmagic.router.no_node", ChatUtil.posString(storedPos.pos()))); + } + return InteractionResult.FAIL; + } + + if (!clickedNode.addToNetwork(storedPos.pos())) { + return InteractionResult.FAIL; + } + // if chaining nodes together for long distance, having this active is good + // if connecting x nodes to the same parent having this active is annoying + // perhaps client config? is client config available on server? probably gonna need to send a packet from client + // TODO decide how to handle this + routerStack.remove(BMDataComponents.STORED_POSITION); + if (level.isClientSide) { + ChatUtil.sendChat(context.getPlayer(), Component.translatable("tooltip.bloodmagic.router.connected")); + ChatUtil.sendChat(context.getPlayer(), Component.translatable("tooltip.bloodmagic.router.pos_cleared")); + } + } + + return InteractionResult.sidedSuccess(level.isClientSide); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/TrainerItem.java b/src/main/java/wayoftime/bloodmagic/common/item/TrainerItem.java index 07eaef1356..d417735c46 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/TrainerItem.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/TrainerItem.java @@ -77,10 +77,9 @@ public void set(int index, int value) { serverPlayer.openMenu( new SimpleMenuProvider( - (id, inv, playerIn) -> new TrainerMenu(id, inv, handler, data, playerIn.getInventory().selected), + (id, inv, playerIn) -> new TrainerMenu(id, inv, handler, data), Component.translatable(getDescriptionId()) - ), - buf -> buf.writeInt(serverPlayer.getInventory().selected) + ) ); } diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/ARCMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/ARCMenu.java index 456163964a..697c5c63c2 100644 --- a/src/main/java/wayoftime/bloodmagic/common/menu/ARCMenu.java +++ b/src/main/java/wayoftime/bloodmagic/common/menu/ARCMenu.java @@ -52,6 +52,7 @@ public void onTake(Player player, ItemStack stack) { } public ARCMenu(int containerId, Inventory playerInventory, FriendlyByteBuf buf) { + // TODO nonono, bad! just pass the tanks & inv sis this(containerId, playerInventory, (ARCTile) playerInventory.player.level().getBlockEntity(buf.readBlockPos())); } diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/AbstractGhostMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/AbstractGhostMenu.java index 39c7d157b9..a6855ed04a 100644 --- a/src/main/java/wayoftime/bloodmagic/common/menu/AbstractGhostMenu.java +++ b/src/main/java/wayoftime/bloodmagic/common/menu/AbstractGhostMenu.java @@ -19,6 +19,8 @@ public AbstractGhostMenu(MenuType type, int containerId, Inventory playerInve this.tracker = tracker; this.handler = handler; this.addDataSlots(tracker); + this.heldSlot = heldSlot; + this.playerInv = playerInventory; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { @@ -43,6 +45,9 @@ public AbstractGhostMenu(MenuType type, int containerId, Inventory playerInve } } + public final int heldSlot; + public final Inventory playerInv; + public final GhostItemHandler handler; public final ContainerData tracker; public int getLastGhostSlotClicked() { @@ -62,11 +67,12 @@ public void clicked(int slotId, int button, ClickType clickType, Player player) if (heldStack.isEmpty() && !slotStack.isEmpty()) { // I clicked on the slot with an empty hand. Selecting! updateGhostSelection(tracker.get(0), slotId); - BloodMagic.LOGGER.info("selected ghost slot {} index {}", slotId, slot.getSlotIndex()); - tracker.set(0, slot.getSlotIndex()); + setData(0, slot.getSlotIndex()); // Return here to not save the server-side inventory return; } else if (!heldStack.isEmpty() && slotStack.isEmpty() && ghostSlot.isValid(heldStack)) { + updateGhostSelection(tracker.get(0), slotId); + setData(0, slot.getSlotIndex()); ItemStack copyStack = heldStack.copy(); copyStack.setCount(1); slot.set(copyStack); diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/BMMenus.java b/src/main/java/wayoftime/bloodmagic/common/menu/BMMenus.java index 514a78a8ee..f617b90281 100644 --- a/src/main/java/wayoftime/bloodmagic/common/menu/BMMenus.java +++ b/src/main/java/wayoftime/bloodmagic/common/menu/BMMenus.java @@ -16,7 +16,12 @@ public class BMMenus { public static final DeferredHolder, MenuType> ARC = MENUS.register("arc_menu", () -> IMenuTypeExtension.create(ARCMenu::new)); public static final DeferredHolder, MenuType> LIVING_STATION = MENUS.register("living_station", () -> IMenuTypeExtension.create(LivingStationMenu::new)); - public static final DeferredHolder, MenuType> TRAINER = MENUS.register("trainer", () -> IMenuTypeExtension.create(TrainerMenu::new)); + public static final DeferredHolder, MenuType> TRAINER = MENUS.register("trainer", () -> new MenuType<>(TrainerMenu::new, FeatureFlags.DEFAULT_FLAGS)); + + public static final DeferredHolder, MenuType> MASTER_NODE = MENUS.register("node_master", () -> new MenuType<>(NodeMasterMenu::new, FeatureFlags.DEFAULT_FLAGS)); + public static final DeferredHolder, MenuType> FILTERED_NODE = MENUS.register("node_filtered", () -> IMenuTypeExtension.create(NodeFilterMenu::new)); + + public static final DeferredHolder, MenuType> ITEM_FILTER = MENUS.register("item_filter", () -> IMenuTypeExtension.create(FilterMenu::new)); public static void register(IEventBus modbus) { MENUS.register(modbus); diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/FilterData.java b/src/main/java/wayoftime/bloodmagic/common/menu/FilterData.java new file mode 100644 index 0000000000..1c2d4a265e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/menu/FilterData.java @@ -0,0 +1,41 @@ +package wayoftime.bloodmagic.common.menu; + +import net.minecraft.world.inventory.ContainerData; + +import java.util.ArrayList; +import java.util.List; + +public class FilterData implements ContainerData { + + private final List contents; + public FilterData(int count) { + List contents = new ArrayList<>(count); + for (int i = 0; i < count; i++) { + contents.add(0); + } + this.contents = contents; + } + + public FilterData(List contents) { + this.contents = new ArrayList<>(contents.size()); + // just so we dont end up with a non-mutable list + for (int i = 0; i < contents.size(); i++) { + this.contents.add(i, contents.get(i)); + } + } + + @Override + public int get(int index) { + return contents.get(index); + } + + @Override + public void set(int index, int value) { + contents.set(index, value); + } + + @Override + public int getCount() { + return contents.size(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/FilterMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/FilterMenu.java new file mode 100644 index 0000000000..caf2118015 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/menu/FilterMenu.java @@ -0,0 +1,84 @@ +package wayoftime.bloodmagic.common.menu; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import wayoftime.bloodmagic.common.blockentity.FilterNodeTile; +import wayoftime.bloodmagic.util.helper.FilterHelper; + +import static wayoftime.bloodmagic.util.helper.FilterHelper.*; + +public class FilterMenu extends AbstractGhostMenu { + + public final boolean isTag; + public final boolean isEnchant; + public final BlockPos nodePos; + public FilterMenu(int containerId, Inventory playerInv, RegistryFriendlyByteBuf buf) { + super(BMMenus.ITEM_FILTER.get(), containerId, playerInv, FilterHelper.CONTAINER_DATA_SIZE, 3, 3, 110, 15, 105, buf.readInt()); + isTag = buf.readBoolean(); + isEnchant = buf.readBoolean(); + nodePos = buf.readBlockPos(); + } + + public FilterMenu(int containerId, Inventory playerInv, GhostItemHandler filterInv, FilterData filterData, int slot, boolean tag, boolean enchant, BlockPos nodePos) { + super(BMMenus.ITEM_FILTER.get(), containerId, playerInv, filterData, filterInv, 3, 3, 110, 15, 105, slot); + isTag = tag; + isEnchant = enchant; + this.nodePos = nodePos; + } + + @Override + public boolean clickMenuButton(Player player, int id) { + return switch (id) { + case BUTTON_RETURN -> { + if (player.level().getBlockEntity(nodePos) instanceof FilterNodeTile node) { + player.openMenu(node, buf -> { + buf.writeBlockPos(nodePos); + buf.writeBoolean(node.isOutput); + }); + } + yield true; + } + + case BUTTON_BWLIST -> { + int state = tracker.get(DATA_BWLIST); + setData(DATA_BWLIST, state == 0 ? 1 : 0); + yield true; + } + + case BUTTON_TAG -> { + int slot = tracker.get(DATA_SLOT); + int state = tracker.get(DATA_TAG + slot); + ItemStack contentStack = handler.getStackInSlot(slot); + state = FilterHelper.cycleTag(contentStack, state); + setData(DATA_TAG + slot, state); + yield true; + } + + case BUTTON_ENCHANT -> { + int slot = tracker.get(DATA_SLOT); + int state = tracker.get(DATA_ENCHANT + slot); + ItemStack contentStack = handler.getStackInSlot(slot); + state = FilterHelper.cycleEnchant(contentStack, state); + setData(DATA_ENCHANT + slot, state); + yield true; + } + + case BUTTON_ENCHANT_LVL -> { + int slot = tracker.get(DATA_SLOT); + int state = tracker.get(DATA_ENCHANT_LVL + slot); + setData(DATA_ENCHANT_LVL + slot, state == 0 ? 1 : 0); + yield true; + } + + default -> false; + }; + } + + @Override + public boolean stillValid(Player player) { + return true; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/GhostItemHandler.java b/src/main/java/wayoftime/bloodmagic/common/menu/GhostItemHandler.java index 3d62eaa7bd..1a04d07cae 100644 --- a/src/main/java/wayoftime/bloodmagic/common/menu/GhostItemHandler.java +++ b/src/main/java/wayoftime/bloodmagic/common/menu/GhostItemHandler.java @@ -2,6 +2,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemContainerContents; import net.neoforged.neoforge.items.ItemStackHandler; public class GhostItemHandler extends ItemStackHandler { @@ -13,4 +14,17 @@ public GhostItemHandler(NonNullList initial) { public GhostItemHandler(int size) { super(size); } + + public GhostItemHandler(ItemContainerContents contents) { + super(contents.getSlots()); + contents.copyInto(this.stacks); + } + + public void setChanged(int slot) { + onContentsChanged(slot); + } + + public ItemContainerContents toContents() { + return ItemContainerContents.fromItems(this.stacks); + } } diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/LivingStationMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/LivingStationMenu.java index 0bf25492de..473fbe348b 100644 --- a/src/main/java/wayoftime/bloodmagic/common/menu/LivingStationMenu.java +++ b/src/main/java/wayoftime/bloodmagic/common/menu/LivingStationMenu.java @@ -34,7 +34,7 @@ public LivingStationMenu(int containerId, Inventory playerInventory, IItemHandle playerInvStart = inv.getSlots(); playerInvEnd = playerInvStart + 27; hotbarStart = playerInvEnd + 1; - hotbarEnd = hotbarStart + 8; + hotbarEnd = hotbarStart + 9; // TODO whether or not something can go into a given slot is essentially duplicated between here and the actual inventory... this.addSlot(new SlotItemHandler(inv, 0, 12, 22) { diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/NodeFilterMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/NodeFilterMenu.java new file mode 100644 index 0000000000..f59cd10dbb --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/menu/NodeFilterMenu.java @@ -0,0 +1,157 @@ +package wayoftime.bloodmagic.common.menu; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.*; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.IItemHandlerModifiable; +import net.neoforged.neoforge.items.ItemStackHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import wayoftime.bloodmagic.common.block.BMBlocks; +import wayoftime.bloodmagic.common.blockentity.BMTiles; +import wayoftime.bloodmagic.common.blockentity.FilterNodeTile; +import wayoftime.bloodmagic.common.item.FilterItem; +import wayoftime.bloodmagic.common.tag.BMTags; + +public class NodeFilterMenu extends AbstractContainerMenu { + + // I'd get the IDs directly from Direction but switch wants a "constant expression" + public static final int DATA_DOWN = 0; + public static final int DATA_UP = 1; + public static final int DATA_NORTH = 2; + public static final int DATA_SOUTH = 3; + public static final int DATA_WEST = 4; + public static final int DATA_EAST = 5; + public static final int DATA_SIDE = 6; + + public static final int BUTTON_PRIO_DOWN = 6; + public static final int BUTTON_PRIO_UP = 7; + public static final int BUTTON_EDIT = 8; + + public NodeFilterMenu(int containerId, Inventory playerInv, RegistryFriendlyByteBuf buf) { + this(containerId, playerInv, new ItemStackHandler(6), new SimpleContainerData(7), buf.readBlockPos(), buf.readBoolean()); + } + + private final ContainerData priorities; + public final BlockPos nodePos; + public final Player player; + public final boolean isOutput; + public NodeFilterMenu(int containerId, Inventory playerInv, IItemHandler filterInv, ContainerData priorities, BlockPos nodePos, boolean isOutput) { + super(BMMenus.FILTERED_NODE.get(), containerId); + this.priorities = priorities; + addDataSlots(this.priorities); + this.nodePos = nodePos; + this.player = playerInv.player; + this.isOutput = isOutput; + + this.addSlot(new FilterSlot(filterInv, 0, 71, 33)); + this.addSlot(new FilterSlot(filterInv, 1, 71, 33)); + this.addSlot(new FilterSlot(filterInv, 2, 71, 33)); + this.addSlot(new FilterSlot(filterInv, 3, 71, 33)); + this.addSlot(new FilterSlot(filterInv, 4, 71, 33)); + this.addSlot(new FilterSlot(filterInv, 5, 71, 33)); + + // player inv + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 9; j++) { + this.addSlot(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 87 + i * 18)); + } + } + + // player hotbar + for (int i = 0; i < 9; i++) { + this.addSlot(new Slot(playerInv, i, 8 + i * 18, 145)); + } + } + + @Override + public boolean clickMenuButton(Player player, int id) { + return switch (id) { + case BUTTON_PRIO_DOWN, BUTTON_PRIO_UP -> { + int side = getData(DATA_SIDE); + int prio = getData(side); + int newPrio = Math.clamp(prio + (id == BUTTON_PRIO_UP ? 1 : -1), 0, FilterNodeTile.MAX_PRIO); + setData(side, newPrio); + yield true; + } + + case BUTTON_EDIT -> { + int slot = getData(DATA_SIDE); + ItemStack filterStack = getSlot(slot).getItem(); + if (!filterStack.isEmpty() && filterStack.is(BMTags.Items.FILTERS)) { + player.openMenu(FilterItem.getFilterProvider(filterStack, -1, nodePos), buf -> FilterItem.writeBuf(filterStack, -1, nodePos, buf)); + } + yield false; + } + + case DATA_DOWN, DATA_UP, DATA_NORTH, DATA_SOUTH, DATA_WEST, DATA_EAST -> { + setData(DATA_SIDE, id); + yield true; + } + + default -> false; + }; + } + + public int getData(int index) { + return priorities.get(index); + } + + private static final int playerInvStart = 6; + private static final int playerInvEnd = playerInvStart + (3 * 9); // end is exclusive anyways + private static final int hotbarStart = playerInvEnd; + private static final int hotbarEnd = hotbarStart + 9; + @Override + public ItemStack quickMoveStack(Player player, int index) { + ItemStack movedStack = ItemStack.EMPTY; + Slot movedSlot = this.slots.get(index); + + if (movedSlot.hasItem()) { + ItemStack rawStack = movedSlot.getItem(); + movedStack = rawStack.copy(); + + if (index < playerInvStart) { + if (!this.moveItemStackTo(rawStack, playerInvStart, hotbarEnd, false)) { + return ItemStack.EMPTY; + } + } + + if (index >= playerInvStart) { + int target = getData(DATA_SIDE); + if (!this.moveItemStackTo(rawStack, target, target + 1, false)) { + return ItemStack.EMPTY; + } + } + + if (rawStack.isEmpty()) { + movedSlot.set(ItemStack.EMPTY); + } else { + movedSlot.setChanged(); + } + } + + return movedStack; + } + + @Override + public boolean stillValid(Player player) { + return AbstractContainerMenu.stillValid(ContainerLevelAccess.create(this.player.level(), this.nodePos), player, isOutput ? + BMBlocks.OUTPUT_ROUTING_NODE.block().get() : BMBlocks.INPUT_ROUTING_NODE.block().get()); + } + + public class FilterSlot extends SlotItemHandler { + public FilterSlot(IItemHandler itemHandler, int index, int xPosition, int yPosition) { + super(itemHandler, index, xPosition, yPosition); + } + + @Override + public boolean isActive() { + return index == NodeFilterMenu.this.getData(DATA_SIDE); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/NodeMasterMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/NodeMasterMenu.java new file mode 100644 index 0000000000..70ba140ec6 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/menu/NodeMasterMenu.java @@ -0,0 +1,83 @@ +package wayoftime.bloodmagic.common.menu; + + +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.ItemStackHandler; +import net.neoforged.neoforge.items.SlotItemHandler; +import wayoftime.bloodmagic.common.block.BMBlocks; + +public class NodeMasterMenu extends AbstractContainerMenu { + + public NodeMasterMenu(int containerId, Inventory playerInv) { + this(containerId, playerInv, new ItemStackHandler(2)); + } + + private int playerInvStart; + private int playerInvEnd; + private int hotbarStart; + private int hotbarEnd; + public NodeMasterMenu(int containerId, Inventory playerInv, IItemHandler inv) { + super(BMMenus.MASTER_NODE.get(), containerId); + playerInvStart = inv.getSlots(); + playerInvEnd = playerInvStart + 27; + hotbarStart = playerInvEnd + 1; + hotbarEnd = hotbarStart + 9; + + this.addSlot(new SlotItemHandler(inv, 0, 62, 20)); + this.addSlot(new SlotItemHandler(inv, 1, 98, 20)); + + // player inv + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 9; j++) { + this.addSlot(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 44 + i * 18)); + } + } + + // player hotbar + for (int i = 0; i < 9; i++) { + this.addSlot(new Slot(playerInv, i, 8 + i * 18, 102)); + } + } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + ItemStack movedStack = ItemStack.EMPTY; + Slot movedSlot = this.slots.get(index); + + if (movedSlot.hasItem()) { + ItemStack rawStack = movedSlot.getItem(); + movedStack = rawStack.copy(); + + if (index <= playerInvStart) { + if (!this.moveItemStackTo(rawStack, playerInvStart, hotbarEnd, false)) { + return ItemStack.EMPTY; + } + } + + if (index > playerInvStart) { + if (!this.moveItemStackTo(rawStack, 0, playerInvStart, false)) { + return ItemStack.EMPTY; + } + } + + if (rawStack.isEmpty()) { + movedSlot.set(ItemStack.EMPTY); + } else { + movedSlot.setChanged(); + } + } + + return movedStack; + } + + @Override + public boolean stillValid(Player player) { + return AbstractContainerMenu.stillValid(ContainerLevelAccess.NULL, player, BMBlocks.MASTER_NODE.block().get()); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/menu/TrainerMenu.java b/src/main/java/wayoftime/bloodmagic/common/menu/TrainerMenu.java index 23060a4725..ca5c5be6a8 100644 --- a/src/main/java/wayoftime/bloodmagic/common/menu/TrainerMenu.java +++ b/src/main/java/wayoftime/bloodmagic/common/menu/TrainerMenu.java @@ -13,14 +13,14 @@ public class TrainerMenu extends AbstractGhostMenu { // CLIENT constructor - public TrainerMenu(int containerId, Inventory playerInv, RegistryFriendlyByteBuf buf) { - // buf -> int heldSlot - super(BMMenus.TRAINER.get(), containerId, playerInv, 3 + 16, 4, 4, 89, 15, 105, buf.readInt()); + public TrainerMenu(int containerId, Inventory playerInv) { + // buf -> int heldSlot + super(BMMenus.TRAINER.get(), containerId, playerInv, 3 + 16, 4, 4, 89, 15, 105, playerInv.selected); } // SERVER constructor - public TrainerMenu(int containerId, Inventory playerInv, GhostItemHandler handler, ContainerData trainerData, int heldSlot) { - super(BMMenus.TRAINER.get(), containerId, playerInv, trainerData, handler, 4, 4, 89, 15, 105, heldSlot); + public TrainerMenu(int containerId, Inventory playerInv, GhostItemHandler handler, ContainerData trainerData) { + super(BMMenus.TRAINER.get(), containerId, playerInv, trainerData, handler, 4, 4, 89, 15, 105, playerInv.selected); } @Override diff --git a/src/main/java/wayoftime/bloodmagic/common/network/BMPackets.java b/src/main/java/wayoftime/bloodmagic/common/network/BMPackets.java new file mode 100644 index 0000000000..5e29731b35 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/network/BMPackets.java @@ -0,0 +1,16 @@ +package wayoftime.bloodmagic.common.network; + +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +public class BMPackets { + public static void register(RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar("1"); // no clue what the version is on about, but docs say 1 so we do 1 + + registrar.playToServer( + GhostAmountPacket.TYPE, + GhostAmountPacket.STREAM_CODEC, + GhostAmountPacket::handle + ); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/network/GhostAmountPacket.java b/src/main/java/wayoftime/bloodmagic/common/network/GhostAmountPacket.java new file mode 100644 index 0000000000..a47c9c8d07 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/network/GhostAmountPacket.java @@ -0,0 +1,36 @@ +package wayoftime.bloodmagic.common.network; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; +import wayoftime.bloodmagic.common.menu.FilterMenu; + +public record GhostAmountPacket(int slot, int amount) implements CustomPacketPayload { + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(BloodMagic.rl("ghost_amount")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, GhostAmountPacket::slot, + ByteBufCodecs.VAR_INT, GhostAmountPacket::amount, + GhostAmountPacket::new + ); + + @Override + public Type type() { + return TYPE; + } + + public static void handle(GhostAmountPacket packet, IPayloadContext context) { + if (!(context.player().containerMenu instanceof FilterMenu filterMenu)) { + BloodMagic.LOGGER.warn("ghost amount packet recieved but no open filter menu"); + return; + } + ItemStack contentStack = filterMenu.handler.getStackInSlot(packet.slot); + contentStack.set(BMDataComponents.GHOST_AMOUNT, packet.amount); + filterMenu.handler.setChanged(packet.slot); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IResourceMatcher.java b/src/main/java/wayoftime/bloodmagic/common/routing/IResourceMatcher.java new file mode 100644 index 0000000000..ec4e0d9c0f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/IResourceMatcher.java @@ -0,0 +1,16 @@ +package wayoftime.bloodmagic.common.routing; + +public interface IResourceMatcher { + + boolean doesResourceMatch(T resource); + + int getCount(); + + void setCount(int count); + + void grow(int amount); + + void shrink(int amount); + + boolean isEmpty(); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java b/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java new file mode 100644 index 0000000000..606ef0b2db --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/IRoutingFilter.java @@ -0,0 +1,18 @@ +package wayoftime.bloodmagic.common.routing; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +public interface IRoutingFilter { + + void initializeFilter(List> matchList, BlockPos target, Direction interactionSide, boolean isOutput); + + ResourceLocation getTransferType(); + + T transferThroughOutputFilter(T resource); + + int transferThroughInputFilter(IRoutingFilter outputFilter, int maxTransfer); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/routing/NodeContext.java b/src/main/java/wayoftime/bloodmagic/common/routing/NodeContext.java new file mode 100644 index 0000000000..75dd176052 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/routing/NodeContext.java @@ -0,0 +1,15 @@ +package wayoftime.bloodmagic.common.routing; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +public record NodeContext(BlockPos targetPos, Direction accessSide, FilterOperation op) { + + public static final NodeContext EMPTY = new NodeContext(BlockPos.ZERO, Direction.DOWN, FilterOperation.CAP_TEST); + + public enum FilterOperation { + INPUT, + OUTPUT, + CAP_TEST + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/tag/BMTags.java b/src/main/java/wayoftime/bloodmagic/common/tag/BMTags.java index 6d574c13dd..4fa8de6107 100644 --- a/src/main/java/wayoftime/bloodmagic/common/tag/BMTags.java +++ b/src/main/java/wayoftime/bloodmagic/common/tag/BMTags.java @@ -16,6 +16,12 @@ public class BMTags { public static class Items { public static final TagKey SOUL_GEM = tag(bm("soul_gems")); + public static final TagKey NODE_DEBUGGER = tag(bm("node_debugger")); + + public static final TagKey FILTERS = tag(bm("routing_filter")); + public static final TagKey TAG_FILTER = withParent(FILTERS, bm("tag")); + public static final TagKey ENCHANT_FILTER = withParent(FILTERS, bm("enchant")); + public static final TagKey STORAGE_BLOCKS_HELLFORGED = fromBlock(Blocks.STORAGE_BLOCKS_HELLFORGED); public static final TagKey ARC_TOOL = tag(bm("arc_tool")); diff --git a/src/main/java/wayoftime/bloodmagic/util/ChatUtil.java b/src/main/java/wayoftime/bloodmagic/util/ChatUtil.java index 5ccbd58b18..49191354e5 100644 --- a/src/main/java/wayoftime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/wayoftime/bloodmagic/util/ChatUtil.java @@ -1,8 +1,36 @@ package wayoftime.bloodmagic.util; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + import java.text.DecimalFormat; public class ChatUtil { + + public static void sendChat(Player player, Component text) { + player.sendSystemMessage(text); + } + + public static String posString(BlockPos pos) { + return "%d, %d, %d".formatted(pos.getX(), pos.getY(), pos.getZ()); + } + + public static String dimensionString(ResourceKey dim) { + return "%s:%s".formatted(dim.location().getNamespace(), dim.location().getPath()); + } + + public static MutableComponent translatableHover(String key, Object... args) { + return Component.translatable(key, args).withStyle(ChatFormatting.GRAY); + } + + public static MutableComponent translatableHover(String key) { + return Component.translatable(key).withStyle(ChatFormatting.GRAY); + } public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###,###.##"); private static final char[] ones = new char[]{'I', 'X', 'C', 'M'}; diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/BlockEntityHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/BlockEntityHelper.java index fe94c12569..3203d4fbed 100644 --- a/src/main/java/wayoftime/bloodmagic/util/helper/BlockEntityHelper.java +++ b/src/main/java/wayoftime/bloodmagic/util/helper/BlockEntityHelper.java @@ -16,14 +16,6 @@ public static BlockEntityTicker) ticker : null; } - public static MutableComponent translatableHover(String key, Object... args) { - return Component.translatable(key, args).withStyle(ChatFormatting.GRAY); - } - - public static MutableComponent translatableHover(String key) { - return Component.translatable(key).withStyle(ChatFormatting.GRAY); - } - public static void dropContents(Level level, BlockPos pos, IItemHandler handler) { for (int i = 0; i < handler.getSlots(); i++) { Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i)); diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/FilterHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/FilterHelper.java new file mode 100644 index 0000000000..62824ae9bd --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/util/helper/FilterHelper.java @@ -0,0 +1,128 @@ +package wayoftime.bloodmagic.util.helper; + +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; +import wayoftime.bloodmagic.common.datacomponent.BMDataComponents; + +import java.util.ArrayList; +import java.util.List; + +public class FilterHelper { + public static final int CONTAINER_DATA_SIZE = 2 + (3 * 9); // slot/bwlist + per slot tag/enchant/enchant lvl + + public static final int DATA_SLOT = 0; + public static final int DATA_BWLIST = DATA_SLOT + 1; + public static final int DATA_TAG = DATA_BWLIST + 1; + public static final int DATA_ENCHANT = DATA_TAG + 9; + public static final int DATA_ENCHANT_LVL = DATA_ENCHANT + 9; + + public static final int BUTTON_BWLIST = 0; + public static final int BUTTON_TAG = 1; + public static final int BUTTON_ENCHANT = 2; + public static final int BUTTON_ENCHANT_LVL = 3; + public static final int BUTTON_RETURN = 4; + + public static TagKey getTag(ItemStack target, int index) { + return target.getTags().toList().get(index - 1); + } + + public static MutableComponent translate(String name) { + return Component.translatable("filter.bloodmagic." + name); + } + + public static int cycleTag(ItemStack contentStack, int index) { + index++; + List> tags = contentStack.getTags().toList(); + if (index > tags.size()) { + index = 0; + } + + return index; + } + + public static ItemEnchantments getEnchantments(ItemStack contentStack) { + ItemEnchantments enchantmentList; + if (contentStack.has(DataComponents.ENCHANTMENTS)) { + enchantmentList = contentStack.get(DataComponents.ENCHANTMENTS); + } else if (contentStack.has(DataComponents.STORED_ENCHANTMENTS)) { + enchantmentList = contentStack.get(DataComponents.STORED_ENCHANTMENTS); + } else { + // no enchantments, neither applied nor stored + return ItemEnchantments.EMPTY; + } + + return enchantmentList; + } + + public static int cycleEnchant(ItemStack contentStack, int index) { + index++; + ItemEnchantments enchantmentList = getEnchantments(contentStack); + if (index >= enchantmentList.size() + 2 || enchantmentList.isEmpty()) { + index = 0; + } + if (enchantmentList.size() == 1 && index == 1) { // state would have been 0 before, so changing from 1 to 2 means skipping over "any" if there is only 1 enchant since it'd be the same as "every" + index = 2; + } + + return index; + } + + public static List tagButtonText(ItemStack contentStack) { + List component = new ArrayList<>(); + int index = contentStack.getOrDefault(BMDataComponents.FILTER_TAG_INDEX, 0); + if (index == 0) { + component.add(translate("any_tag")); + contentStack.getTags() + .map(TagKey::location) + .map(ResourceLocation::toString) + .map(Component::literal) + .forEachOrdered(component::add); + return component; + } + + if (contentStack.has(BMDataComponents.FILTER_TAG)) { + component.add(translate("specified_tag")); + component.add(Component.literal(contentStack.get(BMDataComponents.FILTER_TAG).location().toString())); + return component; + } + + return List.of(translate("no_valid_tag")); + } + + public static List enchantButtonText(ItemStack contentStack) { + final List component = new ArrayList<>(); + int index = contentStack.getOrDefault(BMDataComponents.FILTER_ENCHANT_INDEX, 0); + ItemEnchantments enchantments = getEnchantments(contentStack); + if (enchantments.isEmpty()) { + return List.of(translate("no_enchant")); + } + if (index < 2) { + if (index == 0) { + component.add(translate("every_enchant")); + } else { + component.add(translate("any_enchant")); + } + EnchantmentHelper.runIterationOnItem(contentStack, (enchantment, level) -> { + component.add(enchantment.value().description()); + }); + } else { + component.add(translate("specified_enchant")); + component.add(enchantments.keySet().stream().toList().get(index - 2).value().description()); + } + + return component; + } + + public static List enchantLevelButtonText(ItemStack contentStack) { + int index = contentStack.getOrDefault(BMDataComponents.FILTER_ENCHANT_LEVEL, 0); + return index == 0 ? List.of(translate("enchant_lvl_exact")) : List.of(translate("enchant_lvl_any")); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/RenderHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/RenderHelper.java index ef6b6a596c..ba55893254 100644 --- a/src/main/java/wayoftime/bloodmagic/util/helper/RenderHelper.java +++ b/src/main/java/wayoftime/bloodmagic/util/helper/RenderHelper.java @@ -26,7 +26,7 @@ public static void addVertex ( VertexConsumer buf, Matrix4f matrix, float x, float y, float z, float u, float v, int colour, int light, int overlay, Vector3f norm ){ buf.addVertex(matrix, x, y, z) - .setColor(red(colour), green(colour), blue(colour), alpha(colour)) + .setColor(colour) .setUv(u, v) .setOverlay(overlay) .setLight(light) @@ -88,24 +88,4 @@ public static void addCubeAll( addVertex(buf, matrix, x0, y1, z1, u1, v1, tintColour, light, overlay, norm); addVertex(buf, matrix, x0, y0, z1, u1, v0, tintColour, light, overlay, norm); } - - public static int alpha(int colour) { - return colour >> 24 & 0xFF; - } - - public static int red(int colour) { - return colour >> 16 & 0xFF; - } - - public static int green(int colour) { - return colour >> 8 & 0xFF; - } - - public static int blue(int colour) { - return colour & 0xFF; - } - - public static int argb(int alpha, int red, int green, int blue) { - return alpha << 24 + red << 16 + green << 8 + blue; - } } diff --git a/src/main/resources/assets/bloodmagic/blockstates/doubt_block.json b/src/main/resources/assets/bloodmagic/blockstates/doubt_block.json index 1795b4324c..ce7b1e066a 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/doubt_block.json +++ b/src/main/resources/assets/bloodmagic/blockstates/doubt_block.json @@ -1,5 +1,5 @@ { "variants": { - "": "block/doubt_block" + "": "bloodmagic:block/doubt_block" } } \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/life_essence_block.json b/src/main/resources/assets/bloodmagic/blockstates/life_essence_block.json index 4648893829..5d6cfd1626 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/life_essence_block.json +++ b/src/main/resources/assets/bloodmagic/blockstates/life_essence_block.json @@ -1,5 +1,5 @@ { "variants": { - "": "block/life_essence_block" + "": "bloodmagic:block/life_essence_block" } } \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/doubt_block.json b/src/main/resources/assets/bloodmagic/models/block/doubt_block.json index 319fe5298a..e5f9a18ccd 100644 --- a/src/main/resources/assets/bloodmagic/models/block/doubt_block.json +++ b/src/main/resources/assets/bloodmagic/models/block/doubt_block.json @@ -1,3 +1,5 @@ { - "render_type": "minecraft:solid" + "textures": { + "particle": "bloodmagic:liquid_doubt_still" + } } diff --git a/src/main/resources/assets/bloodmagic/models/block/life_essence_block.json b/src/main/resources/assets/bloodmagic/models/block/life_essence_block.json index 319fe5298a..c2e90126e0 100644 --- a/src/main/resources/assets/bloodmagic/models/block/life_essence_block.json +++ b/src/main/resources/assets/bloodmagic/models/block/life_essence_block.json @@ -1,3 +1,5 @@ { - "render_type": "minecraft:solid" + "textures": { + "particle": "bloodmagic:block/life_essence_still" + } } diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.mtl b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.mtl new file mode 100755 index 0000000000..1bb26d8754 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.mtl @@ -0,0 +1,11 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +#Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +#Ks 0.8 0.8 0.8 +d 1 +#illum 2 +map_Kd #base \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.obj b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.obj new file mode 100755 index 0000000000..d0ca172f3e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodebase.obj @@ -0,0 +1,360 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib modelmasterroutingnodebase.mtl +o ModelMasterRoutingNodeBase +v 0.250000 0.062500 0.750000 +v 0.250000 -0.000000 0.750000 +v 0.750000 -0.000000 0.750000 +v 0.750000 0.062500 0.750000 +v 0.750000 0.062500 0.250000 +v 0.750000 0.000000 0.250000 +v 0.250000 0.000000 0.250000 +v 0.250000 0.062500 0.250000 +v 0.362465 0.389996 0.531250 +v 0.278129 0.024602 0.531250 +v 0.339027 0.010546 0.531250 +v 0.423364 0.375940 0.531250 +v 0.423364 0.375940 0.468750 +v 0.339027 0.010546 0.468750 +v 0.278129 0.024602 0.468750 +v 0.362465 0.389996 0.468750 +v 0.468750 0.375964 0.423360 +v 0.468750 0.010578 0.339023 +v 0.531250 0.010578 0.339023 +v 0.531250 0.375964 0.423360 +v 0.531250 0.390020 0.362462 +v 0.531250 0.024634 0.278126 +v 0.468750 0.024634 0.278126 +v 0.468750 0.390020 0.362462 +v 0.468750 0.389996 0.637535 +v 0.468750 0.024602 0.721871 +v 0.531250 0.024602 0.721871 +v 0.531250 0.389996 0.637535 +v 0.531250 0.375940 0.576636 +v 0.531250 0.010546 0.660972 +v 0.468750 0.010546 0.660972 +v 0.468750 0.375940 0.576636 +v 0.576640 0.375964 0.531250 +v 0.660976 0.010578 0.531250 +v 0.721874 0.024634 0.531250 +v 0.637538 0.390020 0.531250 +v 0.637538 0.390020 0.468750 +v 0.721874 0.024634 0.468750 +v 0.660976 0.010578 0.468750 +v 0.576640 0.375964 0.468750 +v 0.375000 0.156250 0.625000 +v 0.375000 0.031250 0.625000 +v 0.625000 0.031250 0.625000 +v 0.625000 0.156250 0.625000 +v 0.625000 0.156250 0.375000 +v 0.625000 0.031250 0.375000 +v 0.375000 0.031250 0.375000 +v 0.375000 0.156250 0.375000 +v 0.437500 0.250000 0.562500 +v 0.437500 0.125000 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.250000 0.562500 +v 0.562500 0.250000 0.437500 +v 0.562500 0.125000 0.437500 +v 0.437500 0.125000 0.437500 +v 0.437500 0.250000 0.437500 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +v 0.362465 0.389996 0.531250 +v 0.278129 0.024602 0.531250 +v 0.339027 0.010546 0.531250 +v 0.423364 0.375940 0.531250 +v 0.423364 0.375940 0.468750 +v 0.339027 0.010546 0.468750 +v 0.278129 0.024602 0.468750 +v 0.362465 0.389996 0.468750 +v 0.468750 0.375964 0.423360 +v 0.468750 0.010578 0.339023 +v 0.531250 0.010578 0.339023 +v 0.531250 0.375964 0.423360 +v 0.531250 0.390020 0.362462 +v 0.531250 0.024634 0.278126 +v 0.468750 0.024634 0.278126 +v 0.468750 0.390020 0.362462 +v 0.468750 0.389996 0.637535 +v 0.468750 0.024602 0.721871 +v 0.531250 0.024602 0.721871 +v 0.531250 0.389996 0.637535 +v 0.531250 0.375940 0.576636 +v 0.531250 0.010546 0.660972 +v 0.468750 0.010546 0.660972 +v 0.468750 0.375940 0.576636 +v 0.576640 0.375964 0.531250 +v 0.660976 0.010578 0.531250 +v 0.721874 0.024634 0.531250 +v 0.637538 0.390020 0.531250 +v 0.637538 0.390020 0.468750 +v 0.721874 0.024634 0.468750 +v 0.660976 0.010578 0.468750 +v 0.576640 0.375964 0.468750 +v 0.375000 0.156250 0.625000 +v 0.375000 0.031250 0.625000 +v 0.625000 0.031250 0.625000 +v 0.625000 0.156250 0.625000 +v 0.625000 0.156250 0.375000 +v 0.625000 0.031250 0.375000 +v 0.375000 0.031250 0.375000 +v 0.375000 0.156250 0.375000 +v 0.437500 0.250000 0.562500 +v 0.437500 0.125000 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.250000 0.562500 +v 0.562500 0.250000 0.437500 +v 0.562500 0.125000 0.437500 +v 0.437500 0.125000 0.437500 +v 0.437500 0.250000 0.437500 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +v 0.437500 0.250000 0.562500 +v 0.437500 0.125000 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.250000 0.562500 +v 0.562500 0.250000 0.437500 +v 0.562500 0.125000 0.437500 +v 0.437500 0.125000 0.437500 +v 0.437500 0.250000 0.437500 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +vt 0.140625 0.515625 +vt 0.140625 0.500000 +vt 0.265625 0.500000 +vt 0.265625 0.515625 +vt 0.390625 0.515625 +vt 0.390625 0.500000 +vt 0.515625 0.500000 +vt 0.515625 0.515625 +vt 0.140625 0.640625 +vt 0.265625 0.640625 +vt 0.390625 0.640625 +vt 0.015625 0.515625 +vt 0.015625 0.500000 +vt 0.093750 0.625000 +vt 0.093750 0.531250 +vt 0.109375 0.531250 +vt 0.109375 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.531250 +vt 0.140625 0.531250 +vt 0.140625 0.625000 +vt 0.093750 0.640625 +vt 0.109375 0.640625 +vt 0.125000 0.640625 +vt 0.078125 0.625000 +vt 0.078125 0.531250 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.046875 0.640625 +vt 0.062500 0.640625 +vt 0.078125 0.640625 +vt 0.031250 0.625000 +vt 0.031250 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.593750 0.531250 +vt 0.593750 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.531250 +vt 0.718750 0.531250 +vt 0.718750 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.531250 +vt 0.593750 0.593750 +vt 0.656250 0.593750 +vt 0.718750 0.593750 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.828125 0.531250 +vt 0.828125 0.500000 +vt 0.859375 0.500000 +vt 0.859375 0.531250 +vt 0.890625 0.531250 +vt 0.890625 0.500000 +vt 0.921875 0.500000 +vt 0.921875 0.531250 +vt 0.828125 0.562500 +vt 0.859375 0.562500 +vt 0.890625 0.562500 +vt 0.796875 0.531250 +vt 0.796875 0.500000 +vt 0.953125 0.531250 +vt 0.953125 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.531250 +vt 0.984375 0.531250 +vt 0.984375 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.531250 +vt 0.953125 0.546875 +vt 0.968750 0.546875 +vt 0.984375 0.546875 +vt 0.937500 0.531250 +vt 0.937500 0.500000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.224900 0.974400 0.000000 +vn -0.224900 -0.974400 -0.000000 +vn 0.974400 -0.224900 0.000000 +vn -0.974400 0.224900 0.000000 +vn 0.000000 -0.224900 0.974400 +vn 0.000000 0.224900 -0.974400 +vn 0.000000 0.974400 0.224900 +vn 0.000000 -0.974400 -0.224900 +vn 0.000000 0.224900 0.974400 +vn 0.000000 -0.224900 -0.974400 +vn 0.000000 0.974400 -0.224900 +vn 0.000000 -0.974400 0.224900 +vn -0.224900 0.974400 0.000000 +vn 0.224900 -0.974400 -0.000000 +vn 0.974400 0.224900 0.000000 +vn -0.974400 -0.224900 0.000000 +usemtl None +#s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 8/9/3 1/1/3 4/4/3 5/10/3 +f 2/5/4 7/11/4 6/10/4 3/4/4 +f 5/5/5 4/4/5 3/3/5 6/6/5 +f 8/12/6 7/13/6 2/2/6 1/1/6 +f 9/14/1 10/15/1 11/16/1 12/17/1 +f 13/18/2 14/19/2 15/20/2 16/21/2 +f 16/22/7 9/14/7 12/17/7 13/23/7 +f 10/18/8 15/24/8 14/23/8 11/17/8 +f 13/18/9 12/17/9 11/16/9 14/19/9 +f 16/25/10 15/26/10 10/15/10 9/14/10 +f 17/27/11 18/28/11 19/29/11 20/30/11 +f 21/25/12 22/26/12 23/15/12 24/14/12 +f 24/31/13 17/27/13 20/30/13 21/32/13 +f 18/25/14 23/33/14 22/32/14 19/30/14 +f 21/25/5 20/30/5 19/29/5 22/26/5 +f 24/34/6 23/35/6 18/28/6 17/27/6 +f 25/36/15 26/37/15 27/35/15 28/34/15 +f 29/27/16 30/28/16 31/29/16 32/30/16 +f 32/38/17 25/36/17 28/34/17 29/39/17 +f 26/27/18 31/31/18 30/39/18 27/34/18 +f 29/27/5 28/34/5 27/35/5 30/28/5 +f 32/40/6 31/41/6 26/37/6 25/36/6 +f 33/30/1 34/29/1 35/26/1 36/25/1 +f 37/14/2 38/15/2 39/16/2 40/17/2 +f 40/32/19 33/30/19 36/25/19 37/33/19 +f 34/14/20 39/22/20 38/33/20 35/25/20 +f 37/14/21 36/25/21 35/26/21 38/15/21 +f 40/27/22 39/28/22 34/29/22 33/30/22 +f 41/42/1 42/43/1 43/44/1 44/45/1 +f 45/46/2 46/47/2 47/48/2 48/49/2 +f 48/50/3 41/42/3 44/45/3 45/51/3 +f 42/46/4 47/52/4 46/51/4 43/45/4 +f 45/46/5 44/45/5 43/44/5 46/47/5 +f 48/53/6 47/54/6 42/43/6 41/42/6 +f 49/55/1 50/56/1 51/57/1 52/58/1 +f 53/59/2 54/60/2 55/61/2 56/62/2 +f 56/63/3 49/55/3 52/58/3 53/64/3 +f 50/59/4 55/65/4 54/64/4 51/58/4 +f 53/59/5 52/58/5 51/57/5 54/60/5 +f 56/66/6 55/67/6 50/56/6 49/55/6 +f 57/68/1 58/69/1 59/70/1 60/71/1 +f 61/72/2 62/73/2 63/74/2 64/75/2 +f 64/76/3 57/68/3 60/71/3 61/77/3 +f 58/72/4 63/78/4 62/77/4 59/71/4 +f 61/72/5 60/71/5 59/70/5 62/73/5 +f 64/79/6 63/80/6 58/69/6 57/68/6 +f 65/14/1 66/15/1 67/16/1 68/17/1 +f 69/18/2 70/19/2 71/20/2 72/21/2 +f 72/22/7 65/14/7 68/17/7 69/23/7 +f 66/18/8 71/24/8 70/23/8 67/17/8 +f 69/18/9 68/17/9 67/16/9 70/19/9 +f 72/25/10 71/26/10 66/15/10 65/14/10 +f 73/27/11 74/28/11 75/29/11 76/30/11 +f 77/25/12 78/26/12 79/15/12 80/14/12 +f 80/31/13 73/27/13 76/30/13 77/32/13 +f 74/25/14 79/33/14 78/32/14 75/30/14 +f 77/25/5 76/30/5 75/29/5 78/26/5 +f 80/34/6 79/35/6 74/28/6 73/27/6 +f 81/36/15 82/37/15 83/35/15 84/34/15 +f 85/27/16 86/28/16 87/29/16 88/30/16 +f 88/38/17 81/36/17 84/34/17 85/39/17 +f 82/27/18 87/31/18 86/39/18 83/34/18 +f 85/27/5 84/34/5 83/35/5 86/28/5 +f 88/40/6 87/41/6 82/37/6 81/36/6 +f 89/30/1 90/29/1 91/26/1 92/25/1 +f 93/14/2 94/15/2 95/16/2 96/17/2 +f 96/32/19 89/30/19 92/25/19 93/33/19 +f 90/14/20 95/22/20 94/33/20 91/25/20 +f 93/14/21 92/25/21 91/26/21 94/15/21 +f 96/27/22 95/28/22 90/29/22 89/30/22 +f 97/42/1 98/43/1 99/44/1 100/45/1 +f 101/46/2 102/47/2 103/48/2 104/49/2 +f 104/50/3 97/42/3 100/45/3 101/51/3 +f 98/46/4 103/52/4 102/51/4 99/45/4 +f 101/46/5 100/45/5 99/44/5 102/47/5 +f 104/53/6 103/54/6 98/43/6 97/42/6 +f 105/55/1 106/56/1 107/57/1 108/58/1 +f 109/59/2 110/60/2 111/61/2 112/62/2 +f 112/63/3 105/55/3 108/58/3 109/64/3 +f 106/59/4 111/65/4 110/64/4 107/58/4 +f 109/59/5 108/58/5 107/57/5 110/60/5 +f 112/66/6 111/67/6 106/56/6 105/55/6 +f 113/68/1 114/69/1 115/70/1 116/71/1 +f 117/72/2 118/73/2 119/74/2 120/75/2 +f 120/76/3 113/68/3 116/71/3 117/77/3 +f 114/72/4 119/78/4 118/77/4 115/71/4 +f 117/72/5 116/71/5 115/70/5 118/73/5 +f 120/79/6 119/80/6 114/69/6 113/68/6 +f 121/55/1 122/56/1 123/57/1 124/58/1 +f 125/59/2 126/60/2 127/61/2 128/62/2 +f 128/63/3 121/55/3 124/58/3 125/64/3 +f 122/59/4 127/65/4 126/64/4 123/58/4 +f 125/59/5 124/58/5 123/57/5 126/60/5 +f 128/66/6 127/67/6 122/56/6 121/55/6 +f 129/68/1 130/69/1 131/70/1 132/71/1 +f 133/72/2 134/73/2 135/74/2 136/75/2 +f 136/76/3 129/68/3 132/71/3 133/77/3 +f 130/72/4 135/78/4 134/77/4 131/71/4 +f 133/72/5 132/71/5 131/70/5 134/73/5 +f 136/79/6 135/80/6 130/69/6 129/68/6 +f 137/68/1 138/69/1 139/70/1 140/71/1 +f 141/72/2 142/73/2 143/74/2 144/75/2 +f 144/76/3 137/68/3 140/71/3 141/77/3 +f 138/72/4 143/78/4 142/77/4 139/71/4 +f 141/72/5 140/71/5 139/70/5 142/73/5 +f 144/79/6 143/80/6 138/69/6 137/68/6 diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecombined.mtl b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecombined.mtl new file mode 100755 index 0000000000..c851cf27d6 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecombined.mtl @@ -0,0 +1,24 @@ +# Blender MTL File: 'None' +# Material Count: 2 + +newmtl None +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 +map_Kd #base + +newmtl None.001 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 +map_Kd #core diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecombined.obj b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecombined.obj new file mode 100755 index 0000000000..5f6f824e58 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecombined.obj @@ -0,0 +1,637 @@ +# Blender v2.93.1 OBJ File: '' +# www.blender.org +mtllib modelmasterroutingnodecombined.mtl +o ModelMasterRoutingNodeBase +v 0.250000 0.062500 0.750000 +v 0.250000 -0.000000 0.750000 +v 0.750000 -0.000000 0.750000 +v 0.750000 0.062500 0.750000 +v 0.750000 0.062500 0.250000 +v 0.750000 -0.000000 0.250000 +v 0.250000 -0.000000 0.250000 +v 0.250000 0.062500 0.250000 +v 0.362465 0.389996 0.531250 +v 0.278129 0.024602 0.531250 +v 0.339027 0.010546 0.531250 +v 0.423364 0.375940 0.531250 +v 0.423364 0.375940 0.468750 +v 0.339027 0.010546 0.468750 +v 0.278129 0.024602 0.468750 +v 0.362465 0.389996 0.468750 +v 0.468750 0.375964 0.423360 +v 0.468750 0.010578 0.339023 +v 0.531250 0.010578 0.339023 +v 0.531250 0.375964 0.423360 +v 0.531250 0.390020 0.362462 +v 0.531250 0.024634 0.278126 +v 0.468750 0.024634 0.278126 +v 0.468750 0.390020 0.362462 +v 0.468750 0.389996 0.637535 +v 0.468750 0.024602 0.721871 +v 0.531250 0.024602 0.721871 +v 0.531250 0.389996 0.637535 +v 0.531250 0.375940 0.576636 +v 0.531250 0.010546 0.660972 +v 0.468750 0.010546 0.660972 +v 0.468750 0.375940 0.576636 +v 0.576640 0.375964 0.531250 +v 0.660976 0.010578 0.531250 +v 0.721874 0.024634 0.531250 +v 0.637538 0.390020 0.531250 +v 0.637538 0.390020 0.468750 +v 0.721874 0.024634 0.468750 +v 0.660976 0.010578 0.468750 +v 0.576640 0.375964 0.468750 +v 0.375000 0.156250 0.625000 +v 0.375000 0.031250 0.625000 +v 0.625000 0.031250 0.625000 +v 0.625000 0.156250 0.625000 +v 0.625000 0.156250 0.375000 +v 0.625000 0.031250 0.375000 +v 0.375000 0.031250 0.375000 +v 0.375000 0.156250 0.375000 +v 0.437500 0.250000 0.562500 +v 0.437500 0.125000 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.250000 0.562500 +v 0.562500 0.250000 0.437500 +v 0.562500 0.125000 0.437500 +v 0.437500 0.125000 0.437500 +v 0.437500 0.250000 0.437500 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +v 0.362465 0.389996 0.531250 +v 0.278129 0.024602 0.531250 +v 0.339027 0.010546 0.531250 +v 0.423364 0.375940 0.531250 +v 0.423364 0.375940 0.468750 +v 0.339027 0.010546 0.468750 +v 0.278129 0.024602 0.468750 +v 0.362465 0.389996 0.468750 +v 0.468750 0.375964 0.423360 +v 0.468750 0.010578 0.339023 +v 0.531250 0.010578 0.339023 +v 0.531250 0.375964 0.423360 +v 0.531250 0.390020 0.362462 +v 0.531250 0.024634 0.278126 +v 0.468750 0.024634 0.278126 +v 0.468750 0.390020 0.362462 +v 0.468750 0.389996 0.637535 +v 0.468750 0.024602 0.721871 +v 0.531250 0.024602 0.721871 +v 0.531250 0.389996 0.637535 +v 0.531250 0.375940 0.576636 +v 0.531250 0.010546 0.660972 +v 0.468750 0.010546 0.660972 +v 0.468750 0.375940 0.576636 +v 0.576640 0.375964 0.531250 +v 0.660976 0.010578 0.531250 +v 0.721874 0.024634 0.531250 +v 0.637538 0.390020 0.531250 +v 0.637538 0.390020 0.468750 +v 0.721874 0.024634 0.468750 +v 0.660976 0.010578 0.468750 +v 0.576640 0.375964 0.468750 +v 0.375000 0.156250 0.625000 +v 0.375000 0.031250 0.625000 +v 0.625000 0.031250 0.625000 +v 0.625000 0.156250 0.625000 +v 0.625000 0.156250 0.375000 +v 0.625000 0.031250 0.375000 +v 0.375000 0.031250 0.375000 +v 0.375000 0.156250 0.375000 +v 0.437500 0.250000 0.562500 +v 0.437500 0.125000 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.250000 0.562500 +v 0.562500 0.250000 0.437500 +v 0.562500 0.125000 0.437500 +v 0.437500 0.125000 0.437500 +v 0.437500 0.250000 0.437500 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +v 0.437500 0.250000 0.562500 +v 0.437500 0.125000 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.250000 0.562500 +v 0.562500 0.250000 0.437500 +v 0.562500 0.125000 0.437500 +v 0.437500 0.125000 0.437500 +v 0.437500 0.250000 0.437500 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +v 0.468750 0.343750 0.531250 +v 0.468750 0.218750 0.531250 +v 0.531250 0.218750 0.531250 +v 0.531250 0.343750 0.531250 +v 0.531250 0.343750 0.468750 +v 0.531250 0.218750 0.468750 +v 0.468750 0.218750 0.468750 +v 0.468750 0.343750 0.468750 +vt 0.140625 0.515625 +vt 0.140625 0.500000 +vt 0.265625 0.500000 +vt 0.265625 0.515625 +vt 0.390625 0.515625 +vt 0.390625 0.500000 +vt 0.515625 0.500000 +vt 0.515625 0.515625 +vt 0.140625 0.640625 +vt 0.265625 0.640625 +vt 0.390625 0.515625 +vt 0.390625 0.640625 +vt 0.265625 0.640625 +vt 0.265625 0.515625 +vt 0.015625 0.515625 +vt 0.015625 0.500000 +vt 0.093750 0.625000 +vt 0.093750 0.531250 +vt 0.109375 0.531250 +vt 0.109375 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.531250 +vt 0.140625 0.531250 +vt 0.140625 0.625000 +vt 0.093750 0.640625 +vt 0.109375 0.640625 +vt 0.125000 0.625000 +vt 0.125000 0.640625 +vt 0.109375 0.640625 +vt 0.109375 0.625000 +vt 0.078125 0.625000 +vt 0.078125 0.531250 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.078125 0.625000 +vt 0.078125 0.531250 +vt 0.093750 0.531250 +vt 0.093750 0.625000 +vt 0.046875 0.640625 +vt 0.062500 0.640625 +vt 0.078125 0.625000 +vt 0.078125 0.640625 +vt 0.062500 0.640625 +vt 0.062500 0.625000 +vt 0.031250 0.625000 +vt 0.031250 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.062500 0.625000 +vt 0.062500 0.531250 +vt 0.078125 0.531250 +vt 0.078125 0.625000 +vt 0.093750 0.625000 +vt 0.093750 0.531250 +vt 0.109375 0.531250 +vt 0.109375 0.625000 +vt 0.062500 0.640625 +vt 0.078125 0.640625 +vt 0.093750 0.625000 +vt 0.093750 0.640625 +vt 0.078125 0.640625 +vt 0.078125 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.593750 0.531250 +vt 0.593750 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.531250 +vt 0.718750 0.531250 +vt 0.718750 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.531250 +vt 0.593750 0.593750 +vt 0.656250 0.593750 +vt 0.718750 0.531250 +vt 0.718750 0.593750 +vt 0.656250 0.593750 +vt 0.656250 0.531250 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.828125 0.531250 +vt 0.828125 0.500000 +vt 0.859375 0.500000 +vt 0.859375 0.531250 +vt 0.890625 0.531250 +vt 0.890625 0.500000 +vt 0.921875 0.500000 +vt 0.921875 0.531250 +vt 0.828125 0.562500 +vt 0.859375 0.562500 +vt 0.890625 0.531250 +vt 0.890625 0.562500 +vt 0.859375 0.562500 +vt 0.859375 0.531250 +vt 0.796875 0.531250 +vt 0.796875 0.500000 +vt 0.953125 0.531250 +vt 0.953125 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.531250 +vt 0.984375 0.531250 +vt 0.984375 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.531250 +vt 0.953125 0.546875 +vt 0.968750 0.546875 +vt 0.984375 0.531250 +vt 0.984375 0.546875 +vt 0.968750 0.546875 +vt 0.968750 0.531250 +vt 0.937500 0.531250 +vt 0.937500 0.500000 +vt 0.093750 0.625000 +vt 0.093750 0.531250 +vt 0.109375 0.531250 +vt 0.109375 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.531250 +vt 0.140625 0.531250 +vt 0.140625 0.625000 +vt 0.093750 0.640625 +vt 0.109375 0.640625 +vt 0.125000 0.625000 +vt 0.125000 0.640625 +vt 0.109375 0.640625 +vt 0.109375 0.625000 +vt 0.078125 0.625000 +vt 0.078125 0.531250 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.078125 0.625000 +vt 0.078125 0.531250 +vt 0.093750 0.531250 +vt 0.093750 0.625000 +vt 0.046875 0.640625 +vt 0.062500 0.640625 +vt 0.078125 0.625000 +vt 0.078125 0.640625 +vt 0.062500 0.640625 +vt 0.062500 0.625000 +vt 0.031250 0.625000 +vt 0.031250 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.062500 0.625000 +vt 0.062500 0.531250 +vt 0.078125 0.531250 +vt 0.078125 0.625000 +vt 0.093750 0.625000 +vt 0.093750 0.531250 +vt 0.109375 0.531250 +vt 0.109375 0.625000 +vt 0.062500 0.640625 +vt 0.078125 0.640625 +vt 0.093750 0.625000 +vt 0.093750 0.640625 +vt 0.078125 0.640625 +vt 0.078125 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.593750 0.531250 +vt 0.593750 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.531250 +vt 0.718750 0.531250 +vt 0.718750 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.531250 +vt 0.593750 0.593750 +vt 0.656250 0.593750 +vt 0.718750 0.531250 +vt 0.718750 0.593750 +vt 0.656250 0.593750 +vt 0.656250 0.531250 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.828125 0.531250 +vt 0.828125 0.500000 +vt 0.859375 0.500000 +vt 0.859375 0.531250 +vt 0.890625 0.531250 +vt 0.890625 0.500000 +vt 0.921875 0.500000 +vt 0.921875 0.531250 +vt 0.828125 0.562500 +vt 0.859375 0.562500 +vt 0.890625 0.531250 +vt 0.890625 0.562500 +vt 0.859375 0.562500 +vt 0.859375 0.531250 +vt 0.796875 0.531250 +vt 0.796875 0.500000 +vt 0.953125 0.531250 +vt 0.953125 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.531250 +vt 0.984375 0.531250 +vt 0.984375 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.531250 +vt 0.953125 0.546875 +vt 0.968750 0.546875 +vt 0.984375 0.531250 +vt 0.984375 0.546875 +vt 0.968750 0.546875 +vt 0.968750 0.531250 +vt 0.937500 0.531250 +vt 0.937500 0.500000 +vt 0.828125 0.531250 +vt 0.828125 0.500000 +vt 0.859375 0.500000 +vt 0.859375 0.531250 +vt 0.890625 0.531250 +vt 0.890625 0.500000 +vt 0.921875 0.500000 +vt 0.921875 0.531250 +vt 0.828125 0.562500 +vt 0.859375 0.562500 +vt 0.890625 0.531250 +vt 0.890625 0.562500 +vt 0.859375 0.562500 +vt 0.859375 0.531250 +vt 0.796875 0.531250 +vt 0.796875 0.500000 +vt 0.953125 0.531250 +vt 0.953125 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.531250 +vt 0.984375 0.531250 +vt 0.984375 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.531250 +vt 0.953125 0.546875 +vt 0.968750 0.546875 +vt 0.984375 0.531250 +vt 0.984375 0.546875 +vt 0.968750 0.546875 +vt 0.968750 0.531250 +vt 0.937500 0.531250 +vt 0.937500 0.500000 +vt 0.953125 0.531250 +vt 0.953125 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.531250 +vt 0.984375 0.531250 +vt 0.984375 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.531250 +vt 0.953125 0.546875 +vt 0.968750 0.546875 +vt 0.984375 0.531250 +vt 0.984375 0.546875 +vt 0.968750 0.546875 +vt 0.968750 0.531250 +vt 0.937500 0.531250 +vt 0.937500 0.500000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.2249 0.9744 0.0000 +vn -0.2249 -0.9744 -0.0000 +vn 0.9744 -0.2249 0.0000 +vn -0.9744 0.2249 0.0000 +vn 0.0000 -0.2249 0.9744 +vn 0.0000 0.2249 -0.9744 +vn 0.0000 0.9744 0.2249 +vn 0.0000 -0.9744 -0.2249 +vn 0.0000 0.2249 0.9744 +vn 0.0000 -0.2249 -0.9744 +vn 0.0000 0.9744 -0.2249 +vn 0.0000 -0.9744 0.2249 +vn -0.2249 0.9744 0.0000 +vn 0.2249 -0.9744 -0.0000 +vn 0.9744 0.2249 0.0000 +vn -0.9744 -0.2249 0.0000 +usemtl None +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 8/9/3 1/1/3 4/4/3 5/10/3 +f 2/11/4 7/12/4 6/13/4 3/14/4 +f 5/5/5 4/4/5 3/3/5 6/6/5 +f 8/15/6 7/16/6 2/2/6 1/1/6 +f 9/17/1 10/18/1 11/19/1 12/20/1 +f 13/21/2 14/22/2 15/23/2 16/24/2 +f 16/25/7 9/17/7 12/20/7 13/26/7 +f 10/27/8 15/28/8 14/29/8 11/30/8 +f 13/21/9 12/20/9 11/19/9 14/22/9 +f 16/31/10 15/32/10 10/18/10 9/17/10 +f 17/33/11 18/34/11 19/35/11 20/36/11 +f 21/37/12 22/38/12 23/39/12 24/40/12 +f 24/41/13 17/33/13 20/36/13 21/42/13 +f 18/43/14 23/44/14 22/45/14 19/46/14 +f 21/37/5 20/36/5 19/35/5 22/38/5 +f 24/47/6 23/48/6 18/34/6 17/33/6 +f 25/49/15 26/50/15 27/51/15 28/52/15 +f 29/53/16 30/54/16 31/55/16 32/56/16 +f 32/57/17 25/49/17 28/52/17 29/58/17 +f 26/59/18 31/60/18 30/61/18 27/62/18 +f 29/53/5 28/52/5 27/51/5 30/54/5 +f 32/63/6 31/64/6 26/50/6 25/49/6 +f 33/65/1 34/66/1 35/67/1 36/68/1 +f 37/69/2 38/70/2 39/71/2 40/72/2 +f 40/73/19 33/65/19 36/68/19 37/74/19 +f 34/75/20 39/76/20 38/77/20 35/78/20 +f 37/69/21 36/68/21 35/67/21 38/70/21 +f 40/79/22 39/80/22 34/66/22 33/65/22 +f 41/81/1 42/82/1 43/83/1 44/84/1 +f 45/85/2 46/86/2 47/87/2 48/88/2 +f 48/89/3 41/81/3 44/84/3 45/90/3 +f 42/91/4 47/92/4 46/93/4 43/94/4 +f 45/85/5 44/84/5 43/83/5 46/86/5 +f 48/95/6 47/96/6 42/82/6 41/81/6 +f 49/97/1 50/98/1 51/99/1 52/100/1 +f 53/101/2 54/102/2 55/103/2 56/104/2 +f 56/105/3 49/97/3 52/100/3 53/106/3 +f 50/107/4 55/108/4 54/109/4 51/110/4 +f 53/101/5 52/100/5 51/99/5 54/102/5 +f 56/111/6 55/112/6 50/98/6 49/97/6 +f 57/113/1 58/114/1 59/115/1 60/116/1 +f 61/117/2 62/118/2 63/119/2 64/120/2 +f 64/121/3 57/113/3 60/116/3 61/122/3 +f 58/123/4 63/124/4 62/125/4 59/126/4 +f 61/117/5 60/116/5 59/115/5 62/118/5 +f 64/127/6 63/128/6 58/114/6 57/113/6 +f 65/129/1 66/130/1 67/131/1 68/132/1 +f 69/133/2 70/134/2 71/135/2 72/136/2 +f 72/137/7 65/129/7 68/132/7 69/138/7 +f 66/139/8 71/140/8 70/141/8 67/142/8 +f 69/133/9 68/132/9 67/131/9 70/134/9 +f 72/143/10 71/144/10 66/130/10 65/129/10 +f 73/145/11 74/146/11 75/147/11 76/148/11 +f 77/149/12 78/150/12 79/151/12 80/152/12 +f 80/153/13 73/145/13 76/148/13 77/154/13 +f 74/155/14 79/156/14 78/157/14 75/158/14 +f 77/149/5 76/148/5 75/147/5 78/150/5 +f 80/159/6 79/160/6 74/146/6 73/145/6 +f 81/161/15 82/162/15 83/163/15 84/164/15 +f 85/165/16 86/166/16 87/167/16 88/168/16 +f 88/169/17 81/161/17 84/164/17 85/170/17 +f 82/171/18 87/172/18 86/173/18 83/174/18 +f 85/165/5 84/164/5 83/163/5 86/166/5 +f 88/175/6 87/176/6 82/162/6 81/161/6 +f 89/177/1 90/178/1 91/179/1 92/180/1 +f 93/181/2 94/182/2 95/183/2 96/184/2 +f 96/185/19 89/177/19 92/180/19 93/186/19 +f 90/187/20 95/188/20 94/189/20 91/190/20 +f 93/181/21 92/180/21 91/179/21 94/182/21 +f 96/191/22 95/192/22 90/178/22 89/177/22 +f 97/193/1 98/194/1 99/195/1 100/196/1 +f 101/197/2 102/198/2 103/199/2 104/200/2 +f 104/201/3 97/193/3 100/196/3 101/202/3 +f 98/203/4 103/204/4 102/205/4 99/206/4 +f 101/197/5 100/196/5 99/195/5 102/198/5 +f 104/207/6 103/208/6 98/194/6 97/193/6 +f 105/209/1 106/210/1 107/211/1 108/212/1 +f 109/213/2 110/214/2 111/215/2 112/216/2 +f 112/217/3 105/209/3 108/212/3 109/218/3 +f 106/219/4 111/220/4 110/221/4 107/222/4 +f 109/213/5 108/212/5 107/211/5 110/214/5 +f 112/223/6 111/224/6 106/210/6 105/209/6 +f 113/225/1 114/226/1 115/227/1 116/228/1 +f 117/229/2 118/230/2 119/231/2 120/232/2 +f 120/233/3 113/225/3 116/228/3 117/234/3 +f 114/235/4 119/236/4 118/237/4 115/238/4 +f 117/229/5 116/228/5 115/227/5 118/230/5 +f 120/239/6 119/240/6 114/226/6 113/225/6 +f 121/241/1 122/242/1 123/243/1 124/244/1 +f 125/245/2 126/246/2 127/247/2 128/248/2 +f 128/249/3 121/241/3 124/244/3 125/250/3 +f 122/251/4 127/252/4 126/253/4 123/254/4 +f 125/245/5 124/244/5 123/243/5 126/246/5 +f 128/255/6 127/256/6 122/242/6 121/241/6 +f 129/257/1 130/258/1 131/259/1 132/260/1 +f 133/261/2 134/262/2 135/263/2 136/264/2 +f 136/265/3 129/257/3 132/260/3 133/266/3 +f 130/267/4 135/268/4 134/269/4 131/270/4 +f 133/261/5 132/260/5 131/259/5 134/262/5 +f 136/271/6 135/272/6 130/258/6 129/257/6 +f 137/273/1 138/274/1 139/275/1 140/276/1 +f 141/277/2 142/278/2 143/279/2 144/280/2 +f 144/281/3 137/273/3 140/276/3 141/282/3 +f 138/283/4 143/284/4 142/285/4 139/286/4 +f 141/277/5 140/276/5 139/275/5 142/278/5 +f 144/287/6 143/288/6 138/274/6 137/273/6 +o ModelMasterRoutingNodeCore +v 0.343750 0.656250 0.656250 +v 0.343750 0.343750 0.656250 +v 0.656250 0.343750 0.656250 +v 0.656250 0.656250 0.656250 +v 0.656250 0.656250 0.343750 +v 0.656250 0.343750 0.343750 +v 0.343750 0.343750 0.343750 +v 0.343750 0.656250 0.343750 +v 0.406250 0.593750 0.593750 +v 0.406250 0.406250 0.593750 +v 0.593750 0.406250 0.593750 +v 0.593750 0.593750 0.593750 +v 0.593750 0.593750 0.406250 +v 0.593750 0.406250 0.406250 +v 0.406250 0.406250 0.406250 +v 0.406250 0.593750 0.406250 +vt 0.078125 0.921875 +vt 0.078125 0.843750 +vt 0.156250 0.843750 +vt 0.156250 0.921875 +vt 0.234375 0.921875 +vt 0.234375 0.843750 +vt 0.312500 0.843750 +vt 0.312500 0.921875 +vt 0.078125 1.000000 +vt 0.156250 1.000000 +vt 0.234375 0.921875 +vt 0.234375 1.000000 +vt 0.156250 1.000000 +vt 0.156250 0.921875 +vt 0.000000 0.921875 +vt 0.000000 0.843750 +vt 0.046875 0.781250 +vt 0.046875 0.734375 +vt 0.093750 0.734375 +vt 0.093750 0.781250 +vt 0.140625 0.781250 +vt 0.140625 0.734375 +vt 0.187500 0.734375 +vt 0.187500 0.781250 +vt 0.046875 0.828125 +vt 0.093750 0.828125 +vt 0.140625 0.781250 +vt 0.140625 0.828125 +vt 0.093750 0.828125 +vt 0.093750 0.781250 +vt 0.000000 0.781250 +vt 0.000000 0.734375 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +usemtl None.001 +s 1 +f 145/289/23 146/290/23 147/291/23 148/292/23 +f 149/293/24 150/294/24 151/295/24 152/296/24 +f 152/297/25 145/289/25 148/292/25 149/298/25 +f 146/299/26 151/300/26 150/301/26 147/302/26 +f 149/293/27 148/292/27 147/291/27 150/294/27 +f 152/303/28 151/304/28 146/290/28 145/289/28 +f 153/305/23 154/306/23 155/307/23 156/308/23 +f 157/309/24 158/310/24 159/311/24 160/312/24 +f 160/313/25 153/305/25 156/308/25 157/314/25 +f 154/315/26 159/316/26 158/317/26 155/318/26 +f 157/309/27 156/308/27 155/307/27 158/310/27 +f 160/319/28 159/320/28 154/306/28 153/305/28 diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.mtl b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.mtl new file mode 100755 index 0000000000..26d04038de --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.mtl @@ -0,0 +1,11 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +#Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +#Ks 0.8 0.8 0.8 +d 1 +#illum 2 +map_Kd #core \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.obj b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.obj new file mode 100755 index 0000000000..4529d98a79 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelmasterroutingnodecore.obj @@ -0,0 +1,66 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib modelmasterroutingnodecore.mtl +o ModelMasterRoutingNodeCore +v 0.343750 0.656250 0.656250 +v 0.343750 0.343750 0.656250 +v 0.656250 0.343750 0.656250 +v 0.656250 0.656250 0.656250 +v 0.656250 0.656250 0.343750 +v 0.656250 0.343750 0.343750 +v 0.343750 0.343750 0.343750 +v 0.343750 0.656250 0.343750 +v 0.406250 0.593750 0.593750 +v 0.406250 0.406250 0.593750 +v 0.593750 0.406250 0.593750 +v 0.593750 0.593750 0.593750 +v 0.593750 0.593750 0.406250 +v 0.593750 0.406250 0.406250 +v 0.406250 0.406250 0.406250 +v 0.406250 0.593750 0.406250 +vt 0.078125 0.921875 +vt 0.078125 0.843750 +vt 0.156250 0.843750 +vt 0.156250 0.921875 +vt 0.234375 0.921875 +vt 0.234375 0.843750 +vt 0.312500 0.843750 +vt 0.312500 0.921875 +vt 0.078125 1.000000 +vt 0.156250 1.000000 +vt 0.234375 1.000000 +vt 0.000000 0.921875 +vt 0.000000 0.843750 +vt 0.046875 0.781250 +vt 0.046875 0.734375 +vt 0.093750 0.734375 +vt 0.093750 0.781250 +vt 0.140625 0.781250 +vt 0.140625 0.734375 +vt 0.187500 0.734375 +vt 0.187500 0.781250 +vt 0.046875 0.828125 +vt 0.093750 0.828125 +vt 0.140625 0.828125 +vt 0.000000 0.781250 +vt 0.000000 0.734375 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +usemtl None +#s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 8/9/3 1/1/3 4/4/3 5/10/3 +f 2/5/4 7/11/4 6/10/4 3/4/4 +f 5/5/5 4/4/5 3/3/5 6/6/5 +f 8/12/6 7/13/6 2/2/6 1/1/6 +f 9/14/1 10/15/1 11/16/1 12/17/1 +f 13/18/2 14/19/2 15/20/2 16/21/2 +f 16/22/3 9/14/3 12/17/3 13/23/3 +f 10/18/4 15/24/4 14/23/4 11/17/4 +f 13/18/5 12/17/5 11/16/5 14/19/5 +f 16/25/6 15/26/6 10/15/6 9/14/6 diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.mtl b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.mtl new file mode 100755 index 0000000000..1bb26d8754 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.mtl @@ -0,0 +1,11 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +#Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +#Ks 0.8 0.8 0.8 +d 1 +#illum 2 +map_Kd #base \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.obj b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.obj new file mode 100755 index 0000000000..52ce964321 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodebase.obj @@ -0,0 +1,444 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib modelroutingnodebase.mtl +o ModelRoutingNode +v 0.312500 0.062500 0.687500 +v 0.312500 -0.000000 0.687500 +v 0.687500 -0.000000 0.687500 +v 0.687500 0.062500 0.687500 +v 0.687500 0.062500 0.312500 +v 0.687500 0.000000 0.312500 +v 0.312500 0.000000 0.312500 +v 0.312500 0.062500 0.312500 +v 0.389168 0.422318 0.531250 +v 0.304832 0.056925 0.531250 +v 0.365731 0.042869 0.531250 +v 0.450067 0.408262 0.531250 +v 0.450067 0.408262 0.468750 +v 0.365731 0.042869 0.468750 +v 0.304832 0.056925 0.468750 +v 0.389168 0.422318 0.468750 +v 0.468750 0.408285 0.450063 +v 0.468750 0.042900 0.365726 +v 0.531250 0.042900 0.365726 +v 0.531250 0.408285 0.450063 +v 0.531250 0.422341 0.389165 +v 0.531250 0.056956 0.304829 +v 0.468750 0.056956 0.304829 +v 0.468750 0.422341 0.389165 +v 0.468750 0.422318 0.610832 +v 0.468750 0.056925 0.695168 +v 0.531250 0.056925 0.695168 +v 0.531250 0.422318 0.610832 +v 0.531250 0.408262 0.549933 +v 0.531250 0.042869 0.634269 +v 0.468750 0.042869 0.634269 +v 0.468750 0.408262 0.549933 +v 0.549937 0.408285 0.531250 +v 0.634273 0.042900 0.531250 +v 0.695171 0.056956 0.531250 +v 0.610835 0.422341 0.531250 +v 0.610835 0.422341 0.468750 +v 0.695171 0.056956 0.468750 +v 0.634273 0.042900 0.468750 +v 0.549937 0.408285 0.468750 +v 0.437500 0.125000 0.562500 +v 0.437500 0.062500 0.562500 +v 0.562500 0.062500 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.125000 0.437500 +v 0.562500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.125000 0.437500 +v 0.468750 0.187500 0.531250 +v 0.468750 0.125000 0.531250 +v 0.531250 0.125000 0.531250 +v 0.531250 0.187500 0.531250 +v 0.531250 0.187500 0.468750 +v 0.531250 0.125000 0.468750 +v 0.468750 0.125000 0.468750 +v 0.468750 0.187500 0.468750 +v 0.437500 0.062500 0.312500 +v 0.437500 0.000000 0.312500 +v 0.562500 0.000000 0.312500 +v 0.562500 0.062500 0.312500 +v 0.562500 0.062500 0.250000 +v 0.562500 0.000000 0.250000 +v 0.437500 0.000000 0.250000 +v 0.437500 0.062500 0.250000 +v 0.687500 0.062500 0.562500 +v 0.687500 -0.000000 0.562500 +v 0.750000 -0.000000 0.562500 +v 0.750000 0.062500 0.562500 +v 0.750000 0.062500 0.437500 +v 0.750000 0.000000 0.437500 +v 0.687500 0.000000 0.437500 +v 0.687500 0.062500 0.437500 +v 0.437500 0.062500 0.750000 +v 0.437500 -0.000000 0.750000 +v 0.562500 -0.000000 0.750000 +v 0.562500 0.062500 0.750000 +v 0.562500 0.062500 0.687500 +v 0.562500 -0.000000 0.687500 +v 0.437500 -0.000000 0.687500 +v 0.437500 0.062500 0.687500 +v 0.250000 0.062500 0.562500 +v 0.250000 -0.000000 0.562500 +v 0.312500 -0.000000 0.562500 +v 0.312500 0.062500 0.562500 +v 0.312500 0.062500 0.437500 +v 0.312500 0.000000 0.437500 +v 0.250000 0.000000 0.437500 +v 0.250000 0.062500 0.437500 +v 0.389168 0.422318 0.531250 +v 0.304832 0.056925 0.531250 +v 0.365731 0.042869 0.531250 +v 0.450067 0.408262 0.531250 +v 0.450067 0.408262 0.468750 +v 0.365731 0.042869 0.468750 +v 0.304832 0.056925 0.468750 +v 0.389168 0.422318 0.468750 +v 0.468750 0.408285 0.450063 +v 0.468750 0.042900 0.365726 +v 0.531250 0.042900 0.365726 +v 0.531250 0.408285 0.450063 +v 0.531250 0.422341 0.389165 +v 0.531250 0.056956 0.304829 +v 0.468750 0.056956 0.304829 +v 0.468750 0.422341 0.389165 +v 0.468750 0.422318 0.610832 +v 0.468750 0.056925 0.695168 +v 0.531250 0.056925 0.695168 +v 0.531250 0.422318 0.610832 +v 0.531250 0.408262 0.549933 +v 0.531250 0.042869 0.634269 +v 0.468750 0.042869 0.634269 +v 0.468750 0.408262 0.549933 +v 0.549937 0.408285 0.531250 +v 0.634273 0.042900 0.531250 +v 0.695171 0.056956 0.531250 +v 0.610835 0.422341 0.531250 +v 0.610835 0.422341 0.468750 +v 0.695171 0.056956 0.468750 +v 0.634273 0.042900 0.468750 +v 0.549937 0.408285 0.468750 +v 0.437500 0.125000 0.562500 +v 0.437500 0.062500 0.562500 +v 0.562500 0.062500 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.125000 0.437500 +v 0.562500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.125000 0.437500 +v 0.468750 0.187500 0.531250 +v 0.468750 0.125000 0.531250 +v 0.531250 0.125000 0.531250 +v 0.531250 0.187500 0.531250 +v 0.531250 0.187500 0.468750 +v 0.531250 0.125000 0.468750 +v 0.468750 0.125000 0.468750 +v 0.468750 0.187500 0.468750 +v 0.437500 0.062500 0.312500 +v 0.437500 0.000000 0.312500 +v 0.562500 0.000000 0.312500 +v 0.562500 0.062500 0.312500 +v 0.562500 0.062500 0.250000 +v 0.562500 0.000000 0.250000 +v 0.437500 0.000000 0.250000 +v 0.437500 0.062500 0.250000 +v 0.687500 0.062500 0.562500 +v 0.687500 -0.000000 0.562500 +v 0.750000 -0.000000 0.562500 +v 0.750000 0.062500 0.562500 +v 0.750000 0.062500 0.437500 +v 0.750000 0.000000 0.437500 +v 0.687500 0.000000 0.437500 +v 0.687500 0.062500 0.437500 +v 0.437500 0.062500 0.750000 +v 0.437500 -0.000000 0.750000 +v 0.562500 -0.000000 0.750000 +v 0.562500 0.062500 0.750000 +v 0.562500 0.062500 0.687500 +v 0.562500 -0.000000 0.687500 +v 0.437500 -0.000000 0.687500 +v 0.437500 0.062500 0.687500 +v 0.250000 0.062500 0.562500 +v 0.250000 -0.000000 0.562500 +v 0.312500 -0.000000 0.562500 +v 0.312500 0.062500 0.562500 +v 0.312500 0.062500 0.437500 +v 0.312500 0.000000 0.437500 +v 0.250000 0.000000 0.437500 +v 0.250000 0.062500 0.437500 +v 0.468750 0.187500 0.531250 +v 0.468750 0.125000 0.531250 +v 0.531250 0.125000 0.531250 +v 0.531250 0.187500 0.531250 +v 0.531250 0.187500 0.468750 +v 0.531250 0.125000 0.468750 +v 0.468750 0.125000 0.468750 +v 0.468750 0.187500 0.468750 +vt 0.093750 0.515625 +vt 0.093750 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.515625 +vt 0.281250 0.515625 +vt 0.281250 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.515625 +vt 0.093750 0.609375 +vt 0.187500 0.609375 +vt 0.281250 0.609375 +vt 0.000000 0.515625 +vt 0.000000 0.500000 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.640625 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.421875 0.515625 +vt 0.421875 0.500000 +vt 0.453125 0.500000 +vt 0.453125 0.515625 +vt 0.484375 0.515625 +vt 0.484375 0.500000 +vt 0.515625 0.500000 +vt 0.515625 0.515625 +vt 0.421875 0.546875 +vt 0.453125 0.546875 +vt 0.484375 0.546875 +vt 0.390625 0.515625 +vt 0.390625 0.500000 +vt 0.546875 0.515625 +vt 0.546875 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.515625 +vt 0.578125 0.515625 +vt 0.578125 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.515625 +vt 0.546875 0.531250 +vt 0.562500 0.531250 +vt 0.578125 0.531250 +vt 0.531250 0.515625 +vt 0.531250 0.500000 +vt 0.625000 0.515625 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.515625 +vt 0.671875 0.515625 +vt 0.671875 0.500000 +vt 0.703125 0.500000 +vt 0.703125 0.515625 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.687500 0.515625 +vt 0.687500 0.531250 +vt 0.609375 0.515625 +vt 0.609375 0.500000 +vt 0.750000 0.515625 +vt 0.750000 0.500000 +vt 0.765625 0.500000 +vt 0.765625 0.515625 +vt 0.796875 0.515625 +vt 0.796875 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.515625 +vt 0.750000 0.546875 +vt 0.765625 0.546875 +vt 0.781250 0.515625 +vt 0.781250 0.546875 +vt 0.718750 0.515625 +vt 0.718750 0.500000 +vt 0.625000 0.562500 +vt 0.625000 0.546875 +vt 0.656250 0.546875 +vt 0.656250 0.562500 +vt 0.671875 0.562500 +vt 0.671875 0.546875 +vt 0.703125 0.546875 +vt 0.703125 0.562500 +vt 0.625000 0.578125 +vt 0.656250 0.578125 +vt 0.687500 0.562500 +vt 0.687500 0.578125 +vt 0.609375 0.562500 +vt 0.609375 0.546875 +vt 0.750000 0.578125 +vt 0.750000 0.562500 +vt 0.765625 0.562500 +vt 0.765625 0.578125 +vt 0.796875 0.578125 +vt 0.796875 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.578125 +vt 0.750000 0.609375 +vt 0.765625 0.609375 +vt 0.781250 0.578125 +vt 0.781250 0.609375 +vt 0.718750 0.578125 +vt 0.718750 0.562500 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.224900 0.974400 0.000000 +vn -0.224900 -0.974400 -0.000000 +vn 0.974400 -0.224900 0.000000 +vn -0.974400 0.224900 0.000000 +vn 0.000000 -0.224900 0.974400 +vn 0.000000 0.224900 -0.974400 +vn 0.000000 0.974400 0.224900 +vn 0.000000 -0.974400 -0.224900 +vn 0.000000 0.224900 0.974400 +vn 0.000000 -0.224900 -0.974400 +vn 0.000000 0.974400 -0.224900 +vn 0.000000 -0.974400 0.224900 +vn -0.224900 0.974400 0.000000 +vn 0.224900 -0.974400 -0.000000 +vn 0.974400 0.224900 0.000000 +vn -0.974400 -0.224900 0.000000 +usemtl None +#s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 8/9/3 1/1/3 4/4/3 5/10/3 +f 2/5/4 7/11/4 6/10/4 3/4/4 +f 5/5/5 4/4/5 3/3/5 6/6/5 +f 8/12/6 7/13/6 2/2/6 1/1/6 +f 9/14/1 10/15/1 11/16/1 12/17/1 +f 13/18/2 14/19/2 15/20/2 16/21/2 +f 16/22/7 9/14/7 12/17/7 13/23/7 +f 10/18/8 15/24/8 14/23/8 11/17/8 +f 13/18/9 12/17/9 11/16/9 14/19/9 +f 16/25/10 15/26/10 10/15/10 9/14/10 +f 17/14/11 18/15/11 19/16/11 20/17/11 +f 21/18/12 22/19/12 23/20/12 24/21/12 +f 24/22/13 17/14/13 20/17/13 21/23/13 +f 18/18/14 23/24/14 22/23/14 19/17/14 +f 21/18/5 20/17/5 19/16/5 22/19/5 +f 24/25/6 23/26/6 18/15/6 17/14/6 +f 25/14/15 26/15/15 27/16/15 28/17/15 +f 29/18/16 30/19/16 31/20/16 32/21/16 +f 32/22/17 25/14/17 28/17/17 29/23/17 +f 26/18/18 31/24/18 30/23/18 27/17/18 +f 29/18/5 28/17/5 27/16/5 30/19/5 +f 32/25/6 31/26/6 26/15/6 25/14/6 +f 33/14/1 34/15/1 35/16/1 36/17/1 +f 37/18/2 38/19/2 39/20/2 40/21/2 +f 40/22/19 33/14/19 36/17/19 37/23/19 +f 34/18/20 39/24/20 38/23/20 35/17/20 +f 37/18/21 36/17/21 35/16/21 38/19/21 +f 40/25/22 39/26/22 34/15/22 33/14/22 +f 41/27/1 42/28/1 43/29/1 44/30/1 +f 45/31/2 46/32/2 47/33/2 48/34/2 +f 48/35/3 41/27/3 44/30/3 45/36/3 +f 42/31/4 47/37/4 46/36/4 43/30/4 +f 45/31/5 44/30/5 43/29/5 46/32/5 +f 48/38/6 47/39/6 42/28/6 41/27/6 +f 49/40/1 50/41/1 51/42/1 52/43/1 +f 53/44/2 54/45/2 55/46/2 56/47/2 +f 56/48/3 49/40/3 52/43/3 53/49/3 +f 50/44/4 55/50/4 54/49/4 51/43/4 +f 53/44/5 52/43/5 51/42/5 54/45/5 +f 56/51/6 55/52/6 50/41/6 49/40/6 +f 57/53/1 58/54/1 59/55/1 60/56/1 +f 61/57/2 62/58/2 63/59/2 64/60/2 +f 64/61/3 57/53/3 60/56/3 61/62/3 +f 58/63/4 63/64/4 62/62/4 59/56/4 +f 61/57/5 60/56/5 59/55/5 62/58/5 +f 64/65/6 63/66/6 58/54/6 57/53/6 +f 65/67/1 66/68/1 67/69/1 68/70/1 +f 69/71/2 70/72/2 71/73/2 72/74/2 +f 72/75/3 65/67/3 68/70/3 69/76/3 +f 66/77/4 71/78/4 70/76/4 67/70/4 +f 69/71/5 68/70/5 67/69/5 70/72/5 +f 72/79/6 71/80/6 66/68/6 65/67/6 +f 73/81/1 74/82/1 75/83/1 76/84/1 +f 77/85/2 78/86/2 79/87/2 80/88/2 +f 80/89/3 73/81/3 76/84/3 77/90/3 +f 74/91/4 79/92/4 78/90/4 75/84/4 +f 77/85/5 76/84/5 75/83/5 78/86/5 +f 80/93/6 79/94/6 74/82/6 73/81/6 +f 81/95/1 82/96/1 83/97/1 84/98/1 +f 85/99/2 86/100/2 87/101/2 88/102/2 +f 88/103/3 81/95/3 84/98/3 85/104/3 +f 82/105/4 87/106/4 86/104/4 83/98/4 +f 85/99/5 84/98/5 83/97/5 86/100/5 +f 88/107/6 87/108/6 82/96/6 81/95/6 +f 89/14/1 90/15/1 91/16/1 92/17/1 +f 93/18/2 94/19/2 95/20/2 96/21/2 +f 96/22/7 89/14/7 92/17/7 93/23/7 +f 90/18/8 95/24/8 94/23/8 91/17/8 +f 93/18/9 92/17/9 91/16/9 94/19/9 +f 96/25/10 95/26/10 90/15/10 89/14/10 +f 97/14/11 98/15/11 99/16/11 100/17/11 +f 101/18/12 102/19/12 103/20/12 104/21/12 +f 104/22/13 97/14/13 100/17/13 101/23/13 +f 98/18/14 103/24/14 102/23/14 99/17/14 +f 101/18/5 100/17/5 99/16/5 102/19/5 +f 104/25/6 103/26/6 98/15/6 97/14/6 +f 105/14/15 106/15/15 107/16/15 108/17/15 +f 109/18/16 110/19/16 111/20/16 112/21/16 +f 112/22/17 105/14/17 108/17/17 109/23/17 +f 106/18/18 111/24/18 110/23/18 107/17/18 +f 109/18/5 108/17/5 107/16/5 110/19/5 +f 112/25/6 111/26/6 106/15/6 105/14/6 +f 113/14/1 114/15/1 115/16/1 116/17/1 +f 117/18/2 118/19/2 119/20/2 120/21/2 +f 120/22/19 113/14/19 116/17/19 117/23/19 +f 114/18/20 119/24/20 118/23/20 115/17/20 +f 117/18/21 116/17/21 115/16/21 118/19/21 +f 120/25/22 119/26/22 114/15/22 113/14/22 +f 121/27/1 122/28/1 123/29/1 124/30/1 +f 125/31/2 126/32/2 127/33/2 128/34/2 +f 128/35/3 121/27/3 124/30/3 125/36/3 +f 122/31/4 127/37/4 126/36/4 123/30/4 +f 125/31/5 124/30/5 123/29/5 126/32/5 +f 128/38/6 127/39/6 122/28/6 121/27/6 +f 129/40/1 130/41/1 131/42/1 132/43/1 +f 133/44/2 134/45/2 135/46/2 136/47/2 +f 136/48/3 129/40/3 132/43/3 133/49/3 +f 130/44/4 135/50/4 134/49/4 131/43/4 +f 133/44/5 132/43/5 131/42/5 134/45/5 +f 136/51/6 135/52/6 130/41/6 129/40/6 +f 137/53/1 138/54/1 139/55/1 140/56/1 +f 141/57/2 142/58/2 143/59/2 144/60/2 +f 144/61/3 137/53/3 140/56/3 141/62/3 +f 138/63/4 143/64/4 142/62/4 139/56/4 +f 141/57/5 140/56/5 139/55/5 142/58/5 +f 144/65/6 143/66/6 138/54/6 137/53/6 +f 145/67/1 146/68/1 147/69/1 148/70/1 +f 149/71/2 150/72/2 151/73/2 152/74/2 +f 152/75/3 145/67/3 148/70/3 149/76/3 +f 146/77/4 151/78/4 150/76/4 147/70/4 +f 149/71/5 148/70/5 147/69/5 150/72/5 +f 152/79/6 151/80/6 146/68/6 145/67/6 +f 153/81/1 154/82/1 155/83/1 156/84/1 +f 157/85/2 158/86/2 159/87/2 160/88/2 +f 160/89/3 153/81/3 156/84/3 157/90/3 +f 154/91/4 159/92/4 158/90/4 155/84/4 +f 157/85/5 156/84/5 155/83/5 158/86/5 +f 160/93/6 159/94/6 154/82/6 153/81/6 +f 161/95/1 162/96/1 163/97/1 164/98/1 +f 165/99/2 166/100/2 167/101/2 168/102/2 +f 168/103/3 161/95/3 164/98/3 165/104/3 +f 162/105/4 167/106/4 166/104/4 163/98/4 +f 165/99/5 164/98/5 163/97/5 166/100/5 +f 168/107/6 167/108/6 162/96/6 161/95/6 +f 169/40/1 170/41/1 171/42/1 172/43/1 +f 173/44/2 174/45/2 175/46/2 176/47/2 +f 176/48/3 169/40/3 172/43/3 173/49/3 +f 170/44/4 175/50/4 174/49/4 171/43/4 +f 173/44/5 172/43/5 171/42/5 174/45/5 +f 176/51/6 175/52/6 170/41/6 169/40/6 diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecombined.mtl b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecombined.mtl new file mode 100755 index 0000000000..f366012a04 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecombined.mtl @@ -0,0 +1,24 @@ +# Blender MTL File: 'None' +# Material Count: 2 + +newmtl None.001 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 +map_Kd #base + +newmtl None.002 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 +map_Kd #base diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecombined.obj b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecombined.obj new file mode 100755 index 0000000000..0984b22dc1 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecombined.obj @@ -0,0 +1,757 @@ +# Blender v2.93.1 OBJ File: '' +# www.blender.org +mtllib modelroutingnodecombined.mtl +o ModelRoutingNode +v 0.312500 0.062500 0.687500 +v 0.312500 -0.000000 0.687500 +v 0.687500 -0.000000 0.687500 +v 0.687500 0.062500 0.687500 +v 0.687500 0.062500 0.312500 +v 0.687500 -0.000000 0.312500 +v 0.312500 -0.000000 0.312500 +v 0.312500 0.062500 0.312500 +v 0.389168 0.422318 0.531250 +v 0.304832 0.056925 0.531250 +v 0.365731 0.042869 0.531250 +v 0.450067 0.408262 0.531250 +v 0.450067 0.408262 0.468750 +v 0.365731 0.042869 0.468750 +v 0.304832 0.056925 0.468750 +v 0.389168 0.422318 0.468750 +v 0.468750 0.408285 0.450063 +v 0.468750 0.042900 0.365726 +v 0.531250 0.042900 0.365726 +v 0.531250 0.408285 0.450063 +v 0.531250 0.422341 0.389165 +v 0.531250 0.056956 0.304829 +v 0.468750 0.056956 0.304829 +v 0.468750 0.422341 0.389165 +v 0.468750 0.422318 0.610832 +v 0.468750 0.056925 0.695168 +v 0.531250 0.056925 0.695168 +v 0.531250 0.422318 0.610832 +v 0.531250 0.408262 0.549933 +v 0.531250 0.042869 0.634269 +v 0.468750 0.042869 0.634269 +v 0.468750 0.408262 0.549933 +v 0.549937 0.408285 0.531250 +v 0.634273 0.042900 0.531250 +v 0.695171 0.056956 0.531250 +v 0.610835 0.422341 0.531250 +v 0.610835 0.422341 0.468750 +v 0.695171 0.056956 0.468750 +v 0.634273 0.042900 0.468750 +v 0.549937 0.408285 0.468750 +v 0.437500 0.125000 0.562500 +v 0.437500 0.062500 0.562500 +v 0.562500 0.062500 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.125000 0.437500 +v 0.562500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.125000 0.437500 +v 0.468750 0.187500 0.531250 +v 0.468750 0.125000 0.531250 +v 0.531250 0.125000 0.531250 +v 0.531250 0.187500 0.531250 +v 0.531250 0.187500 0.468750 +v 0.531250 0.125000 0.468750 +v 0.468750 0.125000 0.468750 +v 0.468750 0.187500 0.468750 +v 0.437500 0.062500 0.312500 +v 0.437500 -0.000000 0.312500 +v 0.562500 -0.000000 0.312500 +v 0.562500 0.062500 0.312500 +v 0.562500 0.062500 0.250000 +v 0.562500 -0.000000 0.250000 +v 0.437500 -0.000000 0.250000 +v 0.437500 0.062500 0.250000 +v 0.687500 0.062500 0.562500 +v 0.687500 -0.000000 0.562500 +v 0.750000 -0.000000 0.562500 +v 0.750000 0.062500 0.562500 +v 0.750000 0.062500 0.437500 +v 0.750000 -0.000000 0.437500 +v 0.687500 -0.000000 0.437500 +v 0.687500 0.062500 0.437500 +v 0.437500 0.062500 0.750000 +v 0.437500 -0.000000 0.750000 +v 0.562500 -0.000000 0.750000 +v 0.562500 0.062500 0.750000 +v 0.562500 0.062500 0.687500 +v 0.562500 -0.000000 0.687500 +v 0.437500 -0.000000 0.687500 +v 0.437500 0.062500 0.687500 +v 0.250000 0.062500 0.562500 +v 0.250000 -0.000000 0.562500 +v 0.312500 -0.000000 0.562500 +v 0.312500 0.062500 0.562500 +v 0.312500 0.062500 0.437500 +v 0.312500 -0.000000 0.437500 +v 0.250000 -0.000000 0.437500 +v 0.250000 0.062500 0.437500 +v 0.389168 0.422318 0.531250 +v 0.304832 0.056925 0.531250 +v 0.365731 0.042869 0.531250 +v 0.450067 0.408262 0.531250 +v 0.450067 0.408262 0.468750 +v 0.365731 0.042869 0.468750 +v 0.304832 0.056925 0.468750 +v 0.389168 0.422318 0.468750 +v 0.468750 0.408285 0.450063 +v 0.468750 0.042900 0.365726 +v 0.531250 0.042900 0.365726 +v 0.531250 0.408285 0.450063 +v 0.531250 0.422341 0.389165 +v 0.531250 0.056956 0.304829 +v 0.468750 0.056956 0.304829 +v 0.468750 0.422341 0.389165 +v 0.468750 0.422318 0.610832 +v 0.468750 0.056925 0.695168 +v 0.531250 0.056925 0.695168 +v 0.531250 0.422318 0.610832 +v 0.531250 0.408262 0.549933 +v 0.531250 0.042869 0.634269 +v 0.468750 0.042869 0.634269 +v 0.468750 0.408262 0.549933 +v 0.549937 0.408285 0.531250 +v 0.634273 0.042900 0.531250 +v 0.695171 0.056956 0.531250 +v 0.610835 0.422341 0.531250 +v 0.610835 0.422341 0.468750 +v 0.695171 0.056956 0.468750 +v 0.634273 0.042900 0.468750 +v 0.549937 0.408285 0.468750 +v 0.437500 0.125000 0.562500 +v 0.437500 0.062500 0.562500 +v 0.562500 0.062500 0.562500 +v 0.562500 0.125000 0.562500 +v 0.562500 0.125000 0.437500 +v 0.562500 0.062500 0.437500 +v 0.437500 0.062500 0.437500 +v 0.437500 0.125000 0.437500 +v 0.468750 0.187500 0.531250 +v 0.468750 0.125000 0.531250 +v 0.531250 0.125000 0.531250 +v 0.531250 0.187500 0.531250 +v 0.531250 0.187500 0.468750 +v 0.531250 0.125000 0.468750 +v 0.468750 0.125000 0.468750 +v 0.468750 0.187500 0.468750 +v 0.437500 0.062500 0.312500 +v 0.437500 -0.000000 0.312500 +v 0.562500 -0.000000 0.312500 +v 0.562500 0.062500 0.312500 +v 0.562500 0.062500 0.250000 +v 0.562500 -0.000000 0.250000 +v 0.437500 -0.000000 0.250000 +v 0.437500 0.062500 0.250000 +v 0.687500 0.062500 0.562500 +v 0.687500 -0.000000 0.562500 +v 0.750000 -0.000000 0.562500 +v 0.750000 0.062500 0.562500 +v 0.750000 0.062500 0.437500 +v 0.750000 -0.000000 0.437500 +v 0.687500 -0.000000 0.437500 +v 0.687500 0.062500 0.437500 +v 0.437500 0.062500 0.750000 +v 0.437500 -0.000000 0.750000 +v 0.562500 -0.000000 0.750000 +v 0.562500 0.062500 0.750000 +v 0.562500 0.062500 0.687500 +v 0.562500 -0.000000 0.687500 +v 0.437500 -0.000000 0.687500 +v 0.437500 0.062500 0.687500 +v 0.250000 0.062500 0.562500 +v 0.250000 -0.000000 0.562500 +v 0.312500 -0.000000 0.562500 +v 0.312500 0.062500 0.562500 +v 0.312500 0.062500 0.437500 +v 0.312500 -0.000000 0.437500 +v 0.250000 -0.000000 0.437500 +v 0.250000 0.062500 0.437500 +v 0.468750 0.187500 0.531250 +v 0.468750 0.125000 0.531250 +v 0.531250 0.125000 0.531250 +v 0.531250 0.187500 0.531250 +v 0.531250 0.187500 0.468750 +v 0.531250 0.125000 0.468750 +v 0.468750 0.125000 0.468750 +v 0.468750 0.187500 0.468750 +vt 0.093750 0.515625 +vt 0.093750 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.515625 +vt 0.281250 0.515625 +vt 0.281250 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.515625 +vt 0.093750 0.609375 +vt 0.187500 0.609375 +vt 0.281250 0.515625 +vt 0.281250 0.609375 +vt 0.187500 0.609375 +vt 0.187500 0.515625 +vt 0.000000 0.515625 +vt 0.000000 0.500000 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.421875 0.515625 +vt 0.421875 0.500000 +vt 0.453125 0.500000 +vt 0.453125 0.515625 +vt 0.484375 0.515625 +vt 0.484375 0.500000 +vt 0.515625 0.500000 +vt 0.515625 0.515625 +vt 0.421875 0.546875 +vt 0.453125 0.546875 +vt 0.484375 0.515625 +vt 0.484375 0.546875 +vt 0.453125 0.546875 +vt 0.453125 0.515625 +vt 0.390625 0.515625 +vt 0.390625 0.500000 +vt 0.546875 0.515625 +vt 0.546875 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.515625 +vt 0.578125 0.515625 +vt 0.578125 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.515625 +vt 0.546875 0.531250 +vt 0.562500 0.531250 +vt 0.578125 0.515625 +vt 0.578125 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.515625 +vt 0.531250 0.515625 +vt 0.531250 0.500000 +vt 0.625000 0.515625 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.515625 +vt 0.671875 0.515625 +vt 0.671875 0.500000 +vt 0.703125 0.500000 +vt 0.703125 0.515625 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.687500 0.515625 +vt 0.687500 0.531250 +vt 0.656250 0.531250 +vt 0.656250 0.515625 +vt 0.609375 0.515625 +vt 0.609375 0.500000 +vt 0.750000 0.515625 +vt 0.750000 0.500000 +vt 0.765625 0.500000 +vt 0.765625 0.515625 +vt 0.796875 0.515625 +vt 0.796875 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.515625 +vt 0.750000 0.546875 +vt 0.765625 0.546875 +vt 0.781250 0.515625 +vt 0.781250 0.546875 +vt 0.765625 0.546875 +vt 0.765625 0.515625 +vt 0.718750 0.515625 +vt 0.718750 0.500000 +vt 0.625000 0.562500 +vt 0.625000 0.546875 +vt 0.656250 0.546875 +vt 0.656250 0.562500 +vt 0.671875 0.562500 +vt 0.671875 0.546875 +vt 0.703125 0.546875 +vt 0.703125 0.562500 +vt 0.625000 0.578125 +vt 0.656250 0.578125 +vt 0.687500 0.562500 +vt 0.687500 0.578125 +vt 0.656250 0.578125 +vt 0.656250 0.562500 +vt 0.609375 0.562500 +vt 0.609375 0.546875 +vt 0.750000 0.578125 +vt 0.750000 0.562500 +vt 0.765625 0.562500 +vt 0.765625 0.578125 +vt 0.796875 0.578125 +vt 0.796875 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.578125 +vt 0.750000 0.609375 +vt 0.765625 0.609375 +vt 0.781250 0.578125 +vt 0.781250 0.609375 +vt 0.765625 0.609375 +vt 0.765625 0.578125 +vt 0.718750 0.578125 +vt 0.718750 0.562500 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.015625 0.625000 +vt 0.015625 0.531250 +vt 0.031250 0.531250 +vt 0.031250 0.625000 +vt 0.046875 0.625000 +vt 0.046875 0.531250 +vt 0.062500 0.531250 +vt 0.062500 0.625000 +vt 0.015625 0.640625 +vt 0.031250 0.640625 +vt 0.046875 0.625000 +vt 0.046875 0.640625 +vt 0.031250 0.640625 +vt 0.031250 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.531250 +vt 0.421875 0.515625 +vt 0.421875 0.500000 +vt 0.453125 0.500000 +vt 0.453125 0.515625 +vt 0.484375 0.515625 +vt 0.484375 0.500000 +vt 0.515625 0.500000 +vt 0.515625 0.515625 +vt 0.421875 0.546875 +vt 0.453125 0.546875 +vt 0.484375 0.515625 +vt 0.484375 0.546875 +vt 0.453125 0.546875 +vt 0.453125 0.515625 +vt 0.390625 0.515625 +vt 0.390625 0.500000 +vt 0.546875 0.515625 +vt 0.546875 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.515625 +vt 0.578125 0.515625 +vt 0.578125 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.515625 +vt 0.546875 0.531250 +vt 0.562500 0.531250 +vt 0.578125 0.515625 +vt 0.578125 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.515625 +vt 0.531250 0.515625 +vt 0.531250 0.500000 +vt 0.625000 0.515625 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.515625 +vt 0.671875 0.515625 +vt 0.671875 0.500000 +vt 0.703125 0.500000 +vt 0.703125 0.515625 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.687500 0.515625 +vt 0.687500 0.531250 +vt 0.656250 0.531250 +vt 0.656250 0.515625 +vt 0.609375 0.515625 +vt 0.609375 0.500000 +vt 0.750000 0.515625 +vt 0.750000 0.500000 +vt 0.765625 0.500000 +vt 0.765625 0.515625 +vt 0.796875 0.515625 +vt 0.796875 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.515625 +vt 0.750000 0.546875 +vt 0.765625 0.546875 +vt 0.781250 0.515625 +vt 0.781250 0.546875 +vt 0.765625 0.546875 +vt 0.765625 0.515625 +vt 0.718750 0.515625 +vt 0.718750 0.500000 +vt 0.625000 0.562500 +vt 0.625000 0.546875 +vt 0.656250 0.546875 +vt 0.656250 0.562500 +vt 0.671875 0.562500 +vt 0.671875 0.546875 +vt 0.703125 0.546875 +vt 0.703125 0.562500 +vt 0.625000 0.578125 +vt 0.656250 0.578125 +vt 0.687500 0.562500 +vt 0.687500 0.578125 +vt 0.656250 0.578125 +vt 0.656250 0.562500 +vt 0.609375 0.562500 +vt 0.609375 0.546875 +vt 0.750000 0.578125 +vt 0.750000 0.562500 +vt 0.765625 0.562500 +vt 0.765625 0.578125 +vt 0.796875 0.578125 +vt 0.796875 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.578125 +vt 0.750000 0.609375 +vt 0.765625 0.609375 +vt 0.781250 0.578125 +vt 0.781250 0.609375 +vt 0.765625 0.609375 +vt 0.765625 0.578125 +vt 0.718750 0.578125 +vt 0.718750 0.562500 +vt 0.546875 0.515625 +vt 0.546875 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.515625 +vt 0.578125 0.515625 +vt 0.578125 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.515625 +vt 0.546875 0.531250 +vt 0.562500 0.531250 +vt 0.578125 0.515625 +vt 0.578125 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.515625 +vt 0.531250 0.515625 +vt 0.531250 0.500000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.2249 0.9744 0.0000 +vn -0.2249 -0.9744 -0.0000 +vn 0.9744 -0.2249 0.0000 +vn -0.9744 0.2249 0.0000 +vn 0.0000 -0.2249 0.9744 +vn 0.0000 0.2249 -0.9744 +vn 0.0000 0.9744 0.2249 +vn 0.0000 -0.9744 -0.2249 +vn 0.0000 0.2249 0.9744 +vn 0.0000 -0.2249 -0.9744 +vn 0.0000 0.9744 -0.2249 +vn 0.0000 -0.9744 0.2249 +vn -0.2249 0.9744 0.0000 +vn 0.2249 -0.9744 -0.0000 +vn 0.9744 0.2249 0.0000 +vn -0.9744 -0.2249 0.0000 +usemtl None.001 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 8/9/3 1/1/3 4/4/3 5/10/3 +f 2/11/4 7/12/4 6/13/4 3/14/4 +f 5/5/5 4/4/5 3/3/5 6/6/5 +f 8/15/6 7/16/6 2/2/6 1/1/6 +f 9/17/1 10/18/1 11/19/1 12/20/1 +f 13/21/2 14/22/2 15/23/2 16/24/2 +f 16/25/7 9/17/7 12/20/7 13/26/7 +f 10/27/8 15/28/8 14/29/8 11/30/8 +f 13/21/9 12/20/9 11/19/9 14/22/9 +f 16/31/10 15/32/10 10/18/10 9/17/10 +f 17/33/11 18/34/11 19/35/11 20/36/11 +f 21/37/12 22/38/12 23/39/12 24/40/12 +f 24/41/13 17/33/13 20/36/13 21/42/13 +f 18/43/14 23/44/14 22/45/14 19/46/14 +f 21/37/5 20/36/5 19/35/5 22/38/5 +f 24/47/6 23/48/6 18/34/6 17/33/6 +f 25/49/15 26/50/15 27/51/15 28/52/15 +f 29/53/16 30/54/16 31/55/16 32/56/16 +f 32/57/17 25/49/17 28/52/17 29/58/17 +f 26/59/18 31/60/18 30/61/18 27/62/18 +f 29/53/5 28/52/5 27/51/5 30/54/5 +f 32/63/6 31/64/6 26/50/6 25/49/6 +f 33/65/1 34/66/1 35/67/1 36/68/1 +f 37/69/2 38/70/2 39/71/2 40/72/2 +f 40/73/19 33/65/19 36/68/19 37/74/19 +f 34/75/20 39/76/20 38/77/20 35/78/20 +f 37/69/21 36/68/21 35/67/21 38/70/21 +f 40/79/22 39/80/22 34/66/22 33/65/22 +f 41/81/1 42/82/1 43/83/1 44/84/1 +f 45/85/2 46/86/2 47/87/2 48/88/2 +f 48/89/3 41/81/3 44/84/3 45/90/3 +f 42/91/4 47/92/4 46/93/4 43/94/4 +f 45/85/5 44/84/5 43/83/5 46/86/5 +f 48/95/6 47/96/6 42/82/6 41/81/6 +f 49/97/1 50/98/1 51/99/1 52/100/1 +f 53/101/2 54/102/2 55/103/2 56/104/2 +f 56/105/3 49/97/3 52/100/3 53/106/3 +f 50/107/4 55/108/4 54/109/4 51/110/4 +f 53/101/5 52/100/5 51/99/5 54/102/5 +f 56/111/6 55/112/6 50/98/6 49/97/6 +f 57/113/1 58/114/1 59/115/1 60/116/1 +f 61/117/2 62/118/2 63/119/2 64/120/2 +f 64/121/3 57/113/3 60/116/3 61/122/3 +f 58/123/4 63/124/4 62/125/4 59/126/4 +f 61/117/5 60/116/5 59/115/5 62/118/5 +f 64/127/6 63/128/6 58/114/6 57/113/6 +f 65/129/1 66/130/1 67/131/1 68/132/1 +f 69/133/2 70/134/2 71/135/2 72/136/2 +f 72/137/3 65/129/3 68/132/3 69/138/3 +f 66/139/4 71/140/4 70/141/4 67/142/4 +f 69/133/5 68/132/5 67/131/5 70/134/5 +f 72/143/6 71/144/6 66/130/6 65/129/6 +f 73/145/1 74/146/1 75/147/1 76/148/1 +f 77/149/2 78/150/2 79/151/2 80/152/2 +f 80/153/3 73/145/3 76/148/3 77/154/3 +f 74/155/4 79/156/4 78/157/4 75/158/4 +f 77/149/5 76/148/5 75/147/5 78/150/5 +f 80/159/6 79/160/6 74/146/6 73/145/6 +f 81/161/1 82/162/1 83/163/1 84/164/1 +f 85/165/2 86/166/2 87/167/2 88/168/2 +f 88/169/3 81/161/3 84/164/3 85/170/3 +f 82/171/4 87/172/4 86/173/4 83/174/4 +f 85/165/5 84/164/5 83/163/5 86/166/5 +f 88/175/6 87/176/6 82/162/6 81/161/6 +f 89/177/1 90/178/1 91/179/1 92/180/1 +f 93/181/2 94/182/2 95/183/2 96/184/2 +f 96/185/7 89/177/7 92/180/7 93/186/7 +f 90/187/8 95/188/8 94/189/8 91/190/8 +f 93/181/9 92/180/9 91/179/9 94/182/9 +f 96/191/10 95/192/10 90/178/10 89/177/10 +f 97/193/11 98/194/11 99/195/11 100/196/11 +f 101/197/12 102/198/12 103/199/12 104/200/12 +f 104/201/13 97/193/13 100/196/13 101/202/13 +f 98/203/14 103/204/14 102/205/14 99/206/14 +f 101/197/5 100/196/5 99/195/5 102/198/5 +f 104/207/6 103/208/6 98/194/6 97/193/6 +f 105/209/15 106/210/15 107/211/15 108/212/15 +f 109/213/16 110/214/16 111/215/16 112/216/16 +f 112/217/17 105/209/17 108/212/17 109/218/17 +f 106/219/18 111/220/18 110/221/18 107/222/18 +f 109/213/5 108/212/5 107/211/5 110/214/5 +f 112/223/6 111/224/6 106/210/6 105/209/6 +f 113/225/1 114/226/1 115/227/1 116/228/1 +f 117/229/2 118/230/2 119/231/2 120/232/2 +f 120/233/19 113/225/19 116/228/19 117/234/19 +f 114/235/20 119/236/20 118/237/20 115/238/20 +f 117/229/21 116/228/21 115/227/21 118/230/21 +f 120/239/22 119/240/22 114/226/22 113/225/22 +f 121/241/1 122/242/1 123/243/1 124/244/1 +f 125/245/2 126/246/2 127/247/2 128/248/2 +f 128/249/3 121/241/3 124/244/3 125/250/3 +f 122/251/4 127/252/4 126/253/4 123/254/4 +f 125/245/5 124/244/5 123/243/5 126/246/5 +f 128/255/6 127/256/6 122/242/6 121/241/6 +f 129/257/1 130/258/1 131/259/1 132/260/1 +f 133/261/2 134/262/2 135/263/2 136/264/2 +f 136/265/3 129/257/3 132/260/3 133/266/3 +f 130/267/4 135/268/4 134/269/4 131/270/4 +f 133/261/5 132/260/5 131/259/5 134/262/5 +f 136/271/6 135/272/6 130/258/6 129/257/6 +f 137/273/1 138/274/1 139/275/1 140/276/1 +f 141/277/2 142/278/2 143/279/2 144/280/2 +f 144/281/3 137/273/3 140/276/3 141/282/3 +f 138/283/4 143/284/4 142/285/4 139/286/4 +f 141/277/5 140/276/5 139/275/5 142/278/5 +f 144/287/6 143/288/6 138/274/6 137/273/6 +f 145/289/1 146/290/1 147/291/1 148/292/1 +f 149/293/2 150/294/2 151/295/2 152/296/2 +f 152/297/3 145/289/3 148/292/3 149/298/3 +f 146/299/4 151/300/4 150/301/4 147/302/4 +f 149/293/5 148/292/5 147/291/5 150/294/5 +f 152/303/6 151/304/6 146/290/6 145/289/6 +f 153/305/1 154/306/1 155/307/1 156/308/1 +f 157/309/2 158/310/2 159/311/2 160/312/2 +f 160/313/3 153/305/3 156/308/3 157/314/3 +f 154/315/4 159/316/4 158/317/4 155/318/4 +f 157/309/5 156/308/5 155/307/5 158/310/5 +f 160/319/6 159/320/6 154/306/6 153/305/6 +f 161/321/1 162/322/1 163/323/1 164/324/1 +f 165/325/2 166/326/2 167/327/2 168/328/2 +f 168/329/3 161/321/3 164/324/3 165/330/3 +f 162/331/4 167/332/4 166/333/4 163/334/4 +f 165/325/5 164/324/5 163/323/5 166/326/5 +f 168/335/6 167/336/6 162/322/6 161/321/6 +f 169/337/1 170/338/1 171/339/1 172/340/1 +f 173/341/2 174/342/2 175/343/2 176/344/2 +f 176/345/3 169/337/3 172/340/3 173/346/3 +f 170/347/4 175/348/4 174/349/4 171/350/4 +f 173/341/5 172/340/5 171/339/5 174/342/5 +f 176/351/6 175/352/6 170/338/6 169/337/6 +o ModelRoutingNodeCore +v 0.375000 0.625000 0.625000 +v 0.375000 0.375000 0.625000 +v 0.625000 0.375000 0.625000 +v 0.625000 0.625000 0.625000 +v 0.625000 0.625000 0.375000 +v 0.625000 0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 0.625000 0.375000 +v 0.437500 0.562500 0.562500 +v 0.437500 0.437500 0.562500 +v 0.562500 0.437500 0.562500 +v 0.562500 0.562500 0.562500 +v 0.562500 0.562500 0.437500 +v 0.562500 0.437500 0.437500 +v 0.437500 0.437500 0.437500 +v 0.437500 0.562500 0.437500 +vt 0.062500 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.937500 +vt 0.062500 1.000000 +vt 0.125000 1.000000 +vt 0.187500 0.937500 +vt 0.187500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.937500 +vt 0.000000 0.937500 +vt 0.000000 0.875000 +vt 0.031250 0.796875 +vt 0.031250 0.765625 +vt 0.062500 0.765625 +vt 0.062500 0.796875 +vt 0.093750 0.796875 +vt 0.093750 0.765625 +vt 0.125000 0.765625 +vt 0.125000 0.796875 +vt 0.031250 0.828125 +vt 0.062500 0.828125 +vt 0.093750 0.796875 +vt 0.093750 0.828125 +vt 0.062500 0.828125 +vt 0.062500 0.796875 +vt 0.000000 0.796875 +vt 0.000000 0.765625 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +usemtl None.002 +s 1 +f 177/353/23 178/354/23 179/355/23 180/356/23 +f 181/357/24 182/358/24 183/359/24 184/360/24 +f 184/361/25 177/353/25 180/356/25 181/362/25 +f 178/363/26 183/364/26 182/365/26 179/366/26 +f 181/357/27 180/356/27 179/355/27 182/358/27 +f 184/367/28 183/368/28 178/354/28 177/353/28 +f 185/369/23 186/370/23 187/371/23 188/372/23 +f 189/373/24 190/374/24 191/375/24 192/376/24 +f 192/377/25 185/369/25 188/372/25 189/378/25 +f 186/379/26 191/380/26 190/381/26 187/382/26 +f 189/373/27 188/372/27 187/371/27 190/374/27 +f 192/383/28 191/384/28 186/370/28 185/369/28 diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.mtl b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.mtl new file mode 100755 index 0000000000..26d04038de --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.mtl @@ -0,0 +1,11 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +#Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +#Ks 0.8 0.8 0.8 +d 1 +#illum 2 +map_Kd #core \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.obj b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.obj new file mode 100755 index 0000000000..4484ec38a7 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing/modelroutingnodecore.obj @@ -0,0 +1,66 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib modelroutingnodecore.mtl +o ModelRoutingNodeCore +v 0.375000 0.625000 0.625000 +v 0.375000 0.375000 0.625000 +v 0.625000 0.375000 0.625000 +v 0.625000 0.625000 0.625000 +v 0.625000 0.625000 0.375000 +v 0.625000 0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 0.625000 0.375000 +v 0.437500 0.562500 0.562500 +v 0.437500 0.437500 0.562500 +v 0.562500 0.437500 0.562500 +v 0.562500 0.562500 0.562500 +v 0.562500 0.562500 0.437500 +v 0.562500 0.437500 0.437500 +v 0.437500 0.437500 0.437500 +v 0.437500 0.562500 0.437500 +vt 0.062500 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.937500 +vt 0.062500 1.000000 +vt 0.125000 1.000000 +vt 0.187500 1.000000 +vt 0.000000 0.937500 +vt 0.000000 0.875000 +vt 0.031250 0.796875 +vt 0.031250 0.765625 +vt 0.062500 0.765625 +vt 0.062500 0.796875 +vt 0.093750 0.796875 +vt 0.093750 0.765625 +vt 0.125000 0.765625 +vt 0.125000 0.796875 +vt 0.031250 0.828125 +vt 0.062500 0.828125 +vt 0.093750 0.828125 +vt 0.000000 0.796875 +vt 0.000000 0.765625 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +usemtl None +#s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 8/9/3 1/1/3 4/4/3 5/10/3 +f 2/5/4 7/11/4 6/10/4 3/4/4 +f 5/5/5 4/4/5 3/3/5 6/6/5 +f 8/12/6 7/13/6 2/2/6 1/1/6 +f 9/14/1 10/15/1 11/16/1 12/17/1 +f 13/18/2 14/19/2 15/20/2 16/21/2 +f 16/22/3 9/14/3 12/17/3 13/23/3 +f 10/18/4 15/24/4 14/23/4 11/17/4 +f 13/18/5 12/17/5 11/16/5 14/19/5 +f 16/25/6 15/26/6 10/15/6 9/14/6 diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_base.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_base.json new file mode 100755 index 0000000000..7e856e14c5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_base.json @@ -0,0 +1,10 @@ +{ + "parent": "block/block", + "loader": "neoforge:obj", + "flip_v": true, + "model": "bloodmagic:models/block/routing/modelroutingnodebase.obj", + "textures": { + "base": "bloodmagic:block/routing_node", + "particle": "#base" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_base_input.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_base_input.json new file mode 100644 index 0000000000..f395756933 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_base_input.json @@ -0,0 +1,6 @@ +{ + "parent": "bloodmagic:block/routing_node_base", + "textures": { + "base": "bloodmagic:block/routing_node_input" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_base_master.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_base_master.json new file mode 100755 index 0000000000..5efb673e7a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_base_master.json @@ -0,0 +1,10 @@ +{ + "parent": "block/block", + "loader": "neoforge:obj", + "flip_v": true, + "model": "bloodmagic:models/block/routing/modelmasterroutingnodebase.obj", + "textures": { + "base": "bloodmagic:block/routing_node_master", + "particle": "#base" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_base_output.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_base_output.json new file mode 100644 index 0000000000..d5bc5847cd --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_base_output.json @@ -0,0 +1,6 @@ +{ + "parent": "bloodmagic:block/routing_node_base", + "textures": { + "base": "bloodmagic:block/routing_node_output" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_core.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_core.json new file mode 100755 index 0000000000..fbd7a2735f --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_core.json @@ -0,0 +1,11 @@ +{ + "parent": "block/block", + "render_type": "minecraft:translucent", + "loader": "neoforge:obj", + "flip_v": true, + "model": "bloodmagic:models/block/routing/modelroutingnodecore.obj", + "textures": { + "core": "bloodmagic:block/routing_node", + "particle": "#core" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_core_input.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_core_input.json new file mode 100644 index 0000000000..5d9b20f08a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_core_input.json @@ -0,0 +1,6 @@ +{ + "parent": "bloodmagic:block/routing_node_core", + "textures": { + "core": "bloodmagic:block/routing_node_input" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_core_master.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_core_master.json new file mode 100755 index 0000000000..46b2962a83 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_core_master.json @@ -0,0 +1,11 @@ +{ + "parent": "block/block", + "render_type": "minecraft:translucent", + "loader": "neoforge:obj", + "flip_v": true, + "model": "bloodmagic:models/block/routing/modelmasterroutingnodecore.obj", + "textures": { + "core": "bloodmagic:block/routing_node_master", + "particle": "#core" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/routing_node_core_output.json b/src/main/resources/assets/bloodmagic/models/block/routing_node_core_output.json new file mode 100644 index 0000000000..e6d0973f8d --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/routing_node_core_output.json @@ -0,0 +1,6 @@ +{ + "parent": "bloodmagic:block/routing_node_core", + "textures": { + "core": "bloodmagic:block/routing_node_output" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/routing_node.json b/src/main/resources/assets/bloodmagic/models/item/routing_node.json new file mode 100755 index 0000000000..b955503307 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/routing_node.json @@ -0,0 +1,11 @@ +{ + "parent": "block/block", + "loader": "neoforge:obj", + "flip_v": true, + "model": "bloodmagic:models/block/routing/modelroutingnodecombined.obj", + "textures": { + "core": "bloodmagic:block/routing_node", + "base": "bloodmagic:block/routing_node", + "particle": "#core" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/routing_node_input.json b/src/main/resources/assets/bloodmagic/models/item/routing_node_input.json new file mode 100644 index 0000000000..ab727ff1e2 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/routing_node_input.json @@ -0,0 +1,7 @@ +{ + "parent": "bloodmagic:item/routing_node", + "textures": { + "core": "bloodmagic:block/routing_node_input", + "base": "bloodmagic:block/routing_node_input" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/routing_node_master.json b/src/main/resources/assets/bloodmagic/models/item/routing_node_master.json new file mode 100755 index 0000000000..67598ea114 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/routing_node_master.json @@ -0,0 +1,11 @@ +{ + "parent": "block/block", + "loader": "neoforge:obj", + "flip_v": true, + "model": "bloodmagic:models/block/routing/modelmasterroutingnodecombined.obj", + "textures": { + "core": "bloodmagic:block/routing_node_master", + "base": "bloodmagic:block/routing_node_master", + "particle": "#core" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/routing_node_output.json b/src/main/resources/assets/bloodmagic/models/item/routing_node_output.json new file mode 100644 index 0000000000..b32a47d1c8 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/routing_node_output.json @@ -0,0 +1,7 @@ +{ + "parent": "bloodmagic:item/routing_node", + "textures": { + "core": "bloodmagic:block/routing_node_output", + "base": "bloodmagic:block/routing_node_output" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/textures/block/crystal_corrosive.png b/src/main/resources/assets/bloodmagic/textures/block/crystal_corrosive.png new file mode 100755 index 0000000000..27f6c52b86 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/crystal_corrosive.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/crystal_default.png b/src/main/resources/assets/bloodmagic/textures/block/crystal_default.png new file mode 100755 index 0000000000..cbdab18199 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/crystal_default.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/crystal_destructive.png b/src/main/resources/assets/bloodmagic/textures/block/crystal_destructive.png new file mode 100755 index 0000000000..f526b6a257 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/crystal_destructive.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/crystal_steadfast.png b/src/main/resources/assets/bloodmagic/textures/block/crystal_steadfast.png new file mode 100755 index 0000000000..7f93d339cf Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/crystal_steadfast.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/crystal_vengeful.png b/src/main/resources/assets/bloodmagic/textures/block/crystal_vengeful.png new file mode 100755 index 0000000000..5f70782552 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/crystal_vengeful.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_corrosive.png b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_corrosive.png new file mode 100755 index 0000000000..f8ce429db8 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_corrosive.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/hellforged_block.png b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_default.png old mode 100644 new mode 100755 similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/block/hellforged_block.png rename to src/main/resources/assets/bloodmagic/textures/block/hellforged_block_default.png diff --git a/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_destructive.png b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_destructive.png new file mode 100755 index 0000000000..6ca45881b3 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_destructive.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_steadfast.png b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_steadfast.png new file mode 100755 index 0000000000..d6d52598bb Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_steadfast.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_vengeful.png b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_vengeful.png new file mode 100755 index 0000000000..774c0e21ba Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/hellforged_block_vengeful.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/routing_node.png b/src/main/resources/assets/bloodmagic/textures/block/routing_node.png new file mode 100755 index 0000000000..e51bb21138 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/routing_node.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/routing_node_input.png b/src/main/resources/assets/bloodmagic/textures/block/routing_node_input.png new file mode 100755 index 0000000000..12b9ffccb9 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/routing_node_input.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/routing_node_master.png b/src/main/resources/assets/bloodmagic/textures/block/routing_node_master.png new file mode 100755 index 0000000000..b861ffade9 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/routing_node_master.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/block/routing_node_output.png b/src/main/resources/assets/bloodmagic/textures/block/routing_node_output.png new file mode 100755 index 0000000000..9b6184711a Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/block/routing_node_output.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/container/filter_item.png b/src/main/resources/assets/bloodmagic/textures/gui/container/filter_item.png new file mode 100644 index 0000000000..c08e33e43b Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/container/filter_item.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/container/node_filter.png b/src/main/resources/assets/bloodmagic/textures/gui/container/node_filter.png new file mode 100644 index 0000000000..6610e32440 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/container/node_filter.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/container/node_master.png b/src/main/resources/assets/bloodmagic/textures/gui/container/node_master.png new file mode 100644 index 0000000000..fbdf21f8d6 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/container/node_master.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/blacklist.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/blacklist.png new file mode 100644 index 0000000000..b8218fb043 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/blacklist.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant.png new file mode 100644 index 0000000000..e206725dcc Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_any.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_any.png new file mode 100644 index 0000000000..bafe303e38 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_any.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_every.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_every.png new file mode 100644 index 0000000000..1fe4a983d6 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_every.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_level_any.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_level_any.png new file mode 100644 index 0000000000..71578a4417 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_level_any.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_level_exact.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_level_exact.png new file mode 100644 index 0000000000..3a83f269e9 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/enchant_level_exact.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/tag.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/tag.png new file mode 100644 index 0000000000..48b3602ef4 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/tag.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/tag_all.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/tag_all.png new file mode 100644 index 0000000000..0e8cce0c8b Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/tag_all.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/whitelist.png b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/whitelist.png new file mode 100644 index 0000000000..9f28ecbeea Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/sprites/container/filter/whitelist.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_composite.png b/src/main/resources/assets/bloodmagic/textures/item/filter_composite.png new file mode 100644 index 0000000000..dea72ba3d4 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_composite.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_data.png b/src/main/resources/assets/bloodmagic/textures/item/filter_data.png new file mode 100644 index 0000000000..d8952e5f66 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_data.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_enchant.png b/src/main/resources/assets/bloodmagic/textures/item/filter_enchant.png new file mode 100644 index 0000000000..71b9982c77 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_enchant.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_fluid.png b/src/main/resources/assets/bloodmagic/textures/item/filter_fluid.png new file mode 100644 index 0000000000..5de1391d03 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_fluid.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_mod.png b/src/main/resources/assets/bloodmagic/textures/item/filter_mod.png new file mode 100644 index 0000000000..01a6f0b861 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_mod.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_standard.png b/src/main/resources/assets/bloodmagic/textures/item/filter_standard.png new file mode 100644 index 0000000000..3b5be8a2e1 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_standard.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/filter_tag.png b/src/main/resources/assets/bloodmagic/textures/item/filter_tag.png new file mode 100644 index 0000000000..253b039925 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/filter_tag.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/node_router.png b/src/main/resources/assets/bloodmagic/textures/item/node_router.png new file mode 100755 index 0000000000..776c5fc9b7 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/node_router.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/node_upgrade_amount.png b/src/main/resources/assets/bloodmagic/textures/item/node_upgrade_amount.png new file mode 100644 index 0000000000..477f3be897 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/node_upgrade_amount.png differ diff --git a/src/main/resources/assets/bloodmagic/textures/item/node_upgrade_speed.png b/src/main/resources/assets/bloodmagic/textures/item/node_upgrade_speed.png new file mode 100644 index 0000000000..e4422fb52c Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/item/node_upgrade_speed.png differ