diff --git a/build.gradle b/build.gradle index 0f9162a..bab4d24 100644 --- a/build.gradle +++ b/build.gradle @@ -106,8 +106,9 @@ minecraft{ data{ workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' + property 'forge.logging.markers', '' + property 'forge.logging.console.level', 'info' + property 'fml.earlyprogresswindow', 'false' property 'mixin.env.remapRefMap', 'true' property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" diff --git a/gradle.properties b/gradle.properties index e401021..44a12ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,10 +2,10 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false version_minecraft=1.18.2 -version_forge=40.1.48 +version_forge=40.2.4 version_fml_mappings=1.18.2 version_parchment=1.18.1-2022.03.06-1.18.2 -version_ie=1.18.2-8.1.0-150 +version_ie=1.18.2-8.4.0-161 -version_jei=9.7.0.195 +version_jei=9.7.1.+ version_ct=9.1.156 \ No newline at end of file diff --git a/src/datagen/java/twistedgate/overengineered/common/data/OEBlockStates.java b/src/datagen/java/twistedgate/overengineered/common/data/OEBlockStates.java index c6bf7ed..4c1426c 100644 --- a/src/datagen/java/twistedgate/overengineered/common/data/OEBlockStates.java +++ b/src/datagen/java/twistedgate/overengineered/common/data/OEBlockStates.java @@ -1,5 +1,7 @@ package twistedgate.overengineered.common.data; +import java.util.function.Function; + import javax.annotation.Nullable; import net.minecraft.data.DataGenerator; @@ -7,9 +9,15 @@ import net.minecraft.world.level.block.Block; import net.minecraftforge.client.model.generators.BlockModelBuilder; import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; +import net.minecraftforge.client.model.generators.VariantBlockStateBuilder.PartialBlockstate; import net.minecraftforge.client.model.generators.loaders.OBJLoaderBuilder; import net.minecraftforge.common.data.ExistingFileHelper; import twistedgate.overengineered.OverEngineered; +import twistedgate.overengineered.common.OEContent; +import twistedgate.overengineered.common.blocks.busbar.BusbarBlock; +import twistedgate.overengineered.utils.enums.EnumBusbarShape; public class OEBlockStates extends BlockStateProvider{ final ExistingFileHelper exFileHelper; @@ -18,8 +26,90 @@ public OEBlockStates(DataGenerator gen, ExistingFileHelper exFileHelper){ this.exFileHelper = exFileHelper; } + private ConfiguredModel emptyModel; + @Override protected void registerStatesAndModels(){ + makeEmpty(); + + busbar(); + } + + private void busbar(){ + PartialBlockstate state = getVariantBuilder(OEContent.Blocks.BUSBAR.get()).partialState(); + + EnumBusbarShape[] shapes = EnumBusbarShape.values(); + for(EnumBusbarShape shape:shapes){ + state.with(BusbarBlock.SHAPE, shape).setModels(this.emptyModel); + } + } + + private void makeEmpty(){ + BlockModelBuilder empty = models().getBuilder("empty"); + this.emptyModel = new ConfiguredModel(empty, 0, 0, false); + } + + /** Keeping it just incase i need something from it */ + @SuppressWarnings("unused") + private final void old(){ + + // Insulators + BlockModelBuilder model_insulators_normal = busModel("models/block/busbar/obj/busbar_a.obj", "_with_insulators"); + BlockModelBuilder model_insulators_rotated = busModel("models/block/busbar/obj/busbar_a_alt.obj", "_with_insulators_pre_y_rotated"); + + BlockModelBuilder model_bend = busModel("models/block/busbar/obj/busbar_bend.obj", "_bend"); + BlockModelBuilder model_edge_inside = busModel("models/block/busbar/obj/busbar_edge_inside.obj", "_horizontal_up"); + BlockModelBuilder model_edge_outside = busModel("models/block/busbar/obj/busbar_edge_outside.obj", "_horizontal_down"); + + model_insulators_normal.assertExistence(); + model_insulators_rotated.assertExistence(); + + model_bend.assertExistence(); + model_edge_inside.assertExistence(); + model_edge_outside.assertExistence(); + + bus(EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH, model_insulators_normal, 0, 0); + bus(EnumBusbarShape.INSULATORS_DOWN_EAST_WEST, model_insulators_normal, 0, 90); + bus(EnumBusbarShape.INSULATORS_UP_NORTH_SOUTH, model_insulators_normal, 180, 0); + bus(EnumBusbarShape.INSULATORS_UP_EAST_WEST, model_insulators_normal, 180, 90); + + EnumBusbarShape.Type.STRAIGHT_INSULATORS_WALL_NORMAL.forEachIndexed((i, shape) -> bus(shape, model_insulators_normal, -90, 90 * i)); + EnumBusbarShape.Type.STRAIGHT_INSULATORS_WALL_ROTATED.forEachIndexed((i, shape) -> bus(shape, model_insulators_rotated, -90, 90 * i)); + + EnumBusbarShape.Type.BENDS_FLOOR.forEachIndexed((i, shape) -> bus(shape, model_bend, 0, 90 + 90 * i)); + EnumBusbarShape.Type.BENDS_CEILING.forEachIndexed((i, shape) -> bus(shape, model_bend, 180, 180 + 90 * i)); + + // TODO These do not have the correct rotations + EnumBusbarShape.Type.BENDS_WALLS.forEachIndexed((i, shape) -> bus(shape, model_bend, -90, 90 * i)); + + EnumBusbarShape.Type.EDGE_INSIDE_FLOOR.forEachIndexed((i, shape) -> bus(shape, model_edge_inside, 0, 90 * i)); + EnumBusbarShape.Type.EDGE_INSIDE_CEILING.forEachIndexed((i, shape) -> bus(shape, model_edge_inside, 180, 90 * i)); + EnumBusbarShape.Type.EDGE_OUTSIDE_FLOOR.forEachIndexed((i, shape) -> bus(shape, model_edge_outside, 0, 90 * i)); + EnumBusbarShape.Type.EDGE_OUTSIDE_CEILING.forEachIndexed((i, shape) -> bus(shape, model_edge_outside, 180, 90 * i)); + } + + private PartialBlockstate bus(EnumBusbarShape shape, BlockModelBuilder model, int x_rot, int y_rot){ + PartialBlockstate state = getVariantBuilder(OEContent.Blocks.BUSBAR.get()).partialState(); + + return state.with(BusbarBlock.SHAPE, shape) + .addModels(new ConfiguredModel(model, x_rot % 360, y_rot % 360, false)); + } + + // Could still be used for specific stuff + @SuppressWarnings("unused") + private PartialBlockstate bus(Function f, BlockModelBuilder model, int x_rot, int y_rot){ + VariantBlockStateBuilder builder = getVariantBuilder(OEContent.Blocks.BUSBAR.get()); + return f.apply(builder.partialState()).addModels(new ConfiguredModel(model, x_rot, y_rot, false)); + } + + @SuppressWarnings("unused") + @Deprecated(forRemoval = true) + private PartialBlockstate bus(PartialBlockstate state, BlockModelBuilder m0, BlockModelBuilder m1, boolean floating, int x_rot, int y_rot){ + return state.addModels(new ConfiguredModel(floating ? m1 : m0, x_rot, y_rot, false)); + } + + private BlockModelBuilder busModel(String modelPath, @Nullable String postFix){ + return objModel(OEContent.Blocks.BUSBAR.get(), modelPath, postFix, modLoc("block/busbar/obj")); } private BlockModelBuilder objModel(Block b, String modelPath, @Nullable String postFix, ResourceLocation texture){ diff --git a/src/datagen/java/twistedgate/overengineered/common/data/OEItemModels.java b/src/datagen/java/twistedgate/overengineered/common/data/OEItemModels.java index 8be649c..c9cb751 100644 --- a/src/datagen/java/twistedgate/overengineered/common/data/OEItemModels.java +++ b/src/datagen/java/twistedgate/overengineered/common/data/OEItemModels.java @@ -14,7 +14,6 @@ import net.minecraftforge.common.data.ExistingFileHelper; import twistedgate.overengineered.OverEngineered; - public class OEItemModels extends ItemModelProvider{ public OEItemModels(DataGenerator generator, ExistingFileHelper existingFileHelper){ super(generator, OverEngineered.MODID, existingFileHelper); @@ -22,15 +21,20 @@ public OEItemModels(DataGenerator generator, ExistingFileHelper existingFileHelp @Override protected void registerModels(){ -// ModelBuilder.TransformsBuilder trans = model.transforms(); -// doTransform(trans, TransformType.FIRST_PERSON_LEFT_HAND, new Vector3f(0, 0, 0), new Vector3f(0, 45, 0), 1.0F); -// doTransform(trans, TransformType.FIRST_PERSON_RIGHT_HAND, new Vector3f(0, 0, 0), new Vector3f(0, 45, 0), 1.0F); -// doTransform(trans, TransformType.THIRD_PERSON_LEFT_HAND, null, null, 1.0F); -// doTransform(trans, TransformType.THIRD_PERSON_RIGHT_HAND, null, null, 1.0F); -// doTransform(trans, TransformType.HEAD, new Vector3f(0, 0, 0), null, 1.0F); -// doTransform(trans, TransformType.GUI, new Vector3f(0, 2, 0), new Vector3f(30, 45, 0), 0.75F); -// doTransform(trans, TransformType.GROUND, new Vector3f(0, 0, 0), null, 1.0F); -// doTransform(trans, TransformType.FIXED, new Vector3f(0, 0, -7), new Vector3f(-90, 0, 0), 1.0F); + ItemModelBuilder model = withExistingParent("busbar", "overengineered:block/busbar/json/busbar_straight"); + +// ItemModelBuilder model = obj(OEContent.Blocks.BUSBAR.get(), "block/busbar/obj/busbar_a.obj") +// .texture("texture", modLoc("block/obj/busbar")); + + ModelBuilder.TransformsBuilder trans = model.transforms(); + doTransform(trans, TransformType.FIRST_PERSON_LEFT_HAND, new Vector3f(0, 0, 0), new Vector3f(0, 45, 0), 1.0F); + doTransform(trans, TransformType.FIRST_PERSON_RIGHT_HAND, new Vector3f(0, 0, 0), new Vector3f(0, 45, 0), 1.0F); + doTransform(trans, TransformType.THIRD_PERSON_LEFT_HAND, null, null, 1.0F); + doTransform(trans, TransformType.THIRD_PERSON_RIGHT_HAND, null, null, 1.0F); + doTransform(trans, TransformType.HEAD, new Vector3f(0, 0, 0), null, 1.0F); + doTransform(trans, TransformType.GUI, new Vector3f(0, 2, 0), new Vector3f(30, 45, 0), 0.75F); + doTransform(trans, TransformType.GROUND, new Vector3f(0, 0, 0), null, 1.0F); + doTransform(trans, TransformType.FIXED, new Vector3f(0, 0, -7), new Vector3f(-90, 0, 0), 1.0F); } private void doTransform(ModelBuilder.TransformsBuilder transform, TransformType type, @Nullable Vector3f translation, @Nullable Vector3f rotationAngle, float scale){ @@ -43,6 +47,7 @@ private void doTransform(ModelBuilder.TransformsBuilder transform, TransformT trans.end(); } + @SuppressWarnings("unused") private ItemModelBuilder obj(ItemLike item, String model){ return getBuilder(item.asItem().getRegistryName().toString()) .customLoader(OBJLoaderBuilder::begin) diff --git a/src/datagen/java/twistedgate/overengineered/common/data/OERecipes.java b/src/datagen/java/twistedgate/overengineered/common/data/OERecipes.java index 108e3be..334aa90 100644 --- a/src/datagen/java/twistedgate/overengineered/common/data/OERecipes.java +++ b/src/datagen/java/twistedgate/overengineered/common/data/OERecipes.java @@ -1,18 +1,73 @@ package twistedgate.overengineered.common.data; +import java.util.HashMap; +import java.util.Map; import java.util.function.Consumer; +import blusunrize.immersiveengineering.api.wires.WireType; +import blusunrize.immersiveengineering.common.blocks.metal.BasicConnectorBlock; +import blusunrize.immersiveengineering.common.register.IEBlocks; +import blusunrize.immersiveengineering.common.register.IEBlocks.BlockEntry; import net.minecraft.data.DataGenerator; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import twistedgate.overengineered.common.OEContent; +import twistedgate.overengineered.utils.ResourceUtils; public class OERecipes extends RecipeProvider{ + private final Map PATH_COUNT = new HashMap<>(); + public OERecipes(DataGenerator pGenerator){ super(pGenerator); } @Override protected void buildCraftingRecipes(Consumer out){ + BlockEntry> lv_relay = IEBlocks.Connectors.getEnergyConnector(WireType.LV_CATEGORY, true); + BlockEntry> mv_relay = IEBlocks.Connectors.getEnergyConnector(WireType.MV_CATEGORY, true); + + ShapedRecipeBuilder.shaped(OEContent.Blocks.BUSBAR.get(), 3) + .group("oe_busbar") + .pattern("CCC") + .pattern("LRM") + .define('C', Items.COPPER_INGOT) + .define('R', Items.RED_DYE) + .define('L', lv_relay) + .define('M', mv_relay) + .unlockedBy("has_copper_ingot", has(Items.COPPER_INGOT)) + .unlockedBy("has_" + toPath(lv_relay), has(lv_relay)) + .unlockedBy("has_" + toPath(mv_relay), has(mv_relay)) + .save(out, rl("busbar")); + ShapedRecipeBuilder.shaped(OEContent.Blocks.BUSBAR.get(), 3) + .group("oe_busbar") + .pattern("CCC") + .pattern("MRL") + .define('C', Items.COPPER_INGOT) + .define('R', Items.RED_DYE) + .define('L', lv_relay) + .define('M', mv_relay) + .unlockedBy("has_copper_ingot", has(Items.COPPER_INGOT)) + .unlockedBy("has_" + toPath(lv_relay), has(lv_relay)) + .unlockedBy("has_" + toPath(mv_relay), has(mv_relay)) + .save(out, rl("busbar")); + } + + private ResourceLocation rl(String str){ + if(PATH_COUNT.containsKey(str)){ + int count = PATH_COUNT.get(str) + 1; + PATH_COUNT.put(str, count); + return ResourceUtils.oe(str + count); + } + PATH_COUNT.put(str, 1); + return ResourceUtils.oe(str); + } + + private String toPath(ItemLike src){ + return src.asItem().getRegistryName().getPath(); } } diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache new file mode 100644 index 0000000..797960c --- /dev/null +++ b/src/generated/resources/.cache/cache @@ -0,0 +1,7 @@ +e47a0ffe7cb343f0d6d80203f410a3769cd0204c assets/overengineered/blockstates/busbar.json +9ed931619e39f59a8520c1e3b03fea2e9a56fb60 assets/overengineered/models/block/empty.json +6bb4790efda3e3868669888d11756508e65f6ba7 assets/overengineered/models/item/busbar.json +f669ede4831f92d60da61cf680f634f40a2c6c2b data/overengineered/advancements/recipes/overengineered/busbar.json +84e62a1037f58c750ce069f12abdafe49f8be47b data/overengineered/advancements/recipes/overengineered/busbar2.json +9d6eee99845fd97468aa2085f9f4daa638d8cd7c data/overengineered/recipes/busbar.json +5fe8d5a4a47d15ce3dcc66fce0524cfca955107e data/overengineered/recipes/busbar2.json diff --git a/src/generated/resources/assets/overengineered/blockstates/busbar.json b/src/generated/resources/assets/overengineered/blockstates/busbar.json new file mode 100644 index 0000000..10d2697 --- /dev/null +++ b/src/generated/resources/assets/overengineered/blockstates/busbar.json @@ -0,0 +1,160 @@ +{ + "variants": { + "shape=insulators_down_north_south": { + "model": "overengineered:block/empty" + }, + "shape=insulators_down_east_west": { + "model": "overengineered:block/empty" + }, + "shape=insulators_up_north_south": { + "model": "overengineered:block/empty" + }, + "shape=insulators_up_east_west": { + "model": "overengineered:block/empty" + }, + "shape=insulators_north_up_down": { + "model": "overengineered:block/empty" + }, + "shape=insulators_east_up_down": { + "model": "overengineered:block/empty" + }, + "shape=insulators_south_up_down": { + "model": "overengineered:block/empty" + }, + "shape=insulators_west_up_down": { + "model": "overengineered:block/empty" + }, + "shape=insulators_north_east_west": { + "model": "overengineered:block/empty" + }, + "shape=insulators_east_north_south": { + "model": "overengineered:block/empty" + }, + "shape=insulators_south_east_west": { + "model": "overengineered:block/empty" + }, + "shape=insulators_west_north_south": { + "model": "overengineered:block/empty" + }, + "shape=bend_down_north_east": { + "model": "overengineered:block/empty" + }, + "shape=bend_down_east_south": { + "model": "overengineered:block/empty" + }, + "shape=bend_down_south_west": { + "model": "overengineered:block/empty" + }, + "shape=bend_down_west_north": { + "model": "overengineered:block/empty" + }, + "shape=bend_up_north_east": { + "model": "overengineered:block/empty" + }, + "shape=bend_up_east_south": { + "model": "overengineered:block/empty" + }, + "shape=bend_up_south_west": { + "model": "overengineered:block/empty" + }, + "shape=bend_up_west_north": { + "model": "overengineered:block/empty" + }, + "shape=bend_north_down_east": { + "model": "overengineered:block/empty" + }, + "shape=bend_north_east_up": { + "model": "overengineered:block/empty" + }, + "shape=bend_north_up_west": { + "model": "overengineered:block/empty" + }, + "shape=bend_north_west_down": { + "model": "overengineered:block/empty" + }, + "shape=bend_east_down_south": { + "model": "overengineered:block/empty" + }, + "shape=bend_east_south_up": { + "model": "overengineered:block/empty" + }, + "shape=bend_east_up_north": { + "model": "overengineered:block/empty" + }, + "shape=bend_east_north_down": { + "model": "overengineered:block/empty" + }, + "shape=bend_south_down_west": { + "model": "overengineered:block/empty" + }, + "shape=bend_south_west_up": { + "model": "overengineered:block/empty" + }, + "shape=bend_south_up_east": { + "model": "overengineered:block/empty" + }, + "shape=bend_south_east_down": { + "model": "overengineered:block/empty" + }, + "shape=bend_west_down_north": { + "model": "overengineered:block/empty" + }, + "shape=bend_west_north_up": { + "model": "overengineered:block/empty" + }, + "shape=bend_west_up_south": { + "model": "overengineered:block/empty" + }, + "shape=bend_west_south_down": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_down_north_up_south": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_down_east_up_west": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_down_south_up_north": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_down_west_up_east": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_up_north_down_south": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_up_east_down_west": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_up_south_down_north": { + "model": "overengineered:block/empty" + }, + "shape=edge_inside_up_west_down_east": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_down_north_up_south": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_down_east_up_west": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_down_south_up_north": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_down_west_up_east": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_up_north_down_south": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_up_east_down_west": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_up_south_down_north": { + "model": "overengineered:block/empty" + }, + "shape=edge_outside_up_west_down_east": { + "model": "overengineered:block/empty" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/overengineered/models/block/empty.json b/src/generated/resources/assets/overengineered/models/block/empty.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/src/generated/resources/assets/overengineered/models/block/empty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/generated/resources/assets/overengineered/models/item/busbar.json b/src/generated/resources/assets/overengineered/models/item/busbar.json new file mode 100644 index 0000000..f37d723 --- /dev/null +++ b/src/generated/resources/assets/overengineered/models/item/busbar.json @@ -0,0 +1,48 @@ +{ + "parent": "overengineered:block/busbar/json/busbar_straight", + "display": { + "firstperson_lefthand": { + "rotation": [ + 0, + 45, + 0 + ] + }, + "firstperson_righthand": { + "rotation": [ + 0, + 45, + 0 + ] + }, + "gui": { + "rotation": [ + 30, + 45, + 0 + ], + "translation": [ + 0, + 2, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -7 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/overengineered/advancements/recipes/overengineered/busbar.json b/src/generated/resources/data/overengineered/advancements/recipes/overengineered/busbar.json new file mode 100644 index 0000000..d290180 --- /dev/null +++ b/src/generated/resources/data/overengineered/advancements/recipes/overengineered/busbar.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "overengineered:busbar" + ] + }, + "criteria": { + "has_copper_ingot": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:copper_ingot" + ] + } + ] + } + }, + "has_connector_lv_relay": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveengineering:connector_lv_relay" + ] + } + ] + } + }, + "has_connector_mv_relay": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveengineering:connector_mv_relay" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "overengineered:busbar" + } + } + }, + "requirements": [ + [ + "has_copper_ingot", + "has_connector_lv_relay", + "has_connector_mv_relay", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/overengineered/advancements/recipes/overengineered/busbar2.json b/src/generated/resources/data/overengineered/advancements/recipes/overengineered/busbar2.json new file mode 100644 index 0000000..f336118 --- /dev/null +++ b/src/generated/resources/data/overengineered/advancements/recipes/overengineered/busbar2.json @@ -0,0 +1,60 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "overengineered:busbar2" + ] + }, + "criteria": { + "has_copper_ingot": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "minecraft:copper_ingot" + ] + } + ] + } + }, + "has_connector_lv_relay": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveengineering:connector_lv_relay" + ] + } + ] + } + }, + "has_connector_mv_relay": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": [ + "immersiveengineering:connector_mv_relay" + ] + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "overengineered:busbar2" + } + } + }, + "requirements": [ + [ + "has_copper_ingot", + "has_connector_lv_relay", + "has_connector_mv_relay", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/overengineered/recipes/busbar.json b/src/generated/resources/data/overengineered/recipes/busbar.json new file mode 100644 index 0000000..fa7efda --- /dev/null +++ b/src/generated/resources/data/overengineered/recipes/busbar.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "oe_busbar", + "pattern": [ + "CCC", + "LRM" + ], + "key": { + "C": { + "item": "minecraft:copper_ingot" + }, + "R": { + "item": "minecraft:red_dye" + }, + "L": { + "item": "immersiveengineering:connector_lv_relay" + }, + "M": { + "item": "immersiveengineering:connector_mv_relay" + } + }, + "result": { + "item": "overengineered:busbar", + "count": 3 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/overengineered/recipes/busbar2.json b/src/generated/resources/data/overengineered/recipes/busbar2.json new file mode 100644 index 0000000..44d154d --- /dev/null +++ b/src/generated/resources/data/overengineered/recipes/busbar2.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "oe_busbar", + "pattern": [ + "CCC", + "MRL" + ], + "key": { + "C": { + "item": "minecraft:copper_ingot" + }, + "R": { + "item": "minecraft:red_dye" + }, + "L": { + "item": "immersiveengineering:connector_lv_relay" + }, + "M": { + "item": "immersiveengineering:connector_mv_relay" + } + }, + "result": { + "item": "overengineered:busbar", + "count": 3 + } +} \ No newline at end of file diff --git a/src/main/java/twistedgate/overengineered/OverEngineered.java b/src/main/java/twistedgate/overengineered/OverEngineered.java index 728e977..2627694 100644 --- a/src/main/java/twistedgate/overengineered/OverEngineered.java +++ b/src/main/java/twistedgate/overengineered/OverEngineered.java @@ -9,7 +9,6 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.server.ServerAboutToStartEvent; import net.minecraftforge.event.server.ServerStartedEvent; @@ -27,8 +26,9 @@ import twistedgate.overengineered.common.CommonProxy; import twistedgate.overengineered.common.OEContent; import twistedgate.overengineered.common.OERegisters; +import twistedgate.overengineered.common.OETileTypes; +import twistedgate.overengineered.utils.ExternalModContent; -// The value here should match an entry in the META-INF/mods.toml file @Mod(OverEngineered.MODID) public class OverEngineered{ public static final String MODID = "overengineered"; @@ -39,8 +39,7 @@ public class OverEngineered{ @Override @Nonnull public ItemStack makeIcon(){ - // TODO - return new ItemStack(Items.BARRIER); + return new ItemStack(OEContent.Blocks.BUSBAR.get()); } }; @@ -75,6 +74,7 @@ public OverEngineered(){ OERegisters.addRegistersToEventBus(eBus); OEContent.modConstruction(); + OETileTypes.forceClassLoad(); MinecraftForge.EVENT_BUS.register(this); } @@ -85,9 +85,12 @@ private void setup(final FMLCommonSetupEvent event){ proxy.preInit(); OEContent.init(event); + proxy.init(); proxy.postInit(); + + ExternalModContent.init(); } public void loadComplete(FMLLoadCompleteEvent event){ diff --git a/src/main/java/twistedgate/overengineered/client/BlockRenderLayers.java b/src/main/java/twistedgate/overengineered/client/BlockRenderLayers.java new file mode 100644 index 0000000..82747a7 --- /dev/null +++ b/src/main/java/twistedgate/overengineered/client/BlockRenderLayers.java @@ -0,0 +1,27 @@ +package twistedgate.overengineered.client; + +import java.util.function.Predicate; + +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.registries.RegistryObject; +import twistedgate.overengineered.OverEngineered; +import twistedgate.overengineered.common.OEContent; + +@EventBusSubscriber(modid = OverEngineered.MODID, value = Dist.CLIENT, bus = Bus.MOD) +public class BlockRenderLayers{ + @SubscribeEvent + public static void clientSetup(FMLClientSetupEvent event){ + setRenderLayer(OEContent.Blocks.BUSBAR, t -> t == RenderType.cutout() || t == RenderType.solid()); + } + + private static void setRenderLayer(RegistryObject block, Predicate types){ + ItemBlockRenderTypes.setRenderLayer(block.get(), types); + } +} diff --git a/src/main/java/twistedgate/overengineered/client/ClientModBusEventHandlers.java b/src/main/java/twistedgate/overengineered/client/ClientModBusEventHandlers.java new file mode 100644 index 0000000..5a41e1e --- /dev/null +++ b/src/main/java/twistedgate/overengineered/client/ClientModBusEventHandlers.java @@ -0,0 +1,33 @@ +package twistedgate.overengineered.client; + +import java.util.function.Supplier; + +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent.RegisterRenderers; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import twistedgate.overengineered.OverEngineered; +import twistedgate.overengineered.client.render.BusbarRenderer; +import twistedgate.overengineered.common.OETileTypes; + +@Mod.EventBusSubscriber(modid = OverEngineered.MODID, value = Dist.CLIENT, bus = Bus.MOD) +public class ClientModBusEventHandlers{ + @SubscribeEvent + public static void registerModelLoaders(ModelRegistryEvent event){ + BusbarRenderer.init(); + } + + @SubscribeEvent + public static void registerRenders(RegisterRenderers ev){ + registerBERender(ev, OETileTypes.BUS.get(), BusbarRenderer::new); + } + + private static void registerBERender(RegisterRenderers ev, BlockEntityType type, Supplier> factory){ + ev.registerBlockEntityRenderer(type, ctx -> factory.get()); + } +} diff --git a/src/main/java/twistedgate/overengineered/client/ClientProxy.java b/src/main/java/twistedgate/overengineered/client/ClientProxy.java index ee576ec..5ab7cf3 100644 --- a/src/main/java/twistedgate/overengineered/client/ClientProxy.java +++ b/src/main/java/twistedgate/overengineered/client/ClientProxy.java @@ -28,7 +28,7 @@ public void postInit(){ @Override public void completed(ParallelDispatchEvent event){ - // TODO Soon™ + // TODO Soon™ //setupManualPages(); } diff --git a/src/main/java/twistedgate/overengineered/client/render/BusbarRenderer.java b/src/main/java/twistedgate/overengineered/client/render/BusbarRenderer.java new file mode 100644 index 0000000..a684afc --- /dev/null +++ b/src/main/java/twistedgate/overengineered/client/render/BusbarRenderer.java @@ -0,0 +1,141 @@ +package twistedgate.overengineered.client.render; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.function.Function; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.model.ForgeModelBakery; +import net.minecraftforge.client.model.data.EmptyModelData; +import net.minecraftforge.client.model.data.IModelData; +import twistedgate.overengineered.common.blocks.busbar.BusbarBlock; +import twistedgate.overengineered.common.blocks.tileentity.BusbarTileEntity; +import twistedgate.overengineered.utils.ResourceUtils; +import twistedgate.overengineered.utils.enums.EnumBusbarShape; + +public class BusbarRenderer implements BlockEntityRenderer{ + static final ResourceLocation MODEL_BUSBAR_STRAIGHT = ResourceUtils.oe("block/busbar/json/busbar_straight"); + static final ResourceLocation MODEL_BUSBAR_BEND = ResourceUtils.oe("block/busbar/json/busbar_bend"); + + static final ResourceLocation MODEL_BUSBAR_EDGE_IN = ResourceUtils.oe("block/busbar/json/busbar_edge_inside"); + static final ResourceLocation MODEL_BUSBAR_EDGE_OUT = ResourceUtils.oe("block/busbar/json/busbar_edge_outside"); + + static final ResourceLocation MODEL_BUSBAR_CON_LV_A = ResourceUtils.oe("block/busbar/json/busconnector_lv_a"); + static final ResourceLocation MODEL_BUSBAR_CON_LV_B = ResourceUtils.oe("block/busbar/json/busconnector_lv_b"); + static final ResourceLocation MODEL_BUSBAR_CON_LV_C = ResourceUtils.oe("block/busbar/json/busconnector_lv_c"); + + static final ResourceLocation MODEL_BUSBAR_CON_MV_A = ResourceUtils.oe("block/busbar/json/busconnector_mv_a"); + static final ResourceLocation MODEL_BUSBAR_CON_MV_B = ResourceUtils.oe("block/busbar/json/busconnector_mv_b"); + static final ResourceLocation MODEL_BUSBAR_CON_MV_C = ResourceUtils.oe("block/busbar/json/busconnector_mv_c"); + + public static void init(){ + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_STRAIGHT); + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_BEND); + + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_EDGE_IN); + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_EDGE_OUT); + + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_CON_LV_A); + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_CON_LV_B); + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_CON_LV_C); + + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_CON_MV_A); + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_CON_MV_B); + ForgeModelBakery.addSpecialModel(MODEL_BUSBAR_CON_MV_C); + } + + @Override + public void render(BusbarTileEntity blockEntity, float partialTick, PoseStack matrix, MultiBufferSource buffer, int light, int overlay){ + final BlockState state = blockEntity.getBlockState(); + final EnumBusbarShape shape = state.getValue(BusbarBlock.SHAPE); + + // TODO Relay connections + + matrix.pushPose(); + { + matrix.translate(0.5, 0.5, 0.5); + + shape.applyModelRotation(matrix); + + if(EnumBusbarShape.Type.SEGMENTS_STRAIGHT.contains(shape)) renderModel(MODEL_BUSBAR_STRAIGHT, matrix, buffer, light, overlay); + if(EnumBusbarShape.Type.SEGMENTS_BEND.contains(shape)) renderModel(MODEL_BUSBAR_BEND, matrix, buffer, light, overlay); + if(EnumBusbarShape.Type.SEGMENTS_EDGE_IN.contains(shape)) renderModel(MODEL_BUSBAR_EDGE_IN, matrix, buffer, light, overlay); + if(EnumBusbarShape.Type.SEGMENTS_EDGE_OUT.contains(shape)) renderModel(MODEL_BUSBAR_EDGE_OUT, matrix, buffer, light, overlay); + } + matrix.popPose(); + } + + private static void renderModel(ResourceLocation modelRL, PoseStack matrix, MultiBufferSource buffer, int light, int overlay){ + List quads = Model.getCachedQuads(modelRL); + renderModel(quads, matrix, buffer, light, overlay); + } + + private static void renderModel(List quads, PoseStack matrix, MultiBufferSource buffer, int light, int overlay){ + Pose last = matrix.last(); + VertexConsumer solid = buffer.getBuffer(RenderType.solid()); + for(BakedQuad quad:quads){ + float f = switch(quad.getDirection()){ + case DOWN -> 0.75F; + case NORTH, SOUTH -> 0.5F; + case EAST, WEST -> 0.6F; + default -> 1.0F; + }; + + solid.putBulkData(last, quad, f, f, f, light, overlay); + } + } + + public static class Model{ + private static final Random rand = new Random(42L); + private static final Function model = Minecraft.getInstance().getBlockRenderer().getBlockModelShaper().getModelManager()::getModel; + private static final Map> CACHE = new HashMap<>(); + private static boolean clearRequest = false; + + public static void requestCacheClear(){ + clearRequest = true; + } + + private static List getCachedQuads(ResourceLocation modelRL){ + if(clearRequest){ + CACHE.clear(); + clearRequest = false; + } + + return CACHE.computeIfAbsent(modelRL, Model::get); + } + + private static List get(ResourceLocation modelRL){ + rand.setSeed(42L); + + ArrayList quads = new ArrayList<>(get(modelRL, null, null, rand, EmptyModelData.INSTANCE)); + for(Direction side:Direction.values()){ + // For some reason not all faces are returned, this gets the rest of them + quads.addAll(get(modelRL, null, side, rand, EmptyModelData.INSTANCE)); + } + quads.trimToSize(); + return quads; + } + + private static List get(ResourceLocation modelRL, @Nullable BlockState state, @Nullable Direction side, @Nonnull Random rand, @Nonnull IModelData extraData){ + return model.apply(modelRL).getQuads(state, side, rand, extraData); + } + } +} diff --git a/src/main/java/twistedgate/overengineered/common/OEContent.java b/src/main/java/twistedgate/overengineered/common/OEContent.java index 140d27f..768449e 100644 --- a/src/main/java/twistedgate/overengineered/common/OEContent.java +++ b/src/main/java/twistedgate/overengineered/common/OEContent.java @@ -1,9 +1,12 @@ package twistedgate.overengineered.common; import net.minecraftforge.fml.event.lifecycle.ParallelDispatchEvent; +import net.minecraftforge.registries.RegistryObject; +import twistedgate.overengineered.common.blocks.busbar.BusbarBlock; public class OEContent{ public static class Blocks{ + public static final RegistryObject BUSBAR = OERegisters.registerBlock("busbar", BusbarBlock::new, BusbarBlock.Item::new); private static void forceClassLoad(){ } diff --git a/src/main/java/twistedgate/overengineered/common/OERegisters.java b/src/main/java/twistedgate/overengineered/common/OERegisters.java index 0503599..7b0532c 100644 --- a/src/main/java/twistedgate/overengineered/common/OERegisters.java +++ b/src/main/java/twistedgate/overengineered/common/OERegisters.java @@ -44,10 +44,16 @@ public static void addRegistersToEventBus(IEventBus eventBus){ MOB_EFFECT.register(eventBus); } - protected static RegistryObject registerBlock(String name, Supplier blockConstructor){ + /** Registers a {@link Block} without a {@link BlockItem} */ + protected static RegistryObject registerSimpleBlock(String name, Supplier blockConstructor){ return registerBlock(name, blockConstructor, null); } + /** Registers a {@link Block} with a {@link BlockItem} being automaticly added to {@link OverEngineered#creativeTab} */ + protected static RegistryObject registerTabbedBlock(String name, Supplier blockConstructor, Item.Properties properties){ + return registerBlock(name, blockConstructor, b -> new BlockItem(b, properties.tab(OverEngineered.creativeTab))); + } + protected static RegistryObject registerBlock(String name, Supplier blockConstructor, @Nullable Function blockItem){ RegistryObject block = BLOCK_REGISTER.register(name, blockConstructor); if(blockItem != null){ diff --git a/src/main/java/twistedgate/overengineered/common/OETileTypes.java b/src/main/java/twistedgate/overengineered/common/OETileTypes.java index e2acd34..48d6860 100644 --- a/src/main/java/twistedgate/overengineered/common/OETileTypes.java +++ b/src/main/java/twistedgate/overengineered/common/OETileTypes.java @@ -1,6 +1,11 @@ package twistedgate.overengineered.common; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.registries.RegistryObject; +import twistedgate.overengineered.common.blocks.tileentity.BusbarTileEntity; + public class OETileTypes{ + public static final RegistryObject> BUS = OERegisters.registerTE("tile_bus", BusbarTileEntity::new, OEContent.Blocks.BUSBAR); public static void forceClassLoad(){ } diff --git a/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarBlock.java b/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarBlock.java new file mode 100644 index 0000000..075e5ec --- /dev/null +++ b/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarBlock.java @@ -0,0 +1,443 @@ +package twistedgate.overengineered.common.blocks.busbar; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.annotation.Nonnull; + +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +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.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.SoundType; +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.Builder; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import twistedgate.overengineered.OverEngineered; +import twistedgate.overengineered.common.OETileTypes; +import twistedgate.overengineered.common.blocks.OEBlockBase; +import twistedgate.overengineered.common.blocks.tileentity.BusbarTileEntity; +import twistedgate.overengineered.utils.ExternalModContent; +import twistedgate.overengineered.utils.enums.EnumBusbarShape; + +public class BusbarBlock extends OEBlockBase implements EntityBlock{ + private static final Material MATERIAL = new Material(MaterialColor.METAL, false, false, true, true, false, false, PushReaction.BLOCK); + + public static final EnumProperty SHAPE = EnumProperty.create("shape", EnumBusbarShape.class); + + public BusbarBlock(){ + super(Block.Properties.of(MATERIAL).strength(2.0F, 10.0F).sound(SoundType.METAL).requiresCorrectToolForDrops()); + + registerDefaultState(getStateDefinition().any().setValue(SHAPE, EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH)); + } + + @Override + protected void createBlockStateDefinition(Builder builder){ + builder.add(SHAPE); + } + + @Override + public boolean propagatesSkylightDown(BlockState pState, BlockGetter pLevel, BlockPos pPos){ + return true; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context){ + Direction facing = context.getClickedFace(); + Direction direction = context.getHorizontalDirection(); + boolean crouching = !(context.getPlayer() != null ? context.getPlayer().isCrouching() : false); + + // @formatter:off + EnumBusbarShape shape = switch(facing){ + case DOWN -> (direction == Direction.EAST || direction == Direction.WEST) != crouching ? EnumBusbarShape.INSULATORS_UP_EAST_WEST : EnumBusbarShape.INSULATORS_UP_NORTH_SOUTH; + case UP -> (direction == Direction.EAST || direction == Direction.WEST) != crouching ? EnumBusbarShape.INSULATORS_DOWN_EAST_WEST : EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + case NORTH -> crouching ? EnumBusbarShape.INSULATORS_SOUTH_EAST_WEST : EnumBusbarShape.INSULATORS_SOUTH_UP_DOWN; + case EAST -> crouching ? EnumBusbarShape.INSULATORS_WEST_NORTH_SOUTH : EnumBusbarShape.INSULATORS_WEST_UP_DOWN; + case SOUTH -> crouching ? EnumBusbarShape.INSULATORS_NORTH_EAST_WEST : EnumBusbarShape.INSULATORS_NORTH_UP_DOWN; + case WEST -> crouching ? EnumBusbarShape.INSULATORS_EAST_NORTH_SOUTH : EnumBusbarShape.INSULATORS_EAST_UP_DOWN; + default -> EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + }; + // @formatter:on + + return this.defaultBlockState().setValue(SHAPE, shape); + } + + @Override + public InteractionResult use(BlockState selfState, Level level, BlockPos selfPos, Player player, InteractionHand hand, BlockHitResult hit){ + ItemStack held = player.getItemInHand(InteractionHand.MAIN_HAND); + + if(ExternalModContent.isIEWirecutter(held)){ + + boolean updateShapesDebug = false; + if(updateShapesDebug){ + if(!updateShapes) + updateShapes = true; + return InteractionResult.SUCCESS; + } + + try{ + BlockPos posNorth = selfPos.relative(Direction.NORTH); + BlockPos posEast = selfPos.relative(Direction.EAST); + BlockPos posSouth = selfPos.relative(Direction.SOUTH); + BlockPos posWest = selfPos.relative(Direction.WEST); + + BlockState stateNorth = level.getBlockState(posNorth); + BlockState stateEast = level.getBlockState(posEast); + BlockState stateSouth = level.getBlockState(posSouth); + BlockState stateWest = level.getBlockState(posWest); + + boolean north = stateNorth.is(this) && stateNorth.getValue(SHAPE).pointsBack(level, selfPos, posNorth); + boolean east = stateEast.is(this) && stateEast.getValue(SHAPE).pointsBack(level, selfPos, posEast); + boolean south = stateSouth.is(this) && stateSouth.getValue(SHAPE).pointsBack(level, selfPos, posSouth); + boolean west = stateWest.is(this) && stateWest.getValue(SHAPE).pointsBack(level, selfPos, posWest); + + final DustParticleOptions dst = new DustParticleOptions(new Vector3f(Vec3.fromRGB24(0x00FF00)), 1.0F); + + if(north) level.addParticle(dst, posNorth.getX() + .5, posNorth.getY() + .5, posNorth.getZ() + .5, 0.0, 0.0, 0.0); + if(east) level.addParticle(dst, posEast.getX() + .5, posEast.getY() + .5, posEast.getZ() + .5, 0.0, 0.0, 0.0); + if(south) level.addParticle(dst, posSouth.getX() + .5, posSouth.getY() + .5, posSouth.getZ() + .5, 0.0, 0.0, 0.0); + if(west) level.addParticle(dst, posWest.getX() + .5, posWest.getY() + .5, posWest.getZ() + .5, 0.0, 0.0, 0.0); + + if(!level.isClientSide){ + OverEngineered.log.info("North:\t{}", north); + OverEngineered.log.info("East:\t{}", east); + OverEngineered.log.info("South:\t{}", south); + OverEngineered.log.info("West:\t{}", west); + } + + }catch(Exception e){ + OverEngineered.log.info("Something went kaputt..", e); + } + + return InteractionResult.SUCCESS; + } + + if(ExternalModContent.isIEHammer(held)){ + BlockPos lastPos = null; + BlockPos currentPos = selfPos; + + retLabel: for(int i = 0;i < 32;i++){ + BlockState state = level.getBlockState(currentPos); + if(state.getBlock() == this){ + EnumBusbarShape shape = state.getValue(SHAPE); + + List list = new ArrayList<>(); + shape.connectionOffsets(list, currentPos); + + for(BlockPos p:list){ + if((lastPos == null || p != lastPos) && isBusbar(level, p)){ + if(p == selfPos) + break retLabel; + lastPos = currentPos; + currentPos = p; + break; + } + } + } + } + + DustParticleOptions src = new DustParticleOptions(new Vector3f(Vec3.fromRGB24(0xFF0000)), 1.0F); + DustParticleOptions dst = new DustParticleOptions(new Vector3f(Vec3.fromRGB24(0x00FF00)), 1.0F); + + level.addParticle(src, selfPos.getX() + .5, selfPos.getY() + .5, selfPos.getZ() + .5, 0.0, 0.0, 0.0); + level.addParticle(dst, currentPos.getX() + .5, currentPos.getY() + .5, currentPos.getZ() + .5, 0.0, 0.0, 0.0); + OverEngineered.log.info("End appears to be at {}", currentPos); + + return InteractionResult.SUCCESS; + } + + if(ExternalModContent.isIEScrewdriver(held)){ + EnumBusbarShape selfShape = selfState.getValue(SHAPE); + List list = new ArrayList<>(); + selfShape.connectionOffsets(list, selfPos); + + DustParticleOptions dust = new DustParticleOptions(new Vector3f(Vec3.fromRGB24(0xFF7F00)), 1.0F); + for(BlockPos p:list){ + level.addParticle(dust, p.getX() + .5, p.getY() + .5, p.getZ() + .5, 0.0, 0.0, 0.0); + } + + return InteractionResult.SUCCESS; + } + + if(held.isEmpty()){ + EnumBusbarShape shape = selfState.getValue(SHAPE); + + List connections; + { + List list = new ArrayList<>(); + shape.connectionOffsets(list, selfPos); + for(int i = 0;i < list.size();i++){ + BlockState state = level.getBlockState(list.get(i)); + if(state.getBlock() != this){ + list.remove(i--); + } + } + connections = list; + } + + DustParticleOptions dust = new DustParticleOptions(new Vector3f(Vec3.fromRGB24(0x0000FF)), 1.0F); + for(int i = 0;i < connections.size();i++){ + BlockPos currentPos = connections.get(i); + level.addParticle(dust, currentPos.getX() + .5, currentPos.getY() + .5, currentPos.getZ() + .5, 0.0, 0.0, 0.0); + } + + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block lastBlock, BlockPos fromPos, boolean isMoving){ + if(!level.isClientSide && level.getBlockState(pos).is(this)){ + change(state, level, pos); + } + } + + private void change(final BlockState selfState, final Level level, final BlockPos selfPos){ + final EnumBusbarShape selfShape = selfState.getValue(SHAPE); + if(!selfShape.hasFreeConnectionPoint(level, selfPos)) + return; + + final LocalPlane plane = LocalPlane.get(selfShape, selfPos); + + final BlockState stateNorth = level.getBlockState(plane.a()); + final BlockState stateEast = level.getBlockState(plane.b()); + final BlockState stateSouth = level.getBlockState(plane.c()); + final BlockState stateWest = level.getBlockState(plane.d()); + + boolean north = stateNorth.is(this) && stateNorth.getValue(SHAPE).pointsBack(level, selfPos, plane.a()); + boolean east = stateEast.is(this) && stateEast.getValue(SHAPE).pointsBack(level, selfPos, plane.b()); + boolean south = stateSouth.is(this) && stateSouth.getValue(SHAPE).pointsBack(level, selfPos, plane.c()); + boolean west = stateWest.is(this) && stateWest.getValue(SHAPE).pointsBack(level, selfPos, plane.d()); + + level.setBlock(selfPos, selfState, 3); + } + + @Deprecated + @SuppressWarnings("unused") + private BlockState updateDir(Level level, BlockPos pos, BlockState state, boolean placing){ + if(level.isClientSide){ + return state; + } + + EnumBusbarShape shape = state.getValue(SHAPE); + return new BusbarState(level, pos, state).place(placing, shape).getState(); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState){ + BusbarTileEntity te = OETileTypes.BUS.get().create(pPos, pState); + return te; + } + + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType){ + return createTickerHelper(pLevel.isClientSide, pBlockEntityType, OETileTypes.BUS); + } + + static final VoxelShape MISSING_SHAPE = Shapes.create(0.125, 0.125, 0.125, 0.875, 0.875, 0.875); + static Map SHAPES_CACHE = makeShapeCache(); + + public static boolean updateShapes = false; + + @Override + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext){ + if(updateShapes){ + SHAPES_CACHE = makeShapeCache(); + updateShapes = false; + } + return SHAPES_CACHE.getOrDefault(pState.getValue(SHAPE), MISSING_SHAPE); + } + + private static Map makeShapeCache(){ + Map map = new HashMap<>(); + for(EnumBusbarShape shape:EnumBusbarShape.values()){ + + // @formatter:off + VoxelShape vShape = switch(shape){ + case INSULATORS_DOWN_NORTH_SOUTH -> Shapes.create(0.125, 0.0, 0.0, 0.875, 0.25, 1.0); + case INSULATORS_DOWN_EAST_WEST -> Shapes.create(0.0, 0.0, 0.125, 1.0, 0.25, 0.875); + case INSULATORS_UP_NORTH_SOUTH -> Shapes.create(0.125, 0.75, 0.0, 0.875, 1.0, 1.0); + case INSULATORS_UP_EAST_WEST -> Shapes.create(0.0, 0.75, 0.125, 1.0, 1.0, 0.875); + + case INSULATORS_NORTH_UP_DOWN -> Shapes.create(0.125, 0.0, 0.0, 0.875, 1.0, 0.25); + case INSULATORS_EAST_UP_DOWN -> Shapes.create(0.75, 0.0, 0.125, 1.0, 1.0, 0.875); + case INSULATORS_SOUTH_UP_DOWN -> Shapes.create(0.125, 0.0, 0.75, 0.875, 1.0, 1.0); + case INSULATORS_WEST_UP_DOWN -> Shapes.create(0.0, 0.0, 0.125, 0.25, 1.0, 0.875); + + case INSULATORS_NORTH_EAST_WEST -> Shapes.create(0.0, 0.125, 0.0, 1.0, 0.875, 0.25); + case INSULATORS_SOUTH_EAST_WEST -> Shapes.create(0.0, 0.125, 0.75, 1.0, 0.875, 1.0); + case INSULATORS_EAST_NORTH_SOUTH -> Shapes.create(0.75, 0.125, 0.0, 1.0, 0.875, 1.0); + case INSULATORS_WEST_NORTH_SOUTH -> Shapes.create(0.0, 0.125, 0.0, 0.25, 0.875, 1.0); + + case EDGE_INSIDE_DOWN_NORTH_UP_SOUTH -> Shapes.or(Shapes.create(0.125, 0.0, 0.0, 0.875, 0.25, 1.0), Shapes.create(0.125, 0.0, 0.0, 0.875, 1.0, 0.25)).optimize(); + case EDGE_INSIDE_DOWN_SOUTH_UP_NORTH -> Shapes.or(Shapes.create(0.125, 0.0, 0.0, 0.875, 0.25, 1.0), Shapes.create(0.125, 0.0, 0.75, 0.875, 1.0, 1.0)).optimize(); + case EDGE_INSIDE_DOWN_EAST_UP_WEST -> Shapes.or(Shapes.create(0.0, 0.0, 0.125, 1.0, 0.25, 0.875), Shapes.create(0.75, 0.0, 0.125, 1.0, 1.0, 0.875)).optimize(); + case EDGE_INSIDE_DOWN_WEST_UP_EAST -> Shapes.or(Shapes.create(0.0, 0.0, 0.125, 1.0, 0.25, 0.875), Shapes.create(0.0, 0.0, 0.125, 0.25, 1.0, 0.875)).optimize(); + + case EDGE_INSIDE_UP_NORTH_DOWN_SOUTH -> Shapes.or(Shapes.create(0.125, 0.75, 0.0, 0.875, 1.0, 1.0), Shapes.create(0.125, 0.0, 0.0, 0.875, 1.0, 0.25)).optimize(); + case EDGE_INSIDE_UP_SOUTH_DOWN_NORTH -> Shapes.or(Shapes.create(0.125, 0.75, 0.0, 0.875, 1.0, 1.0), Shapes.create(0.125, 0.0, 0.75, 0.875, 1.0, 1.0)).optimize(); + case EDGE_INSIDE_UP_EAST_DOWN_WEST -> Shapes.or(Shapes.create(0.0, 0.75, 0.125, 1.0, 1.0, 0.875), Shapes.create(0.75, 0.0, 0.125, 1.0, 1.0, 0.875)).optimize(); + case EDGE_INSIDE_UP_WEST_DOWN_EAST -> Shapes.or(Shapes.create(0.0, 0.75, 0.125, 1.0, 1.0, 0.875), Shapes.create(0.0, 0.0, 0.125, 0.25, 1.0, 0.875)).optimize(); + + case BEND_DOWN_NORTH_EAST -> Shapes.create(0.125, 0.0, 0.0, 1.0, 0.25, 0.875); + case BEND_DOWN_EAST_SOUTH -> Shapes.create(0.125, 0.0, 0.125, 1.0, 0.25, 1.0); + case BEND_DOWN_SOUTH_WEST -> Shapes.create(0.0, 0.0, 0.125, 0.875, 0.25, 1.0); + case BEND_DOWN_WEST_NORTH -> Shapes.create(0.0, 0.0, 0.0, 0.875, 0.25, 0.875); + + case BEND_UP_NORTH_EAST -> Shapes.create(0.125, 0.75, 0.0, 1.0, 1.0, 0.875); + case BEND_UP_EAST_SOUTH -> Shapes.create(0.125, 0.75, 0.125, 1.0, 1.0, 1.0); + case BEND_UP_SOUTH_WEST -> Shapes.create(0.0, 0.75, 0.125, 0.875, 1.0, 1.0); + case BEND_UP_WEST_NORTH -> Shapes.create(0.0, 0.75, 0.0, 0.875, 1.0, 0.875); + + case BEND_NORTH_DOWN_EAST -> Shapes.create(0.125, 0.0, 0.0, 1.0, 0.875, 0.25); + case BEND_NORTH_EAST_UP -> Shapes.create(0.125, 0.125, 0.0, 1.0, 1.0, 0.25); + case BEND_NORTH_UP_WEST -> Shapes.create(0.0, 0.125, 0.0, 0.875, 1.0, 0.25); + case BEND_NORTH_WEST_DOWN -> Shapes.create(0.0, 0.0, 0.0, 0.875, 0.875, 0.25); + + case BEND_EAST_DOWN_SOUTH -> Shapes.create(0.75, 0.0, 0.125, 1.0, 0.875, 1.0); + case BEND_EAST_SOUTH_UP -> Shapes.create(0.75, 0.125, 0.125, 1.0, 1.0, 1.0); + case BEND_EAST_UP_NORTH -> Shapes.create(0.75, 0.125, 0.0, 1.0, 1.0, 0.875); + case BEND_EAST_NORTH_DOWN -> Shapes.create(0.75, 0.0, 0.0, 1.0, 0.875, 0.875); + + case BEND_SOUTH_DOWN_WEST -> Shapes.create(0.0, 0.0, 0.75, 0.875, 0.875, 1.0); + case BEND_SOUTH_WEST_UP -> Shapes.create(0.0, 0.125, 0.75, 0.875, 1.0, 1.0); + case BEND_SOUTH_UP_EAST -> Shapes.create(0.125, 0.125, 0.75, 1.0, 1.0, 1.0); + case BEND_SOUTH_EAST_DOWN -> Shapes.create(0.125, 0.0, 0.75, 1.0, 0.875, 1.0); + + case BEND_WEST_DOWN_NORTH -> Shapes.create(0.0, 0.0, 0.0, 0.25, 0.875, 0.875); + case BEND_WEST_NORTH_UP -> Shapes.create(0.0, 0.125, 0.0, 0.25, 1.0, 0.875); + case BEND_WEST_UP_SOUTH -> Shapes.create(0.0, 0.125, 0.125, 0.25, 1.0, 1.0); + case BEND_WEST_SOUTH_DOWN -> Shapes.create(0.0, 0.0, 0.125, 0.25, 0.875, 1.0); + + case EDGE_OUTSIDE_DOWN_NORTH_UP_SOUTH -> Shapes.create(0.125, 0.0, 0.75, 0.875, 0.25, 1.0); + case EDGE_OUTSIDE_DOWN_EAST_UP_WEST -> Shapes.create(0.0, 0.0, 0.125, 0.25, 0.25, 0.875); + case EDGE_OUTSIDE_DOWN_SOUTH_UP_NORTH -> Shapes.create(0.125, 0.0, 0.0, 0.875, 0.25, 0.25); + case EDGE_OUTSIDE_DOWN_WEST_UP_EAST -> Shapes.create(0.75, 0.0, 0.125, 1.0, 0.25, 0.875); + + case EDGE_OUTSIDE_UP_NORTH_DOWN_SOUTH -> Shapes.create(0.125, 0.75, 0.0, 0.875, 1.0, 0.25); + case EDGE_OUTSIDE_UP_EAST_DOWN_WEST -> Shapes.create(0.75, 0.75, 0.125, 1.0, 1.0, 0.875); + case EDGE_OUTSIDE_UP_SOUTH_DOWN_NORTH -> Shapes.create(0.125, 0.75, 0.75, 0.875, 1.0, 1.0); + case EDGE_OUTSIDE_UP_WEST_DOWN_EAST -> Shapes.create(0.0, 0.75, 0.125, 0.25, 1.0, 0.875); + + default -> null; + }; + // @formatter:on + + if(vShape != null){ + map.put(shape, vShape); + }else{ + OverEngineered.log.info("Missing voxelshape for shape \"" + shape.toString().toLowerCase() + "\""); + continue; + } + } + + return map; + } + + public static boolean isBusbar(Level level, BlockPos pos){ + return isBusbar(level.getBlockState(pos)); + } + + public static boolean isBusbar(BlockState state){ + return state.getBlock() instanceof BusbarBlock; + } + + private static record LocalPlane(Direction facing, BlockPos a, BlockPos b, BlockPos c, BlockPos d){ + public static LocalPlane get(@Nonnull EnumBusbarShape shape, @Nonnull BlockPos origin){ + Objects.requireNonNull(shape, "Shape should not be Null"); + Objects.requireNonNull(origin, "Origin should not be Null"); + + BlockPos north, east, south, west; + switch(shape.facing){ + case DOWN, UP -> { + north = origin.relative(Direction.NORTH); + east = origin.relative(Direction.EAST); + south = origin.relative(Direction.SOUTH); + west = origin.relative(Direction.WEST); + } + case NORTH -> { + north = origin.relative(Direction.UP); + east = origin.relative(Direction.EAST); + south = origin.relative(Direction.DOWN); + west = origin.relative(Direction.WEST); + } + case EAST -> { + north = origin.relative(Direction.UP); + east = origin.relative(Direction.SOUTH); + south = origin.relative(Direction.DOWN); + west = origin.relative(Direction.NORTH); + } + case SOUTH -> { + north = origin.relative(Direction.UP); + east = origin.relative(Direction.WEST); + south = origin.relative(Direction.DOWN); + west = origin.relative(Direction.EAST); + } + case WEST -> { + north = origin.relative(Direction.UP); + east = origin.relative(Direction.NORTH); + south = origin.relative(Direction.DOWN); + west = origin.relative(Direction.SOUTH); + } + default -> throw new IllegalArgumentException(shape.facing + " is an unknown Direction"); + } + + return new LocalPlane(shape.facing, north, east, south, west); + } + + private LocalPlane(Direction facing, BlockPos a, BlockPos b, BlockPos c, BlockPos d){ + this.facing = facing; + this.a = a; + this.b = b; + this.c = c; + this.d = d; + } + } + + public static class Item extends BlockItem{ + public Item(BusbarBlock block){ + super(block, new Item.Properties().tab(OverEngineered.creativeTab)); + } + + @Override + protected boolean placeBlock(BlockPlaceContext pContext, BlockState state){ + final Level level = pContext.getLevel(); + final BlockPos pos = pContext.getClickedPos(); + + if(state.getBlock() instanceof BusbarBlock bus){ + if(!level.isClientSide()) + bus.change(state, level, pos); + return true; + } + + return super.placeBlock(pContext, state); + } + } +} diff --git a/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarCon.java b/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarCon.java new file mode 100644 index 0000000..bdad03d --- /dev/null +++ b/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarCon.java @@ -0,0 +1,326 @@ +package twistedgate.overengineered.common.blocks.busbar; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import twistedgate.overengineered.OverEngineered; +import twistedgate.overengineered.utils.enums.EnumBusbarShape; + +public class BusbarCon{ + + /** + * This, if not empty, shows that there is still a free spot to connect to + */ + final List freePoints = new ArrayList<>(); + final Level level; + final BlockPos pos; + final Direction facing; + EnumBusbarShape shape; + BlockState state; + + public BusbarCon(Level level, BlockPos pos, BlockState state){ + this.level = level; + this.pos = pos; + this.state = state; + this.shape = state.getValue(BusbarBlock.SHAPE); + this.facing = this.shape.facing; + + updateConnections(this.shape); + } + + public List getConnections(){ + return this.freePoints; + } + + public EnumBusbarShape getShape(){ + return this.shape; + } + + public BlockState getState(){ + removeExistingConnections(); + + BlockState ret = this.state; + // Not sure if somethings gonna go between this yet + return ret; + } + + @SuppressWarnings("unused") + public void onPlace(boolean placing){ + // @formatter:off + final BlockPos posDown = this.pos.relative(Direction.DOWN); + final BlockPos posUp = this.pos.relative(Direction.UP); + final BlockPos posNorth = this.pos.relative(Direction.NORTH); + final BlockPos posEast = this.pos.relative(Direction.EAST); + final BlockPos posSouth = this.pos.relative(Direction.SOUTH); + final BlockPos posWest = this.pos.relative(Direction.WEST); + + final boolean hasDown = this.hasNeigborBus(posDown); + final boolean hasUp = this.hasNeigborBus(posUp); + final boolean hasNorth = this.hasNeigborBus(posNorth); + final boolean hasSouth = this.hasNeigborBus(posSouth); + final boolean hasEast = this.hasNeigborBus(posEast); + final boolean hasWest = this.hasNeigborBus(posWest); + + final boolean _UpOrDown = hasUp || hasDown; + final boolean _NorthOrSouth = hasNorth || hasSouth; + final boolean _EastOrWest = hasEast || hasWest; + + final boolean _NorthAndEast = hasNorth && hasEast; + final boolean _NorthAndWest = hasNorth && hasWest; + final boolean _SouthAndEast = hasSouth && hasEast; + final boolean _SouthAndWest = hasSouth && hasWest; + + OverEngineered.log.info(String.format(""" + onPlace([%d, %d, %d]) + down: %s, + up: %s, + north: %s, + south: %s, + east: %s, + west: %s""", this.pos.getX(), this.pos.getY(), this.pos.getZ(), + hasDown, hasUp, hasNorth, hasSouth, hasEast, hasWest)); + // @formatter:on + + EnumBusbarShape newShape = null; + + switch(this.facing){ + case UP:{ + break; + } + case DOWN:{ + if(_NorthOrSouth && !_EastOrWest){ + newShape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + } + if(_EastOrWest && !_NorthOrSouth){ + newShape = EnumBusbarShape.INSULATORS_DOWN_EAST_WEST; + } + + if(_NorthAndWest && !_SouthAndEast){ + newShape = EnumBusbarShape.BEND_DOWN_WEST_NORTH; + } + if(_NorthAndEast && !_SouthAndWest){ + newShape = EnumBusbarShape.BEND_DOWN_NORTH_EAST; + } + + if(_SouthAndEast && !_NorthAndWest){ + newShape = EnumBusbarShape.BEND_DOWN_EAST_SOUTH; + } + if(_SouthAndWest && !_NorthAndEast){ + newShape = EnumBusbarShape.BEND_DOWN_SOUTH_WEST; + } + break; + } + case NORTH:{ + break; + } + case EAST:{ + break; + } + case SOUTH:{ + break; + } + case WEST:{ + break; + } + default: + break; + } + + // TODO ??? + + if(newShape != null) + this.shape = newShape; + + // TODO ??? + updateConnections(this.shape); + this.state = this.state.setValue(BusbarBlock.SHAPE, this.shape); + if(placing || this.level.getBlockState(this.pos) != this.state){ + this.level.setBlock(this.pos, this.state, 3); + + for(BlockPos cPos:this.freePoints){ + BusbarCon bus = getBus(cPos); + + if(bus != null){ + bus.removeExistingConnections(); + + if(bus.canConnectTo(this)){ + bus.connectTo(this); + } + } + } + } + } + + public void connectTo(BusbarCon other){ + this.freePoints.add(other.pos); + + // @formatter:off + final BlockPos posDown = this.pos.relative(Direction.DOWN); + final BlockPos posUp = this.pos.relative(Direction.UP); + final BlockPos posNorth = this.pos.relative(Direction.NORTH); + final BlockPos posEast = this.pos.relative(Direction.EAST); + final BlockPos posSouth = this.pos.relative(Direction.SOUTH); + final BlockPos posWest = this.pos.relative(Direction.WEST); + + final boolean hasDown = this.hasConnection(posDown); + final boolean hasUp = this.hasConnection(posUp); + final boolean hasNorth = this.hasConnection(posNorth); + final boolean hasEast = this.hasConnection(posEast); + final boolean hasSouth = this.hasConnection(posSouth); + final boolean hasWest = this.hasConnection(posWest); + // @formatter:on + + OverEngineered.log.info(String.format(""" + [%d, %d, %d].connectTo([%d, %d, %d]) + down: %s, + up: %s, + north: %s, + south: %s, + east: %s, + west: %s""", this.pos.getX(), this.pos.getY(), this.pos.getZ(), + other.pos.getX(), other.pos.getY(), other.pos.getZ(), + hasDown, hasUp, hasNorth, hasSouth, hasEast, hasWest)); + + EnumBusbarShape shape = null; + + switch(this.facing){ + case UP:{ + break; + } + case DOWN:{ + if(hasNorth || hasSouth){ + shape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + } + if(hasEast || hasWest){ + shape = EnumBusbarShape.INSULATORS_DOWN_EAST_WEST; + } + + if(hasSouth && hasEast && !hasNorth && !hasWest){ + shape = EnumBusbarShape.BEND_DOWN_EAST_SOUTH; + } + if(hasSouth && hasWest && !hasNorth && !hasEast){ + shape = EnumBusbarShape.BEND_DOWN_SOUTH_WEST; + } + if(hasNorth && hasWest && !hasSouth && !hasEast){ + shape = EnumBusbarShape.BEND_DOWN_WEST_NORTH; + } + if(hasNorth && hasEast && !hasSouth && !hasWest){ + shape = EnumBusbarShape.BEND_DOWN_NORTH_EAST; + } + break; + } + case NORTH:{ + break; + } + case EAST:{ + break; + } + case SOUTH:{ + break; + } + case WEST:{ + break; + } + default: + break; + } + + //OverEngineered.log.info("Selecting: {}", shape != null ? shape.getSerializedName() : "Default"); + + if(shape == null){ + shape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + } + + this.state = this.state.setValue(BusbarBlock.SHAPE, shape); + this.level.setBlock(this.pos, this.state, 3); + } + + public BusbarCon printDebugInfo(){ + OverEngineered.log.info(toString()); + return this; + } + + public boolean hasOpenConnection(){ + return !this.freePoints.isEmpty(); + } + + public boolean canConnectTo(BusbarCon bus){ + return connectsTo(bus) || hasOpenConnection(); + } + + @Nullable + public BusbarCon getBus(BlockPos pos){ + BlockState state = this.level.getBlockState(pos); + return create(this.level, pos, state); + } + + @Nullable + public static BusbarCon create(Level level, BlockPos pos, BlockState state){ + return BusbarBlock.isBusbar(state) ? new BusbarCon(level, pos, state) : null; + } + + public void updateConnections(EnumBusbarShape shape){ + this.freePoints.clear(); + shape.connectionOffsets(this.freePoints, this.pos); + } + + /** + *
+	 * This has to be called after instantiating.
+	 * 
+ * + * Remove connections that already exist between this and another buses.
+ */ + public BusbarCon removeExistingConnections(){ + // This caues massive recursion when called inside the constructor, so has to be called seperately! + for(int i = 0;i < this.freePoints.size();i++){ + BusbarCon bus = getBus(this.freePoints.get(i)); + if(bus != null && bus.connectsTo(this)){ + this.freePoints.set(i, bus.pos); + }else{ + this.freePoints.remove(i--); + } + } + return this; + } + + public boolean connectsTo(BusbarCon bus){ + return hasConnection(bus.pos); + } + + public boolean hasConnection(BlockPos pos){ + for(int i = 0;i < this.freePoints.size();i++){ + BlockPos p = this.freePoints.get(i); + if(p.equals(pos)){ + return true; + } + } + return false; + } + + public boolean hasNeigborBus(BlockPos pos){ + BusbarCon bus = getBus(pos); + if(bus == null) + return false; + + bus.removeExistingConnections(); + return bus.canConnectTo(this); + } + + @Override + public String toString(){ + return String.format(""" + BusbarCon(){ + Level: %s + Pos: %s + State: %s + Connections: %s + }""", this.level, this.pos, this.state, this.freePoints); + } +} diff --git a/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarState.java b/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarState.java new file mode 100644 index 0000000..c8a6d40 --- /dev/null +++ b/src/main/java/twistedgate/overengineered/common/blocks/busbar/BusbarState.java @@ -0,0 +1,245 @@ +package twistedgate.overengineered.common.blocks.busbar; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import twistedgate.overengineered.utils.enums.EnumBusbarShape; + +/** + * Old broken attempt + * + * @author TwistedGate + */ +public class BusbarState{ + private final List connections = new ArrayList<>(); + private final Level level; + private final BlockPos pos; + private final boolean isStraight; + private BlockState state; + public BusbarState(Level pLevel, BlockPos pPos, BlockState pState){ + this.level = pLevel; + this.pos = pPos; + this.state = pState; + + EnumBusbarShape shape = this.state.getValue(BusbarBlock.SHAPE); + + this.isStraight = false;//!EnumBusbarShape.Type.STRAIGHT_SEGMENTS.contains(shape); + + updateConnections(shape); + } + + @Nullable + private BusbarState getBus(BlockPos pos){ + BlockState blockState = this.level.getBlockState(pos); + // TODO May need special cases for edges + return BusbarBlock.isBusbar(blockState) ? new BusbarState(this.level, pos, blockState) : null; + } + + public BlockState getState(){ + return this.state; + } + + private boolean canConnectTo(BusbarState busState){ + return connectsTo(busState) || this.connections.size() != 2; + } + + private boolean connectsTo(BusbarState busState){ + return hasConnection(busState.pos); + } + + private boolean hasConnection(BlockPos pos){ + for(int i = 0;i < this.connections.size();++i){ + BlockPos blockpos = this.connections.get(i); + if(blockpos.equals(pos)){ + return true; + } + } + return false; + } + + private boolean hasNeighborBus(BlockPos pos){ + BusbarState busState = getBus(pos); + if(busState == null){ + return false; + } + + busState.removeSoftConnections(); + return busState.canConnectTo(this); + } + + @SuppressWarnings("unused") + public BusbarState place(boolean placing, EnumBusbarShape shapeIn){ + final BlockPos posDown = this.pos.below(); + final BlockPos posUp = this.pos.above(); + final BlockPos posNorth = this.pos.north(); + final BlockPos posEast = this.pos.east(); + final BlockPos posSouth = this.pos.south(); + final BlockPos posWest = this.pos.west(); + + final boolean hasDown = hasNeighborBus(posDown); + final boolean hasUp = hasNeighborBus(posUp); + final boolean hasNorth = hasNeighborBus(posNorth); + final boolean hasEast = hasNeighborBus(posEast); + final boolean hasSouth = hasNeighborBus(posSouth); + final boolean hasWest = hasNeighborBus(posWest); + + EnumBusbarShape shape = null; + + boolean ns = hasNorth || hasSouth; + boolean ew = hasEast || hasWest; + boolean ud = hasUp || hasDown; + if(ns && !ew){ + shape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + } + if(ew && !ns){ + shape = EnumBusbarShape.INSULATORS_DOWN_EAST_WEST; + } + + boolean se = hasSouth && hasEast; + boolean sw = hasSouth && hasWest; + boolean ne = hasNorth && hasEast; + boolean nw = hasNorth && hasWest; + if(!this.isStraight){ + if(se && !hasNorth && !hasWest){ + shape = EnumBusbarShape.BEND_DOWN_EAST_SOUTH; + } + + if(sw && !hasNorth && !hasEast){ + shape = EnumBusbarShape.BEND_DOWN_SOUTH_WEST; + } + + if(nw && !hasSouth && !hasEast){ + shape = EnumBusbarShape.BEND_DOWN_WEST_NORTH; + } + + if(ne && !hasSouth && !hasWest){ + shape = EnumBusbarShape.BEND_DOWN_NORTH_EAST; + } + } + + if(shape == null){ + if(ns && ew){ + shape = shapeIn; + }else if(ns){ + shape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + }else if(ew){ + shape = EnumBusbarShape.INSULATORS_DOWN_EAST_WEST; + } + + if(!this.isStraight){ + if(nw){ + shape = EnumBusbarShape.BEND_DOWN_WEST_NORTH; + } + + if(ne){ + shape = EnumBusbarShape.BEND_DOWN_NORTH_EAST; + } + + if(sw){ + shape = EnumBusbarShape.BEND_DOWN_SOUTH_WEST; + } + + if(se){ + shape = EnumBusbarShape.BEND_DOWN_EAST_SOUTH; + } + } + } + + // ----------------------------------------------------------- + if(shape == null){ + shape = shapeIn; + } + + updateConnections(shape); + this.state = this.state.setValue(BusbarBlock.SHAPE, shape); + if(placing || this.level.getBlockState(this.pos) != this.state){ + this.level.setBlock(this.pos, this.state, 3); + + for(int i = 0;i < this.connections.size();i++){ + BusbarState busState = getBus(this.connections.get(i)); + if(busState != null){ + busState.removeSoftConnections(); + if(busState.canConnectTo(this)){ + busState.connectTo(this); + } + } + } + } + + return this; + } + + @SuppressWarnings("unused") + private void connectTo(BusbarState state){ + this.connections.add(state.pos); + + final BlockPos posDown = this.pos.below(); + final BlockPos posUp = this.pos.above(); + final BlockPos posNorth = this.pos.north(); + final BlockPos posEast = this.pos.east(); + final BlockPos posSouth = this.pos.south(); + final BlockPos posWest = this.pos.west(); + + final boolean conDown = hasConnection(posDown); + final boolean conUp = hasConnection(posUp); + final boolean conNorth = hasConnection(posNorth); + final boolean conSouth = hasConnection(posSouth); + final boolean conWest = hasConnection(posWest); + final boolean conEast = hasConnection(posEast); + + EnumBusbarShape shape = null; + + if(conNorth || conSouth){ + shape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + } + if(conEast || conWest){ + shape = EnumBusbarShape.INSULATORS_DOWN_EAST_WEST; + } + + if(!this.isStraight){ + if(conSouth && conEast && !conNorth && !conWest){ + shape = EnumBusbarShape.BEND_DOWN_EAST_SOUTH; + } + + if(conSouth && conWest && !conNorth && !conEast){ + shape = EnumBusbarShape.BEND_DOWN_SOUTH_WEST; + } + + if(conNorth && conWest && !conSouth && !conEast){ + shape = EnumBusbarShape.BEND_DOWN_WEST_NORTH; + } + + if(conNorth && conEast && !conSouth && !conWest){ + shape = EnumBusbarShape.BEND_DOWN_NORTH_EAST; + } + } + + if(shape == null){ + shape = EnumBusbarShape.INSULATORS_DOWN_NORTH_SOUTH; + } + + this.state = this.state.setValue(BusbarBlock.SHAPE, shape); + this.level.setBlock(this.pos, this.state, 3); + } + + private void removeSoftConnections(){ + for(int i = 0;i < this.connections.size();i++){ + BusbarState bus = getBus(this.connections.get(i)); + if(bus != null && bus.connectsTo(this)){ + this.connections.remove(i--); + }else{ + this.connections.set(i, bus.pos); + } + } + } + + private void updateConnections(EnumBusbarShape shape){ + this.connections.clear(); + shape.connectionOffsets(this.connections, this.pos); + } +} diff --git a/src/main/java/twistedgate/overengineered/common/blocks/tileentity/BusbarTileEntity.java b/src/main/java/twistedgate/overengineered/common/blocks/tileentity/BusbarTileEntity.java new file mode 100644 index 0000000..f6b529a --- /dev/null +++ b/src/main/java/twistedgate/overengineered/common/blocks/tileentity/BusbarTileEntity.java @@ -0,0 +1,30 @@ +package twistedgate.overengineered.common.blocks.tileentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.block.state.BlockState; +import twistedgate.overengineered.common.OETileTypes; +import twistedgate.overengineered.common.blocks.ticking.OEClientTickableTile; +import twistedgate.overengineered.common.blocks.ticking.OEServerTickableTile; + +public class BusbarTileEntity extends OETileEntityBase implements OEServerTickableTile, OEClientTickableTile{ + public BusbarTileEntity(BlockPos pWorldPosition, BlockState pBlockState){ + super(OETileTypes.BUS.get(), pWorldPosition, pBlockState); + } + + @Override + protected void writeCustom(CompoundTag compound){ + } + + @Override + protected void readCustom(CompoundTag compound){ + } + + @Override + public void tickClient(){ + } + + @Override + public void tickServer(){ + } +} diff --git a/src/main/java/twistedgate/overengineered/common/blocks/tileentity/BasicTileEntity.java b/src/main/java/twistedgate/overengineered/common/blocks/tileentity/OETileEntityBase.java similarity index 72% rename from src/main/java/twistedgate/overengineered/common/blocks/tileentity/BasicTileEntity.java rename to src/main/java/twistedgate/overengineered/common/blocks/tileentity/OETileEntityBase.java index bf93561..ac69a3c 100644 --- a/src/main/java/twistedgate/overengineered/common/blocks/tileentity/BasicTileEntity.java +++ b/src/main/java/twistedgate/overengineered/common/blocks/tileentity/OETileEntityBase.java @@ -13,8 +13,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; -public abstract class BasicTileEntity extends BlockEntity{ - public BasicTileEntity(BlockEntityType pType, BlockPos pWorldPosition, BlockState pBlockState){ +public abstract class OETileEntityBase extends BlockEntity{ + public OETileEntityBase(BlockEntityType pType, BlockPos pWorldPosition, BlockState pBlockState){ super(pType, pWorldPosition, pBlockState); } @@ -25,7 +25,7 @@ public Level getWorldNonnull(){ @Override public ClientboundBlockEntityDataPacket getUpdatePacket(){ - return ClientboundBlockEntityDataPacket.create(this, BlockEntity::getUpdateTag); + return ClientboundBlockEntityDataPacket.create(this, b -> getUpdateTag()); } @Override @@ -34,6 +34,7 @@ public void handleUpdateTag(CompoundTag tag){ } @Override + @Nonnull public CompoundTag getUpdateTag(){ CompoundTag nbt = new CompoundTag(); saveAdditional(nbt); @@ -42,22 +43,23 @@ public CompoundTag getUpdateTag(){ @Override public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt){ - load(pkt.getTag()); + if(pkt.getTag() != null) + load(pkt.getTag()); } @Override - public void saveAdditional(CompoundTag compound){ + public void saveAdditional(@Nonnull CompoundTag compound){ super.saveAdditional(compound); writeCustom(compound); } @Override - public void load(CompoundTag compound){ + public void load(@Nonnull CompoundTag compound){ super.load(compound); readCustom(compound); } - protected abstract CompoundTag writeCustom(CompoundTag compound); + protected abstract void writeCustom(CompoundTag compound); protected abstract void readCustom(CompoundTag compound); } diff --git a/src/main/java/twistedgate/overengineered/utils/ExternalModContent.java b/src/main/java/twistedgate/overengineered/utils/ExternalModContent.java new file mode 100644 index 0000000..7532f06 --- /dev/null +++ b/src/main/java/twistedgate/overengineered/utils/ExternalModContent.java @@ -0,0 +1,39 @@ +package twistedgate.overengineered.utils; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class ExternalModContent{ + public static final RegistryObject IE_ITEM_HAMMER = RegistryObject.create(ResourceUtils.ie("hammer"), ForgeRegistries.ITEMS); + public static final RegistryObject IE_ITEM_WIRECUTTER = RegistryObject.create(ResourceUtils.ie("wirecutter"), ForgeRegistries.ITEMS); + public static final RegistryObject IE_ITEM_SCREWDRIVER = RegistryObject.create(ResourceUtils.ie("screwdriver"), ForgeRegistries.ITEMS); + + public static void init(){ + } + + public static boolean isIEHammer(ItemStack stack){ + return isIEHammer(stack.getItem()); + } + + public static boolean isIEHammer(Item item){ + return item.equals(IE_ITEM_HAMMER.get()); + } + + public static boolean isIEScrewdriver(ItemStack stack){ + return isIEScrewdriver(stack.getItem()); + } + + public static boolean isIEScrewdriver(Item item){ + return item.equals(IE_ITEM_SCREWDRIVER.get()); + } + + public static boolean isIEWirecutter(ItemStack stack){ + return isIEWirecutter(stack.getItem()); + } + + public static boolean isIEWirecutter(Item item){ + return item.equals(IE_ITEM_WIRECUTTER.get()); + } +} \ No newline at end of file diff --git a/src/main/java/twistedgate/overengineered/utils/ResourceUtils.java b/src/main/java/twistedgate/overengineered/utils/ResourceUtils.java index 6bb3421..026089a 100644 --- a/src/main/java/twistedgate/overengineered/utils/ResourceUtils.java +++ b/src/main/java/twistedgate/overengineered/utils/ResourceUtils.java @@ -8,22 +8,27 @@ import twistedgate.overengineered.OverEngineered; public class ResourceUtils{ + /** OverEngineeered namespace */ public static ResourceLocation oe(String str){ return new ResourceLocation(OverEngineered.MODID, str); } + /** CraftTweaker namespace */ public static ResourceLocation ct(String str){ return new ResourceLocation(CraftTweakerConstants.MOD_ID, str); } + /** ImmersiveEngineering namespace */ public static ResourceLocation ie(String str){ return new ResourceLocation(Lib.MODID, str); } + /** Forge namespace */ public static ResourceLocation forge(String str){ return new ResourceLocation(ForgeVersion.MOD_ID, str); } + /** Minecraft namespace */ public static ResourceLocation mc(String str){ return new ResourceLocation(ResourceLocation.DEFAULT_NAMESPACE, str); } diff --git a/src/main/java/twistedgate/overengineered/utils/enums/EnumBusbarShape.java b/src/main/java/twistedgate/overengineered/utils/enums/EnumBusbarShape.java new file mode 100644 index 0000000..de4d297 --- /dev/null +++ b/src/main/java/twistedgate/overengineered/utils/enums/EnumBusbarShape.java @@ -0,0 +1,502 @@ +package twistedgate.overengineered.utils.enums; + +import static net.minecraft.core.Direction.DOWN; +import static net.minecraft.core.Direction.EAST; +import static net.minecraft.core.Direction.NORTH; +import static net.minecraft.core.Direction.SOUTH; +import static net.minecraft.core.Direction.UP; +import static net.minecraft.core.Direction.WEST; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.stream.Stream; + +import javax.annotation.Nullable; + +import com.google.common.collect.Iterators; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import twistedgate.overengineered.common.blocks.busbar.BusbarBlock; + +/** + * @author TwistedGate + */ +public enum EnumBusbarShape implements StringRepresentable{ + // @formatter:off + // Straights with Insulators (FACING_FROM_TO) + INSULATORS_DOWN_NORTH_SOUTH(DOWN, Connections.NORTH_SOUTH, new Vec3i(0, 0, 0)), + INSULATORS_DOWN_EAST_WEST(DOWN, Connections.EAST_WEST, new Vec3i(0, 90, 0)), + INSULATORS_UP_NORTH_SOUTH(UP, Connections.NORTH_SOUTH, new Vec3i(180, 0, 0)), + INSULATORS_UP_EAST_WEST(UP, Connections.EAST_WEST, new Vec3i(180, 90, 0)), + + INSULATORS_NORTH_UP_DOWN(NORTH, Connections.UP_DOWN, new Vec3i(90, 0, 0)), + INSULATORS_EAST_UP_DOWN(EAST, Connections.UP_DOWN, new Vec3i(90, 270, 0)), + INSULATORS_SOUTH_UP_DOWN(SOUTH, Connections.UP_DOWN, new Vec3i(90, 180, 0)), + INSULATORS_WEST_UP_DOWN(WEST, Connections.UP_DOWN, new Vec3i(90, 90, 0)), + INSULATORS_NORTH_EAST_WEST(NORTH, Connections.EAST_WEST, new Vec3i(90, 0, 90)), + INSULATORS_EAST_NORTH_SOUTH(EAST, Connections.NORTH_SOUTH, new Vec3i(90, 270, 90)), + INSULATORS_SOUTH_EAST_WEST(SOUTH, Connections.EAST_WEST, new Vec3i(90, 180, 90)), + INSULATORS_WEST_NORTH_SOUTH(WEST, Connections.NORTH_SOUTH, new Vec3i(90, 90, 90)), + + // 90° Bends (FACING_FROM_TO) + BEND_DOWN_NORTH_EAST(DOWN, Connections.NORTH_EAST, new Vec3i(0, 270, 0)), + BEND_DOWN_EAST_SOUTH(DOWN, Connections.EAST_SOUTH, new Vec3i(0, 180, 0)), + BEND_DOWN_SOUTH_WEST(DOWN, Connections.SOUTH_WEST, new Vec3i(0, 90, 0)), + BEND_DOWN_WEST_NORTH(DOWN, Connections.WEST_NORTH, new Vec3i(0, 0, 0)), + + BEND_UP_NORTH_EAST(UP, Connections.NORTH_EAST, new Vec3i(180, 180, 0)), + BEND_UP_EAST_SOUTH(UP, Connections.EAST_SOUTH, new Vec3i(180, 90, 0)), + BEND_UP_SOUTH_WEST(UP, Connections.SOUTH_WEST, new Vec3i(180, 0, 0)), + BEND_UP_WEST_NORTH(UP, Connections.WEST_NORTH, new Vec3i(180, 270, 0)), + + BEND_NORTH_DOWN_EAST(NORTH, Connections.DOWN_EAST, new Vec3i(90, 0, 180)), + BEND_NORTH_EAST_UP(NORTH, Connections.UP_EAST, new Vec3i(90, 0, 270)), + BEND_NORTH_UP_WEST(NORTH, Connections.UP_WEST, new Vec3i(90, 0, 0)), + BEND_NORTH_WEST_DOWN(NORTH, Connections.DOWN_WEST, new Vec3i(90, 0, 90)), + + BEND_EAST_DOWN_SOUTH(EAST, Connections.DOWN_SOUTH, new Vec3i(270, 90, 0)), + BEND_EAST_SOUTH_UP(EAST, Connections.UP_SOUTH, new Vec3i(270, 90, 270)), + BEND_EAST_UP_NORTH(EAST, Connections.UP_NORTH, new Vec3i(270, 90, 180)), + BEND_EAST_NORTH_DOWN(EAST, Connections.DOWN_NORTH, new Vec3i(270, 90, 90)), + + BEND_SOUTH_DOWN_WEST(SOUTH, Connections.DOWN_WEST, new Vec3i(270, 0, 0)), + BEND_SOUTH_WEST_UP(SOUTH, Connections.UP_WEST, new Vec3i(270, 0, 270)), + BEND_SOUTH_UP_EAST(SOUTH, Connections.UP_EAST, new Vec3i(270, 0, 180)), + BEND_SOUTH_EAST_DOWN(SOUTH, Connections.DOWN_EAST, new Vec3i(270, 0, 90)), + + BEND_WEST_DOWN_NORTH(WEST, Connections.DOWN_NORTH, new Vec3i(270, 270, 0)), + BEND_WEST_NORTH_UP(WEST, Connections.UP_NORTH, new Vec3i(270, 270, 270)), + BEND_WEST_UP_SOUTH(WEST, Connections.UP_SOUTH, new Vec3i(270, 270, 180)), + BEND_WEST_SOUTH_DOWN(WEST, Connections.DOWN_SOUTH, new Vec3i(270, 270, 90)), + + // Inside Edges (FACING_SIDE_FROM_TO) + EDGE_INSIDE_DOWN_NORTH_UP_SOUTH (DOWN, Connections.UP_SOUTH,new Vec3i(0, 180, 0)), + EDGE_INSIDE_DOWN_EAST_UP_WEST (DOWN, Connections.UP_WEST, new Vec3i(0, 90, 0)), + EDGE_INSIDE_DOWN_SOUTH_UP_NORTH (DOWN, Connections.UP_NORTH,new Vec3i(0, 0, 0)), + EDGE_INSIDE_DOWN_WEST_UP_EAST (DOWN, Connections.UP_EAST, new Vec3i(0, 270, 0)), + EDGE_INSIDE_UP_NORTH_DOWN_SOUTH (UP, Connections.DOWN_SOUTH,new Vec3i(180, 0, 0)), + EDGE_INSIDE_UP_EAST_DOWN_WEST (UP, Connections.DOWN_WEST, new Vec3i(180, 270, 0)), + EDGE_INSIDE_UP_SOUTH_DOWN_NORTH (UP, Connections.DOWN_NORTH,new Vec3i(180, 180, 0)), + EDGE_INSIDE_UP_WEST_DOWN_EAST (UP, Connections.DOWN_EAST, new Vec3i(180, 90, 0)), + + // Outside Edges (FACING_SIDE_FROM_TO) + EDGE_OUTSIDE_DOWN_NORTH_UP_SOUTH(DOWN, Connections.UP_SOUTH,new Vec3i(0, 0, 0)), + EDGE_OUTSIDE_DOWN_EAST_UP_WEST (DOWN, Connections.UP_WEST, new Vec3i(0, 270, 0)), + EDGE_OUTSIDE_DOWN_SOUTH_UP_NORTH(DOWN, Connections.UP_NORTH,new Vec3i(0, 180, 0)), + EDGE_OUTSIDE_DOWN_WEST_UP_EAST (DOWN, Connections.UP_EAST, new Vec3i(0, 90, 0)), + EDGE_OUTSIDE_UP_NORTH_DOWN_SOUTH(UP, Connections.DOWN_SOUTH,new Vec3i(270, 180, 0)), + EDGE_OUTSIDE_UP_EAST_DOWN_WEST (UP, Connections.DOWN_WEST, new Vec3i(270, 90, 0)), + EDGE_OUTSIDE_UP_SOUTH_DOWN_NORTH(UP, Connections.DOWN_NORTH,new Vec3i(270, 0, 0)), + EDGE_OUTSIDE_UP_WEST_DOWN_EAST (UP, Connections.DOWN_EAST, new Vec3i(270, 270, 0)), + ; + // @formatter:on + + private final String serialname; + public final Direction facing; + public final Connections connections; + private final Consumer rotations; + private EnumBusbarShape(Direction facing, Connections cons){ + this.serialname = name().toLowerCase(); + this.facing = facing; + this.connections = cons; + this.rotations = prepareRotations(null); + } + /** + * @param facing - Effectively which side of the Block it attaches to.
+ * (North meaning it attaches to the South-Face) + * @param cons - Possible connection-sides + * @param modelRotation - How much to rotate by each axis. (Rotation order: YZX) + */ + private EnumBusbarShape(Direction facing, Connections cons, Vec3i modelRotation){ + this.serialname = name().toLowerCase(); + this.facing = facing; + this.connections = cons; + this.rotations = prepareRotations(modelRotation); + } + + private static final BiConsumer mulPose = (p, q) -> p.mulPose(q); + private Consumer prepareRotations(Vec3i modelRotation){ + final Consumer doNothing = p -> {}; + + if(modelRotation == null || (modelRotation != null && modelRotation.equals(Vec3i.ZERO))) + return doNothing; + + final Quaternion qX = new Quaternion(Vector3f.XP, modelRotation.getX(), true); + final Quaternion qY = new Quaternion(Vector3f.YP, modelRotation.getY(), true); + final Quaternion qZ = new Quaternion(Vector3f.ZP, modelRotation.getZ(), true); + + final Consumer x = modelRotation.getX() != 0 ? p -> mulPose.accept(p, qX) : doNothing; + final Consumer y = modelRotation.getY() != 0 ? p -> mulPose.accept(p, qY) : doNothing; + final Consumer z = modelRotation.getZ() != 0 ? p -> mulPose.accept(p, qZ) : doNothing; + + Objects.requireNonNull(x, String.format("Consumer for X is Null! (%s)", this)); + Objects.requireNonNull(y, String.format("Consumer for Y is Null! (%s)", this)); + Objects.requireNonNull(z, String.format("Consumer for Z is Null! (%s)", this)); + + return(matrix -> { + y.accept(matrix); + z.accept(matrix); + x.accept(matrix); + }); + } + + @OnlyIn(Dist.CLIENT) + public void applyModelRotation(PoseStack matrix){ + this.rotations.accept(matrix); + } + + public boolean hasFreeConnectionPoint(Level level, BlockPos pos){ + boolean ret = false; + for(Direction d:this.connections.points){ + BlockState state = level.getBlockState(pos.relative(d)); + if(!(state.getBlock() instanceof BusbarBlock)){ + ret |= true; + } + } + return ret; + } + + /** + * + * @param level + * @param source Position from which this method was called + * @param selfPos The current position + * @return if the current shape points back to source + */ + public boolean pointsBack(Level level, BlockPos source, BlockPos selfPos){ + BlockState state = level.getBlockState(selfPos); + if(!(state.getBlock() instanceof BusbarBlock)) + return false; + + // Do any of the points, point back to source? + for(Direction p:this.connections.points){ + if(selfPos.relative(p).equals(source)) + return true; + } + + return false; + } + + public void connectionOffsets(final List list, BlockPos pos){ + for(Direction p:this.connections.points){ + list.add(pos.relative(p)); + } + } + + @Override + public String getSerializedName(){ + return this.serialname; + } + + public boolean compatibleWith(EnumBusbarShape other){ + return this.connections.compatibleWith(other.connections); + } + + // STATIC STUFF + + private static boolean checkBothWaysSided(Direction side, Direction from, Direction to, Direction a, Direction b, Direction c){ + return side == a && checkBothWays(from, to, a, b); + } + + private static boolean checkBothWays(Direction from, Direction to, Direction a, Direction b){ + return (from == a && to == b) || (from == b && to == a); + } + + @Nullable + public static EnumBusbarShape get(Direction facing, Direction from, Direction to){ + return get(facing, null, from, to); + } + + @Nullable + public static EnumBusbarShape get(Direction facing, @Nullable Direction side, Direction from, Direction to){ + Objects.requireNonNull(facing, "\"Facing\" must not be Null."); + Objects.requireNonNull(from, "\"From\" must not be Null."); + Objects.requireNonNull(to, "\"To\" must not be Null."); + + // Straights with Insulators (FACING_FROM_TO) + switch(facing){ + case UP -> { + if(checkBothWays(from, to, NORTH, SOUTH)) return INSULATORS_UP_NORTH_SOUTH; + if(checkBothWays(from, to, EAST, WEST)) return INSULATORS_UP_EAST_WEST; + } + case DOWN -> { + if(checkBothWays(from, to, NORTH, SOUTH)) return INSULATORS_DOWN_NORTH_SOUTH; + if(checkBothWays(from, to, EAST, WEST)) return INSULATORS_DOWN_EAST_WEST; + } + case NORTH -> { + if(checkBothWays(from, to, UP, DOWN)) return INSULATORS_NORTH_UP_DOWN; + if(checkBothWays(from, to, EAST, WEST)) return INSULATORS_NORTH_EAST_WEST; + } + case EAST -> { + if(checkBothWays(from, to, UP, DOWN)) return INSULATORS_EAST_UP_DOWN; + if(checkBothWays(from, to, NORTH, SOUTH)) return INSULATORS_EAST_NORTH_SOUTH; + } + case SOUTH -> { + if(checkBothWays(from, to, UP, DOWN)) return INSULATORS_SOUTH_UP_DOWN; + if(checkBothWays(from, to, EAST, WEST)) return INSULATORS_SOUTH_EAST_WEST; + } + case WEST -> { + if(checkBothWays(from, to, UP, DOWN)) return INSULATORS_WEST_UP_DOWN; + if(checkBothWays(from, to, NORTH, SOUTH)) return INSULATORS_WEST_NORTH_SOUTH; + } + } + + // 90° Bends (FACING_FROM_TO) + switch(facing){ + case UP -> { + if(checkBothWays(from, to, NORTH, EAST)) return BEND_UP_NORTH_EAST; + if(checkBothWays(from, to, EAST, SOUTH)) return BEND_UP_EAST_SOUTH; + if(checkBothWays(from, to, SOUTH, WEST)) return BEND_UP_SOUTH_WEST; + if(checkBothWays(from, to, WEST, NORTH)) return BEND_UP_WEST_NORTH; + } + case DOWN -> { + if(checkBothWays(from, to, NORTH, EAST)) return BEND_DOWN_NORTH_EAST; + if(checkBothWays(from, to, EAST, SOUTH)) return BEND_DOWN_EAST_SOUTH; + if(checkBothWays(from, to, SOUTH, WEST)) return BEND_DOWN_SOUTH_WEST; + if(checkBothWays(from, to, WEST, NORTH)) return BEND_DOWN_WEST_NORTH; + } + case NORTH -> { + if(checkBothWays(from, to, DOWN, EAST)) return BEND_NORTH_DOWN_EAST; + if(checkBothWays(from, to, EAST, UP)) return BEND_NORTH_EAST_UP; + if(checkBothWays(from, to, UP, WEST)) return BEND_NORTH_UP_WEST; + if(checkBothWays(from, to, WEST, DOWN)) return BEND_NORTH_WEST_DOWN; + } + case EAST -> { + if(checkBothWays(from, to, DOWN, SOUTH)) return BEND_EAST_DOWN_SOUTH; + if(checkBothWays(from, to, SOUTH, UP)) return BEND_EAST_SOUTH_UP; + if(checkBothWays(from, to, UP, NORTH)) return BEND_EAST_UP_NORTH; + if(checkBothWays(from, to, NORTH, DOWN)) return BEND_EAST_NORTH_DOWN; + } + case SOUTH -> { + if(checkBothWays(from, to, DOWN, WEST)) return BEND_SOUTH_DOWN_WEST; + if(checkBothWays(from, to, WEST, UP)) return BEND_SOUTH_WEST_UP; + if(checkBothWays(from, to, UP, EAST)) return BEND_SOUTH_UP_EAST; + if(checkBothWays(from, to, EAST, DOWN)) return BEND_SOUTH_EAST_DOWN; + } + case WEST -> { + if(checkBothWays(from, to, DOWN, NORTH)) return BEND_WEST_DOWN_NORTH; + if(checkBothWays(from, to, NORTH, UP)) return BEND_WEST_NORTH_UP; + if(checkBothWays(from, to, UP, SOUTH)) return BEND_WEST_UP_SOUTH; + if(checkBothWays(from, to, SOUTH, DOWN)) return BEND_WEST_SOUTH_DOWN; + } + } + + // Inside/Outside Edges (FACING_SIDE_FROM_TO) + if(side != null){ + switch(facing){ + case UP -> { + if(checkBothWaysSided(side, from, to, NORTH, DOWN, SOUTH)) return EDGE_INSIDE_UP_NORTH_DOWN_SOUTH; + if(checkBothWaysSided(side, from, to, EAST, DOWN, WEST)) return EDGE_INSIDE_UP_EAST_DOWN_WEST; + if(checkBothWaysSided(side, from, to, SOUTH, DOWN, NORTH)) return EDGE_INSIDE_UP_SOUTH_DOWN_NORTH; + if(checkBothWaysSided(side, from, to, WEST, DOWN, EAST)) return EDGE_INSIDE_UP_WEST_DOWN_EAST; + + if(checkBothWaysSided(side, from, to, NORTH, UP, SOUTH)) return EDGE_OUTSIDE_DOWN_NORTH_UP_SOUTH; + if(checkBothWaysSided(side, from, to, EAST, UP, WEST)) return EDGE_OUTSIDE_DOWN_EAST_UP_WEST; + if(checkBothWaysSided(side, from, to, SOUTH, UP, NORTH)) return EDGE_OUTSIDE_DOWN_SOUTH_UP_NORTH; + if(checkBothWaysSided(side, from, to, WEST, UP, EAST)) return EDGE_OUTSIDE_DOWN_WEST_UP_EAST; + } + case DOWN -> { + if(checkBothWaysSided(side, from, to, NORTH, UP, SOUTH)) return EDGE_INSIDE_DOWN_NORTH_UP_SOUTH; + if(checkBothWaysSided(side, from, to, EAST, UP, WEST)) return EDGE_INSIDE_DOWN_EAST_UP_WEST; + if(checkBothWaysSided(side, from, to, SOUTH, UP, NORTH)) return EDGE_INSIDE_DOWN_SOUTH_UP_NORTH; + if(checkBothWaysSided(side, from, to, WEST, UP, EAST)) return EDGE_INSIDE_DOWN_WEST_UP_EAST; + + if(checkBothWaysSided(side, from, to, NORTH, DOWN, SOUTH)) return EDGE_OUTSIDE_UP_NORTH_DOWN_SOUTH; + if(checkBothWaysSided(side, from, to, EAST, DOWN, WEST)) return EDGE_OUTSIDE_UP_EAST_DOWN_WEST; + if(checkBothWaysSided(side, from, to, SOUTH, DOWN, NORTH)) return EDGE_OUTSIDE_UP_SOUTH_DOWN_NORTH; + if(checkBothWaysSided(side, from, to, WEST, DOWN, EAST)) return EDGE_OUTSIDE_UP_WEST_DOWN_EAST; + } + case NORTH, EAST, SOUTH, WEST -> { + } + } + } + + return null; + } + + public static enum Connections{ + NORTH_SOUTH(NORTH, SOUTH), + EAST_WEST(EAST, WEST), + UP_DOWN(UP, DOWN), + + NORTH_EAST(NORTH, EAST), + EAST_SOUTH(EAST, SOUTH), + SOUTH_WEST(SOUTH, WEST), + WEST_NORTH(WEST, NORTH), + + UP_NORTH(UP, NORTH), + UP_EAST(UP, EAST), + UP_SOUTH(UP, SOUTH), + UP_WEST(UP, WEST), + + DOWN_NORTH(DOWN, NORTH), + DOWN_EAST(DOWN, EAST), + DOWN_SOUTH(DOWN, SOUTH), + DOWN_WEST(DOWN, WEST) + ; + + final Direction[] points; + private Connections(Direction... points){ + this.points = points; + } + + public boolean compatibleWith(Connections other){ + return this.points[0] == other.points[1] || this.points[1] == other.points[0]; + } + } + + public static enum Type implements Iterable{ + // @formatter:off + STRAIGHT_INSULATORS_FLOOR(INSULATORS_DOWN_NORTH_SOUTH, INSULATORS_DOWN_EAST_WEST), + STRAIGHT_INSULATORS_CEILING(INSULATORS_UP_NORTH_SOUTH, INSULATORS_UP_EAST_WEST), + STRAIGHT_INSULATORS_WALL_NORMAL( + INSULATORS_NORTH_UP_DOWN, + INSULATORS_EAST_UP_DOWN, + INSULATORS_SOUTH_UP_DOWN, + INSULATORS_WEST_UP_DOWN + ), + STRAIGHT_INSULATORS_WALL_ROTATED( + INSULATORS_NORTH_EAST_WEST, + INSULATORS_EAST_NORTH_SOUTH, + INSULATORS_SOUTH_EAST_WEST, + INSULATORS_WEST_NORTH_SOUTH + ), + + BENDS_FLOOR( + BEND_DOWN_NORTH_EAST, + BEND_DOWN_EAST_SOUTH, + BEND_DOWN_SOUTH_WEST, + BEND_DOWN_WEST_NORTH + ), + BENDS_CEILING( + BEND_UP_NORTH_EAST, + BEND_UP_EAST_SOUTH, + BEND_UP_SOUTH_WEST, + BEND_UP_WEST_NORTH + ), + BENDS_WALLS( + BEND_NORTH_DOWN_EAST, BEND_NORTH_EAST_UP, BEND_NORTH_UP_WEST, BEND_NORTH_WEST_DOWN, + BEND_EAST_DOWN_SOUTH, BEND_EAST_SOUTH_UP, BEND_EAST_UP_NORTH, BEND_EAST_NORTH_DOWN, + BEND_SOUTH_DOWN_WEST, BEND_SOUTH_WEST_UP, BEND_SOUTH_UP_EAST, BEND_SOUTH_EAST_DOWN, + BEND_WEST_DOWN_NORTH, BEND_WEST_NORTH_UP, BEND_WEST_UP_SOUTH, BEND_WEST_SOUTH_DOWN + ), + BENDS_WALL_NORTH(BEND_NORTH_DOWN_EAST, BEND_NORTH_EAST_UP, BEND_NORTH_UP_WEST, BEND_NORTH_WEST_DOWN), + BENDS_WALL_EAST(BEND_EAST_DOWN_SOUTH, BEND_EAST_SOUTH_UP, BEND_EAST_UP_NORTH, BEND_EAST_NORTH_DOWN), + BENDS_WALL_SOUTH(BEND_SOUTH_DOWN_WEST, BEND_SOUTH_WEST_UP, BEND_SOUTH_UP_EAST, BEND_SOUTH_EAST_DOWN), + BENDS_WALL_WEST(BEND_WEST_DOWN_NORTH, BEND_WEST_NORTH_UP, BEND_WEST_UP_SOUTH, BEND_WEST_SOUTH_DOWN), + + EDGE_INSIDE_FLOOR( + EDGE_INSIDE_DOWN_SOUTH_UP_NORTH, + EDGE_INSIDE_DOWN_WEST_UP_EAST, + EDGE_INSIDE_DOWN_NORTH_UP_SOUTH, + EDGE_INSIDE_DOWN_EAST_UP_WEST + ), + EDGE_INSIDE_CEILING( + EDGE_INSIDE_UP_NORTH_DOWN_SOUTH, + EDGE_INSIDE_UP_EAST_DOWN_WEST, + EDGE_INSIDE_UP_SOUTH_DOWN_NORTH, + EDGE_INSIDE_UP_WEST_DOWN_EAST + ), + EDGE_OUTSIDE_FLOOR( + EDGE_OUTSIDE_DOWN_NORTH_UP_SOUTH, + EDGE_OUTSIDE_DOWN_EAST_UP_WEST, + EDGE_OUTSIDE_DOWN_SOUTH_UP_NORTH, + EDGE_OUTSIDE_DOWN_WEST_UP_EAST + ), + EDGE_OUTSIDE_CEILING( + EDGE_OUTSIDE_UP_NORTH_DOWN_SOUTH, + EDGE_OUTSIDE_UP_EAST_DOWN_WEST, + EDGE_OUTSIDE_UP_SOUTH_DOWN_NORTH, + EDGE_OUTSIDE_UP_WEST_DOWN_EAST + ) + ; + // @formatter:on + public static final Set SEGMENTS_STRAIGHT; + public static final Set SEGMENTS_BEND; + public static final Set SEGMENTS_EDGE_IN; + public static final Set SEGMENTS_EDGE_OUT; + static{ + { + HashSet list = new HashSet<>(); + + list.addAll(Arrays.asList(STRAIGHT_INSULATORS_FLOOR.shapes)); + list.addAll(Arrays.asList(STRAIGHT_INSULATORS_CEILING.shapes)); + list.addAll(Arrays.asList(STRAIGHT_INSULATORS_WALL_NORMAL.shapes)); + list.addAll(Arrays.asList(STRAIGHT_INSULATORS_WALL_ROTATED.shapes)); + + SEGMENTS_STRAIGHT = Collections.unmodifiableSet(list); + } + { + HashSet list = new HashSet<>(); + + list.addAll(Arrays.asList(BENDS_FLOOR.shapes)); + list.addAll(Arrays.asList(BENDS_CEILING.shapes)); + list.addAll(Arrays.asList(BENDS_WALLS.shapes)); + + SEGMENTS_BEND = Collections.unmodifiableSet(list); + } + { + HashSet list = new HashSet<>(); + + list.addAll(Arrays.asList(EDGE_INSIDE_FLOOR.shapes)); + list.addAll(Arrays.asList(EDGE_INSIDE_CEILING.shapes)); + + SEGMENTS_EDGE_IN = Collections.unmodifiableSet(list); + } + { + HashSet list = new HashSet<>(); + + list.addAll(Arrays.asList(EDGE_OUTSIDE_FLOOR.shapes)); + list.addAll(Arrays.asList(EDGE_OUTSIDE_CEILING.shapes)); + + SEGMENTS_EDGE_OUT = Collections.unmodifiableSet(list); + } + } + + private final EnumBusbarShape[] shapes; + private Type(EnumBusbarShape... shapes){ + this.shapes = shapes; + } + + public void forEachIndexed(BiConsumer consumer){ + for(int i = 0;i < this.shapes.length;i++){ + consumer.accept(i, shapes[i]); + } + } + + public boolean contains(EnumBusbarShape shape){ + for(int i = 0;i < this.shapes.length;i++){ + if(this.shapes[i] == shape){ + return true; + } + } + return false; + } + + @Override + public Iterator iterator(){ + return Iterators.forArray(this.shapes); + } + + public Stream stream(){ + return Arrays.stream(this.shapes); + } + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index c9dc2c9..6a43f1d 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -21,14 +21,14 @@ Random bits and bobs, here and there. Possibly containing QoL things. [[dependencies.overengineered]] modId="immersiveengineering" mandatory=true - versionRange="[1.18.2-8.0.2-149,)" + versionRange="[1.18.2-8.4.0-161,)" ordering="BEFORE" side="BOTH" [[dependencies.overengineered]] modId="forge" mandatory=true - versionRange="[40.1.25,)" + versionRange="[40.1.48,)" ordering="NONE" side="BOTH" diff --git a/src/main/resources/assets/overengineered/lang/en_us.json b/src/main/resources/assets/overengineered/lang/en_us.json index 7a73a41..cdff664 100644 --- a/src/main/resources/assets/overengineered/lang/en_us.json +++ b/src/main/resources/assets/overengineered/lang/en_us.json @@ -1,2 +1,5 @@ { + "itemGroup.overengineered": "Over Engineered", + + "block.overengineered.busbar": "Busbar" } \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_bend.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_bend.json new file mode 100644 index 0000000..0de0484 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_bend.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busbar_bend.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_edge_inside.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_edge_inside.json new file mode 100644 index 0000000..657be0c --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_edge_inside.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busbar_edge_inside.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_edge_outside.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_edge_outside.json new file mode 100644 index 0000000..af84831 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_edge_outside.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busbar_edge_outside.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_straight.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_straight.json new file mode 100644 index 0000000..82de0d9 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busbar_straight.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busbar.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_a.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_a.json new file mode 100644 index 0000000..dddfb02 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_a.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busconnector_lv_a.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_b.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_b.json new file mode 100644 index 0000000..8bad438 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_b.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busconnector_lv_b.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_c.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_c.json new file mode 100644 index 0000000..bc988bb --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_lv_c.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busconnector_lv_c.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_a.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_a.json new file mode 100644 index 0000000..8c49ee4 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_a.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busconnector_mv_a.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_b.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_b.json new file mode 100644 index 0000000..4fdfaba --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_b.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busconnector_mv_b.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_c.json b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_c.json new file mode 100644 index 0000000..46db3cc --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/json/busconnector_mv_c.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "overengineered:models/block/busbar/obj/busconnector_mv_c.obj", + "textures": { + "texture": "overengineered:block/obj/busbar", + "particle": "overengineered:block/obj/busbar" + }, + "flip-v": true +} \ No newline at end of file diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar.obj new file mode 100644 index 0000000..04f0488 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar.obj @@ -0,0 +1,351 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busbar +v -0.062500 -0.312500 0.500000 +v -0.062500 -0.250000 0.500000 +v -0.062500 -0.312500 -0.500000 +v -0.062500 -0.250000 -0.500000 +v 0.062500 -0.312500 0.500000 +v 0.062500 -0.250000 0.500000 +v 0.062500 -0.312500 -0.500000 +v 0.062500 -0.250000 -0.500000 +v -0.375000 -0.312500 0.500000 +v -0.375000 -0.250000 0.500000 +v -0.375000 -0.312500 -0.500000 +v -0.375000 -0.250000 -0.500000 +v -0.250000 -0.312500 0.500000 +v -0.250000 -0.250000 0.500000 +v -0.250000 -0.312500 -0.500000 +v -0.250000 -0.250000 -0.500000 +v 0.250000 -0.312500 0.500000 +v 0.250000 -0.250000 0.500000 +v 0.250000 -0.312500 -0.500000 +v 0.250000 -0.250000 -0.500000 +v 0.375000 -0.312500 0.500000 +v 0.375000 -0.250000 0.500000 +v 0.375000 -0.312500 -0.500000 +v 0.375000 -0.250000 -0.500000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 3/1/1 4/2/1 8/3/1 7/4/1 +f 5/5/2 6/6/2 2/7/2 1/8/2 +f 5/9/3 1/10/3 3/11/3 7/12/3 +f 3/13/4 1/14/4 2/15/4 4/16/4 +f 5/17/5 7/18/5 8/19/5 6/20/5 +f 8/19/6 4/21/6 2/22/6 6/20/6 +f 11/23/1 12/24/1 16/25/1 15/26/1 +f 13/27/2 14/28/2 10/29/2 9/30/2 +f 13/31/3 9/32/3 11/33/3 15/34/3 +f 11/35/4 9/36/4 10/37/4 12/38/4 +f 13/39/5 15/40/5 16/41/5 14/42/5 +f 16/41/6 12/43/6 10/44/6 14/42/6 +f 19/45/1 20/46/1 24/47/1 23/48/1 +f 21/49/2 22/50/2 18/51/2 17/52/2 +f 21/53/3 17/54/3 19/55/3 23/56/3 +f 19/57/4 17/58/4 18/59/4 20/60/4 +f 21/61/5 23/62/5 24/63/5 22/64/5 +f 24/63/6 20/65/6 18/66/6 22/64/6 +o busbar_isolators +v 0.062500 -0.437500 0.062500 +v 0.031250 -0.375000 0.031250 +v 0.062500 -0.437500 -0.062500 +v 0.031250 -0.375000 -0.031250 +v -0.062500 -0.437500 -0.062500 +v -0.031250 -0.375000 -0.031250 +v -0.031250 -0.375000 0.031250 +v -0.062500 -0.437500 0.062500 +v 0.031250 -0.312500 -0.031250 +v 0.062500 -0.500000 -0.062500 +v 0.031250 -0.312500 0.031250 +v 0.062500 -0.500000 0.062500 +v -0.031250 -0.312500 -0.031250 +v -0.062500 -0.500000 -0.062500 +v -0.031250 -0.312500 0.031250 +v -0.062500 -0.500000 0.062500 +v -0.375000 -0.500000 0.062500 +v -0.343750 -0.312500 0.031250 +v -0.375000 -0.500000 -0.062500 +v -0.343750 -0.312500 -0.031250 +v -0.250000 -0.500000 0.062500 +v -0.281250 -0.312500 0.031250 +v -0.250000 -0.500000 -0.062500 +v -0.281250 -0.312500 -0.031250 +v -0.375000 -0.437500 0.062500 +v -0.343750 -0.375000 0.031250 +v -0.343750 -0.375000 -0.031250 +v -0.375000 -0.437500 -0.062500 +v -0.281250 -0.375000 -0.031250 +v -0.250000 -0.437500 -0.062500 +v -0.281250 -0.375000 0.031250 +v -0.250000 -0.437500 0.062500 +v 0.375000 -0.437500 0.062500 +v 0.343750 -0.375000 0.031250 +v 0.375000 -0.437500 -0.062500 +v 0.343750 -0.375000 -0.031250 +v 0.250000 -0.437500 -0.062500 +v 0.281250 -0.375000 -0.031250 +v 0.281250 -0.375000 0.031250 +v 0.250000 -0.437500 0.062500 +v 0.343750 -0.312500 -0.031250 +v 0.375000 -0.500000 -0.062500 +v 0.343750 -0.312500 0.031250 +v 0.375000 -0.500000 0.062500 +v 0.281250 -0.312500 -0.031250 +v 0.250000 -0.500000 -0.062500 +v 0.281250 -0.312500 0.031250 +v 0.250000 -0.500000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.4472 -0.8944 +vn -0.8944 0.4472 0.0000 +usemtl None +s off +f 27/67/7 28/68/7 26/69/7 25/70/7 +f 25/71/8 26/72/8 31/73/8 32/74/8 +f 36/75/9 25/71/9 32/74/9 40/76/9 +f 34/77/10 27/67/10 25/70/10 36/78/10 +f 38/79/11 29/80/11 27/81/11 34/82/11 +f 26/83/9 35/84/9 39/85/9 31/86/9 +f 30/87/11 37/88/11 33/89/11 28/90/11 +f 31/91/12 39/92/12 37/93/12 30/94/12 +f 28/95/10 33/96/10 35/97/10 26/98/10 +f 38/99/13 34/100/13 36/101/13 40/102/13 +f 50/103/12 42/104/12 44/105/12 51/106/12 +f 51/107/11 44/108/11 48/109/11 53/110/11 +f 53/111/10 48/112/10 46/113/10 55/114/10 +f 55/115/9 46/116/9 42/117/9 50/118/9 +f 43/119/13 47/120/13 45/121/13 41/122/13 +f 45/123/9 56/124/9 49/125/9 41/126/9 +f 56/124/8 55/127/8 50/128/8 49/125/8 +f 47/129/10 54/130/10 56/131/10 45/132/10 +f 54/130/7 53/133/7 55/134/7 56/131/7 +f 43/135/11 52/136/11 54/137/11 47/138/11 +f 52/136/14 51/139/14 53/140/14 54/137/14 +f 41/141/12 49/142/12 52/143/12 43/144/12 +f 49/142/15 50/145/15 51/146/15 52/143/15 +f 29/80/14 30/147/14 28/148/14 27/81/14 +f 40/149/12 32/150/12 29/151/12 38/152/12 +f 32/150/15 31/153/15 30/154/15 29/151/15 +f 59/155/7 60/156/7 58/157/7 57/158/7 +f 57/159/8 58/160/8 63/161/8 64/162/8 +f 68/163/9 57/159/9 64/162/9 72/164/9 +f 66/165/10 59/155/10 57/158/10 68/166/10 +f 70/167/11 61/168/11 59/169/11 66/170/11 +f 58/171/9 67/172/9 71/173/9 63/174/9 +f 62/175/11 69/176/11 65/177/11 60/178/11 +f 63/179/12 71/180/12 69/181/12 62/182/12 +f 60/183/10 65/184/10 67/185/10 58/186/10 +f 70/187/13 66/188/13 68/189/13 72/190/13 +f 61/168/14 62/191/14 60/192/14 59/169/14 +f 72/193/12 64/194/12 61/195/12 70/196/12 +f 64/194/15 63/197/15 62/198/15 61/195/15 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_bend.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_bend.obj new file mode 100644 index 0000000..d2b5032 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_bend.obj @@ -0,0 +1,472 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busbar_bend +v -0.062500 -0.312500 0.062500 +v -0.062500 -0.312500 -0.500000 +v -0.062500 -0.250000 -0.500000 +v 0.062500 -0.250000 0.062500 +v 0.062500 -0.250000 -0.500000 +v -0.375000 -0.312500 -0.250000 +v -0.375000 -0.250000 -0.250000 +v -0.375000 -0.250000 -0.500000 +v -0.250000 -0.250000 -0.250000 +v -0.250000 -0.312500 -0.500000 +v -0.250000 -0.250000 -0.500000 +v 0.250000 -0.250000 -0.500000 +v 0.375000 -0.312500 -0.500000 +v 0.375000 -0.250000 -0.500000 +v 0.062500 -0.312500 0.062500 +v -0.500000 -0.250000 0.062500 +v -0.500000 -0.250000 -0.062500 +v -0.250000 -0.312500 -0.250000 +v -0.500000 -0.312500 -0.250000 +v -0.500000 -0.250000 -0.250000 +v -0.500000 -0.250000 -0.375000 +v 0.375000 -0.312500 0.375000 +v 0.375000 -0.250000 0.375000 +v 0.375000 -0.312500 0.250000 +v 0.375000 -0.250000 0.250000 +v 0.250000 -0.312500 0.250000 +v 0.250000 -0.312500 0.375000 +v 0.250000 -0.250000 0.375000 +v 0.250000 -0.250000 0.250000 +v -0.062500 -0.250000 0.062500 +v -0.062500 -0.250000 -0.062500 +v 0.062500 -0.312500 -0.062500 +v 0.062500 -0.250000 -0.062500 +v -0.062500 -0.312500 -0.062500 +v -0.375000 -0.312500 -0.375000 +v -0.250000 -0.312500 -0.375000 +v -0.250000 -0.250000 -0.375000 +v -0.375000 -0.250000 -0.375000 +v -0.500000 -0.312500 0.062500 +v -0.500000 -0.312500 0.250000 +v -0.500000 -0.312500 0.375000 +v -0.500000 -0.250000 0.375000 +v -0.500000 -0.250000 0.250000 +v -0.500000 -0.312500 -0.062500 +v -0.500000 -0.312500 -0.375000 +v -0.375000 -0.312500 -0.500000 +v 0.062500 -0.312500 -0.500000 +v 0.250000 -0.312500 -0.500000 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.875000 1.000000 +vt 0.875000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.875000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.875000 0.875000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.875000 1.000000 +vt 0.875000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.875000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.875000 0.875000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.250000 0.875000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.875000 0.812500 +vt 0.875000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 1.000000 1.000000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.562500 1.000000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.562500 1.000000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.562500 1.000000 +vt 0.562500 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.875000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 0.000000 0.812500 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.750000 1.000000 +vt 0.750000 0.875000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.000000 0.812500 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.000000 0.875000 +vt 0.750000 0.812500 +vt 0.875000 0.812500 +vt 0.875000 0.875000 +vt 0.750000 0.875000 +vt 0.437500 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.437500 0.875000 +vt 0.125000 0.812500 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.125000 0.875000 +vt 0.750000 0.812500 +vt 0.875000 0.812500 +vt 0.875000 0.875000 +vt 0.750000 0.875000 +vt 0.437500 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.437500 0.875000 +vt 0.125000 0.812500 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.125000 0.875000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 15/1/1 4/2/1 30/3/1 1/4/1 +f 18/5/1 9/6/1 7/7/1 6/8/1 +f 36/9/2 35/10/2 46/11/2 10/12/2 +f 36/13/3 10/14/3 11/15/3 37/16/3 +f 48/17/4 26/18/4 29/19/4 12/20/4 +f 32/21/3 33/22/3 4/23/3 15/24/3 +f 36/25/3 37/26/3 9/27/3 18/28/3 +f 35/29/2 6/30/2 19/31/2 45/32/2 +f 35/33/5 45/34/5 21/35/5 38/36/5 +f 26/37/5 40/38/5 43/39/5 29/40/5 +f 41/41/1 27/42/1 28/43/1 42/44/1 +f 41/45/2 40/46/2 26/47/2 27/48/2 +f 27/42/1 22/49/1 23/50/1 28/43/1 +f 43/39/6 42/51/6 28/52/6 29/40/6 +f 24/53/3 13/54/3 14/55/3 25/56/3 +f 25/56/6 29/57/6 28/58/6 23/59/6 +f 22/60/3 24/53/3 25/56/3 23/59/3 +f 24/61/2 26/62/2 48/63/2 13/64/2 +f 22/65/2 27/66/2 26/62/2 24/61/2 +f 29/57/6 25/56/6 14/55/6 12/67/6 +f 5/68/6 3/69/6 31/70/6 33/71/6 +f 32/72/3 47/73/3 5/68/3 33/71/3 +f 2/74/4 34/75/4 31/76/4 3/77/4 +f 34/78/2 32/79/2 15/80/2 1/81/2 +f 32/79/2 34/78/2 2/82/2 47/83/2 +f 17/84/6 16/85/6 30/86/6 31/87/6 +f 34/88/5 44/89/5 17/84/5 31/87/5 +f 39/90/1 1/91/1 30/92/1 16/93/1 +f 34/94/2 1/95/2 39/96/2 44/97/2 +f 30/98/6 4/99/6 33/71/6 31/70/6 +f 11/15/6 8/100/6 38/101/6 37/16/6 +f 37/16/6 38/101/6 7/102/6 9/103/6 +f 46/104/4 35/105/4 38/106/4 8/107/4 +f 18/108/2 6/109/2 35/10/2 36/9/2 +f 21/35/6 20/110/6 7/111/6 38/36/6 +f 19/112/1 6/113/1 7/114/1 20/115/1 +f 40/116/4 41/117/4 42/118/4 43/119/4 +f 44/120/4 39/121/4 16/122/4 17/123/4 +f 45/124/4 19/125/4 20/126/4 21/127/4 +f 10/128/5 46/129/5 8/130/5 11/131/5 +f 47/132/5 2/133/5 3/134/5 5/135/5 +f 13/136/5 48/137/5 12/138/5 14/139/5 +o busbar_insulators_corner +v 0.062500 -0.437500 0.062500 +v 0.031250 -0.375000 0.031250 +v 0.062500 -0.437500 -0.062500 +v 0.031250 -0.375000 -0.031250 +v -0.062500 -0.437500 -0.062500 +v -0.031250 -0.375000 -0.031250 +v -0.031250 -0.375000 0.031250 +v -0.062500 -0.437500 0.062500 +v 0.031250 -0.312500 -0.031250 +v 0.062500 -0.500000 -0.062500 +v 0.031250 -0.312500 0.031250 +v 0.062500 -0.500000 0.062500 +v -0.031250 -0.312500 -0.031250 +v -0.062500 -0.500000 -0.062500 +v -0.031250 -0.312500 0.031250 +v -0.062500 -0.500000 0.062500 +v -0.375000 -0.500000 -0.250000 +v -0.343750 -0.312500 -0.281250 +v -0.375000 -0.500000 -0.375000 +v -0.343750 -0.312500 -0.343750 +v -0.250000 -0.500000 -0.250000 +v -0.281250 -0.312500 -0.281250 +v -0.250000 -0.500000 -0.375000 +v -0.281250 -0.312500 -0.343750 +v -0.375000 -0.437500 -0.250000 +v -0.343750 -0.375000 -0.281250 +v -0.343750 -0.375000 -0.343750 +v -0.375000 -0.437500 -0.375000 +v -0.281250 -0.375000 -0.343750 +v -0.250000 -0.437500 -0.375000 +v -0.281250 -0.375000 -0.281250 +v -0.250000 -0.437500 -0.250000 +v 0.375000 -0.437500 0.375000 +v 0.343750 -0.375000 0.343750 +v 0.375000 -0.437500 0.250000 +v 0.343750 -0.375000 0.281250 +v 0.250000 -0.437500 0.250000 +v 0.281250 -0.375000 0.281250 +v 0.281250 -0.375000 0.343750 +v 0.250000 -0.437500 0.375000 +v 0.343750 -0.312500 0.281250 +v 0.375000 -0.500000 0.250000 +v 0.343750 -0.312500 0.343750 +v 0.375000 -0.500000 0.375000 +v 0.281250 -0.312500 0.281250 +v 0.250000 -0.500000 0.250000 +v 0.281250 -0.312500 0.343750 +v 0.250000 -0.500000 0.375000 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.4472 -0.8944 +vn -0.8944 0.4472 0.0000 +usemtl None +s off +f 51/140/7 52/141/7 50/142/7 49/143/7 +f 49/144/8 50/145/8 55/146/8 56/147/8 +f 60/148/9 49/144/9 56/147/9 64/149/9 +f 58/150/10 51/140/10 49/143/10 60/151/10 +f 62/152/11 53/153/11 51/154/11 58/155/11 +f 50/156/9 59/157/9 63/158/9 55/159/9 +f 54/160/11 61/161/11 57/162/11 52/163/11 +f 55/164/12 63/165/12 61/166/12 54/167/12 +f 52/168/10 57/169/10 59/170/10 50/171/10 +f 62/172/13 58/173/13 60/174/13 64/175/13 +f 74/176/12 66/177/12 68/178/12 75/179/12 +f 75/180/11 68/181/11 72/182/11 77/183/11 +f 77/184/10 72/185/10 70/186/10 79/187/10 +f 79/188/9 70/189/9 66/190/9 74/191/9 +f 67/192/13 71/193/13 69/194/13 65/195/13 +f 69/196/9 80/197/9 73/198/9 65/199/9 +f 80/197/8 79/200/8 74/201/8 73/198/8 +f 71/202/10 78/203/10 80/204/10 69/205/10 +f 78/203/7 77/206/7 79/207/7 80/204/7 +f 67/208/11 76/209/11 78/210/11 71/211/11 +f 76/209/14 75/212/14 77/213/14 78/210/14 +f 65/214/12 73/215/12 76/216/12 67/217/12 +f 73/215/15 74/218/15 75/219/15 76/216/15 +f 53/153/14 54/220/14 52/221/14 51/154/14 +f 64/222/12 56/223/12 53/224/12 62/225/12 +f 56/223/15 55/226/15 54/227/15 53/224/15 +f 83/228/7 84/229/7 82/230/7 81/231/7 +f 81/232/8 82/233/8 87/234/8 88/235/8 +f 92/236/9 81/232/9 88/235/9 96/237/9 +f 90/238/10 83/228/10 81/231/10 92/239/10 +f 94/240/11 85/241/11 83/242/11 90/243/11 +f 82/244/9 91/245/9 95/246/9 87/247/9 +f 86/248/11 93/249/11 89/250/11 84/251/11 +f 87/252/12 95/253/12 93/254/12 86/255/12 +f 84/256/10 89/257/10 91/258/10 82/259/10 +f 94/260/13 90/261/13 92/262/13 96/263/13 +f 85/241/14 86/264/14 84/265/14 83/242/14 +f 96/266/12 88/267/12 85/268/12 94/269/12 +f 88/267/15 87/270/15 86/271/15 85/268/15 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_edge_inside.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_edge_inside.obj new file mode 100644 index 0000000..cf0d05d --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_edge_inside.obj @@ -0,0 +1,705 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busbar_edge_inside +v -0.062500 -0.312500 0.312500 +v -0.062500 -0.250000 0.312500 +v -0.062500 -0.312500 -0.500000 +v -0.062500 -0.250000 -0.500000 +v 0.062500 -0.312500 0.312500 +v 0.062500 -0.250000 0.312500 +v 0.062500 -0.312500 -0.500000 +v 0.062500 -0.250000 -0.500000 +v 0.062500 0.500000 0.312500 +v 0.062500 0.500000 0.250000 +v -0.062500 0.500000 0.312500 +v -0.062500 0.500000 0.250000 +v 0.062500 -0.250000 0.250000 +v -0.062500 -0.250000 0.250000 +v 0.062500 -0.312500 0.250000 +v -0.062500 -0.312500 0.250000 +v -0.375000 -0.312500 0.312500 +v -0.375000 -0.250000 0.312500 +v -0.375000 -0.312500 -0.500000 +v -0.375000 -0.250000 -0.500000 +v -0.250000 -0.312500 0.312500 +v -0.250000 -0.250000 0.312500 +v -0.250000 -0.312500 -0.500000 +v -0.250000 -0.250000 -0.500000 +v -0.250000 0.500000 0.312500 +v -0.250000 0.500000 0.250000 +v -0.375000 0.500000 0.312500 +v -0.375000 0.500000 0.250000 +v -0.250000 -0.250000 0.250000 +v -0.375000 -0.250000 0.250000 +v -0.250000 -0.312500 0.250000 +v -0.375000 -0.312500 0.250000 +v 0.250000 -0.312500 0.312500 +v 0.250000 -0.250000 0.312500 +v 0.250000 -0.312500 -0.500000 +v 0.250000 -0.250000 -0.500000 +v 0.375000 -0.312500 0.312500 +v 0.375000 -0.250000 0.312500 +v 0.375000 -0.312500 -0.500000 +v 0.375000 -0.250000 -0.500000 +v 0.375000 0.500000 0.312500 +v 0.375000 0.500000 0.250000 +v 0.250000 0.500000 0.312500 +v 0.250000 0.500000 0.250000 +v 0.375000 -0.250000 0.250000 +v 0.250000 -0.250000 0.250000 +v 0.375000 -0.312500 0.250000 +v 0.250000 -0.312500 0.250000 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.937500 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.937500 0.875000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 1.000000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.937500 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.937500 0.875000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 1.000000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.687500 0.812500 +vt 0.687500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.937500 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.937500 0.875000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.250000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 1.000000 1.000000 +vt 0.250000 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl None +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 16/5/2 1/6/2 2/7/2 14/8/2 +f 14/9/3 13/10/3 8/11/3 4/12/3 +f 16/13/4 3/14/4 7/15/4 15/16/4 +f 15/17/5 7/18/5 8/11/5 13/10/5 +f 12/19/2 14/20/2 2/21/2 11/22/2 +f 13/23/5 10/24/5 9/25/5 6/26/5 +f 2/27/1 6/26/1 9/25/1 11/28/1 +f 14/29/6 12/30/6 10/31/6 13/32/6 +f 3/33/2 16/34/2 14/35/2 4/36/2 +f 1/37/4 16/38/4 15/39/4 5/40/4 +f 12/41/3 11/42/3 9/43/3 10/44/3 +f 5/45/5 15/46/5 13/47/5 6/48/5 +f 21/49/1 22/50/1 18/51/1 17/52/1 +f 32/53/2 17/54/2 18/55/2 30/56/2 +f 30/57/3 29/58/3 24/59/3 20/60/3 +f 32/61/4 19/62/4 23/63/4 31/64/4 +f 31/65/5 23/66/5 24/59/5 29/58/5 +f 28/67/2 30/68/2 18/69/2 27/70/2 +f 29/71/5 26/72/5 25/73/5 22/74/5 +f 18/75/1 22/74/1 25/73/1 27/76/1 +f 30/77/6 28/78/6 26/79/6 29/80/6 +f 19/81/2 32/82/2 30/83/2 20/84/2 +f 17/85/4 32/86/4 31/87/4 21/88/4 +f 28/89/3 27/90/3 25/91/3 26/92/3 +f 21/93/5 31/94/5 29/95/5 22/96/5 +f 37/97/1 38/98/1 34/99/1 33/100/1 +f 48/101/2 33/102/2 34/103/2 46/104/2 +f 46/105/3 45/106/3 40/107/3 36/108/3 +f 48/109/4 35/110/4 39/111/4 47/112/4 +f 47/113/5 39/114/5 40/107/5 45/106/5 +f 44/115/2 46/116/2 34/117/2 43/118/2 +f 45/119/5 42/120/5 41/121/5 38/122/5 +f 34/123/1 38/122/1 41/121/1 43/124/1 +f 46/125/6 44/126/6 42/127/6 45/128/6 +f 35/129/2 48/130/2 46/131/2 36/132/2 +f 33/133/4 48/134/4 47/135/4 37/136/4 +f 44/137/3 43/138/3 41/139/3 42/140/3 +f 37/141/5 47/142/5 45/143/5 38/144/5 +o busbar_isolators_side_busbar_isolators +v 0.062500 0.062500 0.437500 +v 0.031250 0.031250 0.375000 +v 0.062500 -0.062500 0.437500 +v 0.031250 -0.031250 0.375000 +v -0.062500 -0.062500 0.437500 +v -0.031250 -0.031250 0.375000 +v -0.031250 0.031250 0.375000 +v -0.062500 0.062500 0.437500 +v 0.031250 -0.031250 0.312500 +v 0.062500 -0.062500 0.500000 +v 0.031250 0.031250 0.312500 +v 0.062500 0.062500 0.500000 +v -0.031250 -0.031250 0.312500 +v -0.062500 -0.062500 0.500000 +v -0.031250 0.031250 0.312500 +v -0.062500 0.062500 0.500000 +v -0.375000 0.062500 0.500000 +v -0.343750 0.031250 0.312500 +v -0.375000 -0.062500 0.500000 +v -0.343750 -0.031250 0.312500 +v -0.250000 0.062500 0.500000 +v -0.281250 0.031250 0.312500 +v -0.250000 -0.062500 0.500000 +v -0.281250 -0.031250 0.312500 +v -0.375000 0.062500 0.437500 +v -0.343750 0.031250 0.375000 +v -0.343750 -0.031250 0.375000 +v -0.375000 -0.062500 0.437500 +v -0.281250 -0.031250 0.375000 +v -0.250000 -0.062500 0.437500 +v -0.281250 0.031250 0.375000 +v -0.250000 0.062500 0.437500 +v 0.375000 0.062500 0.437500 +v 0.343750 0.031250 0.375000 +v 0.375000 -0.062500 0.437500 +v 0.343750 -0.031250 0.375000 +v 0.250000 -0.062500 0.437500 +v 0.281250 -0.031250 0.375000 +v 0.281250 0.031250 0.375000 +v 0.250000 0.062500 0.437500 +v 0.343750 -0.031250 0.312500 +v 0.375000 -0.062500 0.500000 +v 0.343750 0.031250 0.312500 +v 0.375000 0.062500 0.500000 +v 0.281250 -0.031250 0.312500 +v 0.250000 -0.062500 0.500000 +v 0.281250 0.031250 0.312500 +v 0.250000 0.062500 0.500000 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vn 0.8944 0.0000 -0.4472 +vn 0.0000 0.8944 -0.4472 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.8944 -0.4472 +vn -0.8944 0.0000 -0.4472 +usemtl None +s off +f 51/145/7 52/146/7 50/147/7 49/148/7 +f 49/149/8 50/150/8 55/151/8 56/152/8 +f 60/153/9 49/149/9 56/152/9 64/154/9 +f 58/155/10 51/145/10 49/148/10 60/156/10 +f 62/157/11 53/158/11 51/159/11 58/160/11 +f 50/161/9 59/162/9 63/163/9 55/164/9 +f 54/165/11 61/166/11 57/167/11 52/168/11 +f 55/169/12 63/170/12 61/171/12 54/172/12 +f 52/173/10 57/174/10 59/175/10 50/176/10 +f 62/177/13 58/178/13 60/179/13 64/180/13 +f 74/181/12 66/182/12 68/183/12 75/184/12 +f 75/185/11 68/186/11 72/187/11 77/188/11 +f 77/189/10 72/190/10 70/191/10 79/192/10 +f 79/193/9 70/194/9 66/195/9 74/196/9 +f 67/197/13 71/198/13 69/199/13 65/200/13 +f 69/201/9 80/202/9 73/203/9 65/204/9 +f 80/202/8 79/205/8 74/206/8 73/203/8 +f 71/207/10 78/208/10 80/209/10 69/210/10 +f 78/208/7 77/211/7 79/212/7 80/209/7 +f 67/213/11 76/214/11 78/215/11 71/216/11 +f 76/214/14 75/217/14 77/218/14 78/215/14 +f 65/219/12 73/220/12 76/221/12 67/222/12 +f 73/220/15 74/223/15 75/224/15 76/221/15 +f 53/158/14 54/225/14 52/226/14 51/159/14 +f 64/227/12 56/228/12 53/229/12 62/230/12 +f 56/228/15 55/231/15 54/232/15 53/229/15 +f 83/233/7 84/234/7 82/235/7 81/236/7 +f 81/237/8 82/238/8 87/239/8 88/240/8 +f 92/241/9 81/237/9 88/240/9 96/242/9 +f 90/243/10 83/233/10 81/236/10 92/244/10 +f 94/245/11 85/246/11 83/247/11 90/248/11 +f 82/249/9 91/250/9 95/251/9 87/252/9 +f 86/253/11 93/254/11 89/255/11 84/256/11 +f 87/257/12 95/258/12 93/259/12 86/260/12 +f 84/261/10 89/262/10 91/263/10 82/264/10 +f 94/265/13 90/266/13 92/267/13 96/268/13 +f 85/246/14 86/269/14 84/270/14 83/247/14 +f 96/271/12 88/272/12 85/273/12 94/274/12 +f 88/272/15 87/275/15 86/276/15 85/273/15 +o busbar_isolators +v 0.062500 -0.437500 0.062500 +v 0.031250 -0.375000 0.031250 +v 0.062500 -0.437500 -0.062500 +v 0.031250 -0.375000 -0.031250 +v -0.062500 -0.437500 -0.062500 +v -0.031250 -0.375000 -0.031250 +v -0.031250 -0.375000 0.031250 +v -0.062500 -0.437500 0.062500 +v 0.031250 -0.312500 -0.031250 +v 0.062500 -0.500000 -0.062500 +v 0.031250 -0.312500 0.031250 +v 0.062500 -0.500000 0.062500 +v -0.031250 -0.312500 -0.031250 +v -0.062500 -0.500000 -0.062500 +v -0.031250 -0.312500 0.031250 +v -0.062500 -0.500000 0.062500 +v -0.375000 -0.500000 0.062500 +v -0.343750 -0.312500 0.031250 +v -0.375000 -0.500000 -0.062500 +v -0.343750 -0.312500 -0.031250 +v -0.250000 -0.500000 0.062500 +v -0.281250 -0.312500 0.031250 +v -0.250000 -0.500000 -0.062500 +v -0.281250 -0.312500 -0.031250 +v -0.375000 -0.437500 0.062500 +v -0.343750 -0.375000 0.031250 +v -0.343750 -0.375000 -0.031250 +v -0.375000 -0.437500 -0.062500 +v -0.281250 -0.375000 -0.031250 +v -0.250000 -0.437500 -0.062500 +v -0.281250 -0.375000 0.031250 +v -0.250000 -0.437500 0.062500 +v 0.375000 -0.437500 0.062500 +v 0.343750 -0.375000 0.031250 +v 0.375000 -0.437500 -0.062500 +v 0.343750 -0.375000 -0.031250 +v 0.250000 -0.437500 -0.062500 +v 0.281250 -0.375000 -0.031250 +v 0.281250 -0.375000 0.031250 +v 0.250000 -0.437500 0.062500 +v 0.343750 -0.312500 -0.031250 +v 0.375000 -0.500000 -0.062500 +v 0.343750 -0.312500 0.031250 +v 0.375000 -0.500000 0.062500 +v 0.281250 -0.312500 -0.031250 +v 0.250000 -0.500000 -0.062500 +v 0.281250 -0.312500 0.031250 +v 0.250000 -0.500000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.062500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.000000 0.062500 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.000000 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.125000 +vt 0.125000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.187500 +vt 0.125000 0.187500 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.000000 0.062500 +vt 0.000000 0.000000 +vt 0.093750 0.125000 +vt 0.031250 0.125000 +vn 0.8944 0.4472 0.0000 +vn 0.0000 0.4472 0.8944 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.4472 -0.8944 +vn -0.8944 0.4472 0.0000 +usemtl None +s off +f 99/277/16 100/278/16 98/279/16 97/280/16 +f 97/281/17 98/282/17 103/283/17 104/284/17 +f 108/285/18 97/281/18 104/284/18 112/286/18 +f 106/287/19 99/277/19 97/280/19 108/288/19 +f 110/289/20 101/290/20 99/291/20 106/292/20 +f 98/293/18 107/294/18 111/295/18 103/296/18 +f 102/297/20 109/298/20 105/299/20 100/300/20 +f 103/301/21 111/302/21 109/303/21 102/304/21 +f 100/305/19 105/306/19 107/307/19 98/308/19 +f 110/309/22 106/310/22 108/311/22 112/312/22 +f 122/313/21 114/314/21 116/315/21 123/316/21 +f 123/317/20 116/318/20 120/319/20 125/320/20 +f 125/321/19 120/322/19 118/323/19 127/324/19 +f 127/325/18 118/326/18 114/327/18 122/328/18 +f 115/329/22 119/330/22 117/331/22 113/332/22 +f 117/333/18 128/334/18 121/335/18 113/336/18 +f 128/334/17 127/337/17 122/338/17 121/335/17 +f 119/339/19 126/340/19 128/341/19 117/342/19 +f 126/340/16 125/343/16 127/344/16 128/341/16 +f 115/345/20 124/346/20 126/347/20 119/348/20 +f 124/346/23 123/349/23 125/350/23 126/347/23 +f 113/351/21 121/352/21 124/353/21 115/354/21 +f 121/352/24 122/355/24 123/356/24 124/353/24 +f 101/290/23 102/357/23 100/358/23 99/291/23 +f 112/359/21 104/360/21 101/361/21 110/362/21 +f 104/360/24 103/363/24 102/364/24 101/361/24 +f 131/365/16 132/366/16 130/367/16 129/368/16 +f 129/369/17 130/370/17 135/371/17 136/372/17 +f 140/373/18 129/369/18 136/372/18 144/374/18 +f 138/375/19 131/365/19 129/368/19 140/376/19 +f 142/377/20 133/378/20 131/379/20 138/380/20 +f 130/381/18 139/382/18 143/383/18 135/384/18 +f 134/385/20 141/386/20 137/387/20 132/388/20 +f 135/389/21 143/390/21 141/391/21 134/392/21 +f 132/393/19 137/394/19 139/395/19 130/396/19 +f 142/397/22 138/398/22 140/399/22 144/400/22 +f 133/378/23 134/401/23 132/402/23 131/379/23 +f 144/403/21 136/404/21 133/405/21 142/406/21 +f 136/404/24 135/407/24 134/408/24 133/405/24 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_edge_outside.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_edge_outside.obj new file mode 100644 index 0000000..08dab7b --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busbar_edge_outside.obj @@ -0,0 +1,207 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busbar_edge_outside +v -0.062500 -0.312500 0.500000 +v -0.062500 -0.250000 0.500000 +v -0.375000 -0.312500 0.312500 +v -0.062500 -0.250000 0.250000 +v 0.062500 -0.312500 0.500000 +v 0.062500 -0.250000 0.500000 +v 0.062500 -0.312500 0.250000 +v -0.250000 -0.250000 0.312500 +v 0.062500 -0.250000 0.312500 +v -0.062500 -0.312500 0.312500 +v 0.062500 -0.250000 0.250000 +v -0.250000 -0.312500 0.250000 +v -0.250000 -0.250000 0.500000 +v -0.062500 -0.312500 0.250000 +v -0.250000 -0.312500 0.500000 +v -0.062500 -0.250000 0.312500 +v -0.375000 -0.250000 0.250000 +v -0.375000 -0.250000 0.500000 +v 0.062500 -0.312500 0.312500 +v -0.375000 -0.312500 0.500000 +v -0.250000 -0.250000 0.250000 +v -0.375000 -0.312500 0.250000 +v -0.375000 -0.250000 0.312500 +v -0.250000 -0.312500 0.312500 +v -0.250000 -0.500000 0.312500 +v -0.375000 -0.500000 0.250000 +v -0.250000 -0.500000 0.250000 +v 0.250000 -0.312500 0.312500 +v 0.375000 -0.250000 0.312500 +v 0.375000 -0.312500 0.250000 +v 0.375000 -0.250000 0.500000 +v 0.375000 -0.312500 0.500000 +v 0.250000 -0.250000 0.250000 +v 0.250000 -0.250000 0.500000 +v 0.250000 -0.312500 0.500000 +v 0.375000 -0.250000 0.250000 +v 0.250000 -0.312500 0.250000 +v 0.250000 -0.250000 0.312500 +v 0.375000 -0.312500 0.312500 +v 0.250000 -0.500000 0.250000 +v -0.062500 -0.500000 0.312500 +v -0.062500 -0.500000 0.250000 +v 0.062500 -0.500000 0.312500 +v 0.062500 -0.500000 0.250000 +v -0.375000 -0.500000 0.312500 +v 0.250000 -0.500000 0.312500 +v 0.375000 -0.500000 0.312500 +v 0.375000 -0.500000 0.250000 +vt 0.187500 0.812500 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.000000 0.812500 +vt 0.000000 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.000000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.875000 +vt 0.000000 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.000000 1.000000 +vt 0.187500 1.000000 +vt 0.250000 1.000000 +vt 0.812500 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.812500 0.875000 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.750000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.750000 0.812500 +vt 0.250000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.250000 0.875000 +vt 0.437500 1.000000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.000000 1.000000 +vt 0.187500 1.000000 +vt 0.250000 1.000000 +vt 0.812500 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.812500 0.875000 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.750000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.750000 0.812500 +vt 0.250000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.250000 0.875000 +vt 0.437500 1.000000 +vt 0.250000 1.000000 +vt 0.187500 0.812500 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.000000 0.812500 +vt 0.000000 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.000000 1.000000 +vt 0.187500 1.000000 +vt 0.250000 1.000000 +vt 0.812500 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.812500 0.875000 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.750000 0.875000 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.750000 0.812500 +vt 0.250000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.250000 0.875000 +vt 0.437500 1.000000 +vt 0.250000 1.000000 +vn 1.0000 0.0000 0.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 0.0000 0.0000 1.0000 +usemtl None +s off +f 24/1/1 12/2/1 21/3/1 8/4/1 +f 15/5/1 24/1/1 8/4/1 13/6/1 +f 22/7/2 17/8/2 21/9/2 12/10/2 +f 5/11/1 19/12/1 9/13/1 6/14/1 +f 14/15/2 4/16/2 11/17/2 7/18/2 +f 19/12/1 7/19/1 11/20/1 9/13/1 +f 5/21/3 1/22/3 10/23/3 19/24/3 +f 2/25/4 6/14/4 9/13/4 16/26/4 +f 11/20/4 4/27/4 16/26/4 9/13/4 +f 10/28/5 1/29/5 2/30/5 16/31/5 +f 14/32/5 10/28/5 16/31/5 4/33/5 +f 14/34/5 42/35/5 41/36/5 10/37/5 +f 10/38/6 41/39/6 43/40/6 19/41/6 +f 19/42/1 43/43/1 44/44/1 7/45/1 +f 42/46/2 14/47/2 7/45/2 44/44/2 +f 15/48/3 20/49/3 3/50/3 24/51/3 +f 18/52/4 13/6/4 8/4/4 23/53/4 +f 21/3/4 17/54/4 23/53/4 8/4/4 +f 3/55/5 20/56/5 18/57/5 23/58/5 +f 22/59/5 3/55/5 23/58/5 17/60/5 +f 22/61/5 26/62/5 45/63/5 3/64/5 +f 3/65/6 45/66/6 25/67/6 24/68/6 +f 24/69/1 25/70/1 27/71/1 12/72/1 +f 26/73/2 22/74/2 12/72/2 27/71/2 +f 39/75/1 30/76/1 36/77/1 29/78/1 +f 32/79/1 39/75/1 29/78/1 31/80/1 +f 37/81/2 33/82/2 36/83/2 30/84/2 +f 32/85/3 35/86/3 28/87/3 39/88/3 +f 34/89/4 31/80/4 29/78/4 38/90/4 +f 36/77/4 33/91/4 38/90/4 29/78/4 +f 28/92/5 35/93/5 34/94/5 38/95/5 +f 37/96/5 28/92/5 38/95/5 33/97/5 +f 37/98/5 40/99/5 46/100/5 28/101/5 +f 28/102/6 46/103/6 47/104/6 39/105/6 +f 39/106/1 47/107/1 48/108/1 30/109/1 +f 40/110/2 37/111/2 30/109/2 48/108/2 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_a.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_a.obj new file mode 100644 index 0000000..6b83bab --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_a.obj @@ -0,0 +1,60 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busconnector_lv_a +v -0.375000 -0.218750 0.062500 +v -0.375000 -0.156250 0.062500 +v -0.812500 -0.218750 0.062500 +v -0.812500 -0.156250 0.062500 +v -0.375000 -0.218750 -0.062500 +v -0.375000 -0.156250 -0.062500 +v -0.812500 -0.218750 -0.062500 +v -0.812500 -0.156250 -0.062500 +v -0.343750 -0.250000 0.062500 +v -0.281250 -0.250000 0.062500 +v -0.281250 -0.250000 -0.062500 +v -0.343750 -0.250000 -0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.000000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +usemtl None +s off +f 2/1/1 1/2/1 9/3/1 10/4/1 +f 5/5/2 1/6/2 3/7/2 7/8/2 +f 3/9/1 1/10/1 2/11/1 4/12/1 +f 5/13/3 7/14/3 8/15/3 6/16/3 +f 8/15/4 4/17/4 2/18/4 6/16/4 +f 6/19/5 2/20/5 10/21/5 11/22/5 +f 5/13/3 6/16/3 11/23/3 12/24/3 +f 1/25/6 5/26/6 12/27/6 9/28/6 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_b.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_b.obj new file mode 100644 index 0000000..a0ad929 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_b.obj @@ -0,0 +1,60 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busconnector_lv_b +v -0.062500 -0.218750 0.062500 +v -0.062500 -0.156250 0.062500 +v -0.812500 -0.218750 0.062500 +v -0.812500 -0.156250 0.062500 +v -0.062500 -0.218750 -0.062500 +v -0.062500 -0.156250 -0.062500 +v -0.812500 -0.218750 -0.062500 +v -0.812500 -0.156250 -0.062500 +v -0.031250 -0.250000 0.062500 +v 0.031250 -0.250000 0.062500 +v 0.031250 -0.250000 -0.062500 +v -0.031250 -0.250000 -0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.750000 0.875000 +vt 0.750000 1.000000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.750000 1.000000 +vt 0.000000 1.000000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +usemtl None +s off +f 2/1/1 1/2/1 9/3/1 10/4/1 +f 5/5/2 1/6/2 3/7/2 7/8/2 +f 3/9/1 1/10/1 2/11/1 4/12/1 +f 5/13/3 7/14/3 8/15/3 6/16/3 +f 8/15/4 4/17/4 2/18/4 6/16/4 +f 6/19/5 2/20/5 10/21/5 11/22/5 +f 5/13/3 6/16/3 11/23/3 12/24/3 +f 1/25/6 5/26/6 12/27/6 9/28/6 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_c.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_c.obj new file mode 100644 index 0000000..6677374 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_lv_c.obj @@ -0,0 +1,82 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busconnector_lv_c +v 0.250000 -0.218750 0.062500 +v 0.250000 -0.156250 0.062500 +v -0.812500 -0.218750 0.062500 +v -0.812500 -0.156250 0.062500 +v 0.250000 -0.218750 -0.062500 +v 0.250000 -0.156250 -0.062500 +v -0.812500 -0.218750 -0.062500 +v -0.812500 -0.156250 -0.062500 +v 0.281250 -0.250000 0.062500 +v 0.343750 -0.250000 0.062500 +v 0.343750 -0.250000 -0.062500 +v 0.281250 -0.250000 -0.062500 +v -0.312500 -0.218750 0.062500 +v -0.312500 -0.156250 0.062500 +v -0.312500 -0.218750 -0.062500 +v -0.312500 -0.156250 -0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.437500 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.437500 1.000000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.000000 0.812500 +vt 0.000000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.437500 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.000000 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.000000 1.000000 +vt 0.562500 1.000000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 -0.7071 0.0000 +vn 0.0000 -1.0000 0.0000 +usemtl None +s off +f 2/1/1 1/2/1 9/3/1 10/4/1 +f 6/5/2 16/6/2 14/7/2 2/8/2 +f 6/9/3 2/10/3 10/11/3 11/12/3 +f 5/13/4 6/14/4 11/15/4 12/16/4 +f 1/17/5 5/18/5 12/19/5 9/20/5 +f 5/21/4 15/22/4 16/6/4 6/5/4 +f 15/23/4 7/24/4 8/25/4 16/26/4 +f 3/27/1 13/28/1 14/29/1 4/30/1 +f 13/31/1 1/2/1 2/1/1 14/32/1 +f 13/33/6 15/34/6 5/35/6 1/36/6 +f 3/37/6 7/38/6 15/39/6 13/40/6 +f 14/41/2 16/26/2 8/25/2 4/42/2 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_a.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_a.obj new file mode 100644 index 0000000..6fdd710 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_a.obj @@ -0,0 +1,84 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busconnector_mv_a +v -0.375000 -0.156250 0.062500 +v -0.375000 -0.093750 0.062500 +v -0.812500 -0.156250 0.062500 +v -0.812500 -0.093750 0.062500 +v -0.375000 -0.156250 -0.062500 +v -0.375000 -0.093750 -0.062500 +v -0.812500 -0.156250 -0.062500 +v -0.812500 -0.093750 -0.062500 +v -0.343750 -0.187500 0.062500 +v -0.281250 -0.187500 0.062500 +v -0.281250 -0.187500 -0.062500 +v -0.343750 -0.187500 -0.062500 +v -0.343750 -0.250000 0.062500 +v -0.281250 -0.250000 0.062500 +v -0.281250 -0.250000 -0.062500 +v -0.343750 -0.250000 -0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.000000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.875000 +vt 0.437500 1.000000 +vt 0.000000 1.000000 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.937500 0.812500 +vt 0.937500 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +usemtl None +s off +f 2/1/1 1/2/1 9/3/1 10/4/1 +f 5/5/2 1/6/2 3/7/2 7/8/2 +f 3/9/1 1/10/1 2/11/1 4/12/1 +f 5/13/3 7/14/3 8/15/3 6/16/3 +f 8/15/4 4/17/4 2/18/4 6/16/4 +f 12/19/3 11/20/3 15/21/3 16/22/3 +f 6/23/5 2/24/5 10/25/5 11/26/5 +f 5/13/3 6/16/3 11/27/3 12/28/3 +f 1/29/6 5/30/6 12/31/6 9/32/6 +f 9/33/7 12/34/7 16/35/7 13/36/7 +f 10/4/1 9/3/1 13/37/1 14/38/1 +f 11/39/8 10/40/8 14/41/8 15/42/8 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_b.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_b.obj new file mode 100644 index 0000000..d01b574 --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_b.obj @@ -0,0 +1,84 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busconnector_mv_b +v -0.062500 -0.156250 0.062500 +v -0.062500 -0.093750 0.062500 +v -0.812500 -0.156250 0.062500 +v -0.812500 -0.093750 0.062500 +v -0.062500 -0.156250 -0.062500 +v -0.062500 -0.093750 -0.062500 +v -0.812500 -0.156250 -0.062500 +v -0.812500 -0.093750 -0.062500 +v -0.031250 -0.187500 0.062500 +v 0.031250 -0.187500 0.062500 +v 0.031250 -0.187500 -0.062500 +v -0.031250 -0.187500 -0.062500 +v -0.031250 -0.250000 0.062500 +v 0.031250 -0.250000 0.062500 +v 0.031250 -0.250000 -0.062500 +v -0.031250 -0.250000 -0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.750000 0.875000 +vt 0.750000 1.000000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.750000 0.812500 +vt 0.750000 0.875000 +vt 0.000000 0.875000 +vt 0.750000 1.000000 +vt 0.000000 1.000000 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.937500 0.812500 +vt 0.937500 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +usemtl None +s off +f 2/1/1 1/2/1 9/3/1 10/4/1 +f 5/5/2 1/6/2 3/7/2 7/8/2 +f 3/9/1 1/10/1 2/11/1 4/12/1 +f 5/13/3 7/14/3 8/15/3 6/16/3 +f 8/15/4 4/17/4 2/18/4 6/16/4 +f 12/19/3 11/20/3 15/21/3 16/22/3 +f 6/23/5 2/24/5 10/25/5 11/26/5 +f 5/13/3 6/16/3 11/27/3 12/28/3 +f 1/29/6 5/30/6 12/31/6 9/32/6 +f 9/33/7 12/34/7 16/35/7 13/36/7 +f 10/4/1 9/3/1 13/37/1 14/38/1 +f 11/39/8 10/40/8 14/41/8 15/42/8 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_c.obj b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_c.obj new file mode 100644 index 0000000..b3714af --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busconnector_mv_c.obj @@ -0,0 +1,106 @@ +# Blender v2.79 (sub 0) OBJ File: 'busbar.blend' +# www.blender.org +mtllib busmaterial.mtl +o busconnector_mv_c +v 0.250000 -0.156250 0.062500 +v 0.250000 -0.093750 0.062500 +v -0.812500 -0.156250 0.062500 +v -0.812500 -0.093750 0.062500 +v 0.250000 -0.156250 -0.062500 +v 0.250000 -0.093750 -0.062500 +v -0.812500 -0.156250 -0.062500 +v -0.812500 -0.093750 -0.062500 +v 0.281250 -0.187500 0.062500 +v 0.343750 -0.187500 0.062500 +v 0.343750 -0.187500 -0.062500 +v 0.281250 -0.187500 -0.062500 +v 0.281250 -0.250000 0.062500 +v 0.343750 -0.250000 0.062500 +v 0.343750 -0.250000 -0.062500 +v 0.281250 -0.250000 -0.062500 +v -0.312500 -0.156250 0.062500 +v -0.312500 -0.093750 0.062500 +v -0.312500 -0.156250 -0.062500 +v -0.312500 -0.093750 -0.062500 +vt 1.000000 0.875000 +vt 1.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.437500 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.437500 1.000000 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.875000 +vt 0.000000 0.812500 +vt 0.000000 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.875000 +vt 0.937500 0.812500 +vt 0.937500 0.875000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.437500 0.812500 +vt 1.000000 0.812500 +vt 0.000000 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.562500 0.812500 +vt 0.562500 0.875000 +vt 0.000000 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.562500 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.875000 +vt 0.000000 1.000000 +vt 0.562500 1.000000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7071 -0.7071 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +usemtl None +s off +f 2/1/1 1/2/1 9/3/1 10/4/1 +f 6/5/2 20/6/2 18/7/2 2/8/2 +f 12/9/3 11/10/3 15/11/3 16/12/3 +f 6/13/4 2/14/4 10/15/4 11/16/4 +f 5/17/3 6/18/3 11/19/3 12/20/3 +f 1/21/5 5/22/5 12/23/5 9/24/5 +f 9/25/6 12/26/6 16/27/6 13/28/6 +f 10/4/1 9/3/1 13/29/1 14/30/1 +f 11/31/7 10/32/7 14/33/7 15/34/7 +f 5/35/3 19/36/3 20/6/3 6/5/3 +f 19/37/3 7/38/3 8/39/3 20/40/3 +f 3/41/1 17/42/1 18/43/1 4/44/1 +f 17/45/1 1/2/1 2/1/1 18/46/1 +f 17/47/8 19/48/8 5/49/8 1/50/8 +f 3/51/8 7/52/8 19/53/8 17/54/8 +f 18/55/2 20/40/2 8/39/2 4/56/2 diff --git a/src/main/resources/assets/overengineered/models/block/busbar/obj/busmaterial.mtl b/src/main/resources/assets/overengineered/models/block/busbar/obj/busmaterial.mtl new file mode 100644 index 0000000..ae6136b --- /dev/null +++ b/src/main/resources/assets/overengineered/models/block/busbar/obj/busmaterial.mtl @@ -0,0 +1,2 @@ +newmtl None +map_Kd #texture diff --git a/src/main/resources/assets/overengineered/textures/block/obj/busbar.png b/src/main/resources/assets/overengineered/textures/block/obj/busbar.png new file mode 100644 index 0000000..a560112 Binary files /dev/null and b/src/main/resources/assets/overengineered/textures/block/obj/busbar.png differ