From 511b222ad0bf0586182698d022ebff2e36ebff59 Mon Sep 17 00:00:00 2001
From: Integer Limit <103940576+IntegerLimit@users.noreply.github.com>
Date: Thu, 7 Mar 2024 16:23:18 +1100
Subject: [PATCH] ArchitectureCraft Integration
---
dependencies.gradle | 7 +
gradle.properties | 7 +-
.../java/com/nomiceu/nomilabs/LabsValues.java | 1 +
.../java/com/nomiceu/nomilabs/NomiLabs.java | 3 +-
.../nomiceu/nomilabs/config/LabsConfig.java | 6 +
.../nomiceu/nomilabs/core/LabsLateMixin.java | 5 +-
.../nomiceu/nomilabs/event/CommonProxy.java | 5 +
.../architecturecraft/LabsShapes.java | 37 +++
.../architecturecraft/GuiSawbenchMixin.java | 37 +++
.../architecturecraft/RenderRoofMixin.java | 305 ++++++++++++++++++
.../architecturecraft/ShapeAccessor.java | 19 ++
.../architecturecraft/TileSawbenchMixin.java | 122 +++++++
.../textures/gui/labs_shapemenu_items.png | Bin 0 -> 141357 bytes
.../resources/assets/nomilabs/lang/en_us.lang | 3 +-
.../mixins.nomilabs.architecturecraft.json | 16 +
15 files changed, 569 insertions(+), 4 deletions(-)
create mode 100644 src/main/java/com/nomiceu/nomilabs/integration/architecturecraft/LabsShapes.java
create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/GuiSawbenchMixin.java
create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/RenderRoofMixin.java
create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/ShapeAccessor.java
create mode 100644 src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/TileSawbenchMixin.java
create mode 100644 src/main/resources/assets/architecturecraft/textures/gui/labs_shapemenu_items.png
create mode 100644 src/main/resources/mixins.nomilabs.architecturecraft.json
diff --git a/dependencies.gradle b/dependencies.gradle
index 6dfee4a3..adc4f192 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -113,6 +113,9 @@ dependencies {
compileOnly rfg.deobf("curse.maven:libvulpes-236541:2949886") // Version 0.4.2-75 (Newer Versions Crash with Gas Charge Pad)
compileOnly rfg.deobf("curse.maven:advanced-rocketry-236542:3015079") // Version 1.7.0-232 (Newer Versions need Newer Lib Vulpes)
+ // Architecture Craft (from CurseForge)
+ compileOnly rfg.deobf("curse.maven:architecture-craft-277631:2750633") // Version 3.98
+
/* -------------------------------- Soft Deps, Multiple Runtime Declaration -------------------------------- */
if (project.enable_draconic.toBoolean() || project.enable_thermal.toBoolean()) {
runtimeOnly "curse.maven:redstone-flux-270789:2920436" // Version 2.1.1.1
@@ -174,6 +177,10 @@ dependencies {
runtimeOnly "curse.maven:advanced-rocketry-236542:3015079" // Version 1.7.0-232 (Newer Versions need Newer Lib Vulpes)
}
+ if (project.enable_architecture_craft.toBoolean()) {
+ runtimeOnly "curse.maven:architecture-craft-277631:2750633" // Version 3.98
+ }
+
if (project.enable_ender_storage.toBoolean()) {
// Ender Storage, runtime only, integrated in remappers (from CurseForge)
runtimeOnly "curse.maven:ender-storage-245174:2755787" // Version 2.4.6.137
diff --git a/gradle.properties b/gradle.properties
index b1b7bbdb..a4c75a5d 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -148,7 +148,8 @@ curseForgeRelations = requiredDependency:codechicken-lib-1-8;\
optionalDependency:cofh-world;\
optionalDependency:cofh-core;\
optionalDependency:libvulpes;\
- optionalDependency:advanced-rocketry;
+ optionalDependency:advanced-rocketry;\
+ optionalDependency:architecturecraft-tridev;
# This project's release type on CurseForge and/or Modrinth
# Alternatively this can be set with the 'RELEASE_TYPE' environment variable.
@@ -240,6 +241,10 @@ enable_xu2 = false
# If this is set to false, the mixin will not apply.
enable_rocketry = false
+# Whether to enable Architecture Craft in runtime. Enables the mixin which adds more Architecture Craft Slopes.
+# If this is set to false, the mixin will not apply.
+enable_architecture_craft = false
+
# Whether to enable Ender Storage in runtime. Enables remappers to remap items in ender storage.
# If this is set to false, the remappers will not apply there.
enable_ender_storage = true
diff --git a/src/main/java/com/nomiceu/nomilabs/LabsValues.java b/src/main/java/com/nomiceu/nomilabs/LabsValues.java
index b2222baf..c16acaf8 100644
--- a/src/main/java/com/nomiceu/nomilabs/LabsValues.java
+++ b/src/main/java/com/nomiceu/nomilabs/LabsValues.java
@@ -30,4 +30,5 @@ public class LabsValues {
public static final String ENDER_IO_MODID = "enderio";
public static final String JEI_MODID = "jei";
public static final String ROCKETRY_MODID = "advancedrocketry";
+ public static final String ARCHITECTURE_MODID = "architecturecraft";
}
diff --git a/src/main/java/com/nomiceu/nomilabs/NomiLabs.java b/src/main/java/com/nomiceu/nomilabs/NomiLabs.java
index eea07200..69904a8e 100644
--- a/src/main/java/com/nomiceu/nomilabs/NomiLabs.java
+++ b/src/main/java/com/nomiceu/nomilabs/NomiLabs.java
@@ -26,7 +26,8 @@
+ "after:advancedrocketry;"
+ "after:libvulpes;"
+ "after:crafttweaker@[4.1.20,);"
- + "after:appliedenergistics2;")
+ + "after:appliedenergistics2;"
+ + "after:architecturecraft;")
@SuppressWarnings("unused")
public class NomiLabs {
public static final Logger LOGGER = LogManager.getLogger(LabsValues.LABS_MODID);
diff --git a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java
index dfc200a6..281aa64f 100644
--- a/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java
+++ b/src/main/java/com/nomiceu/nomilabs/config/LabsConfig.java
@@ -196,6 +196,12 @@ public static class ModIntegration {
@Config.RequiresMcRestart
public boolean enableAdvancedRocketryIntegration = true;
+ @Config.Comment({"Whether to enable ArchitectureCraft Integration, which adds new slope variants.",
+ "[default: true]"})
+ @Config.LangKey("config.nomilabs.mod_integration.architecture_craft")
+ @Config.RequiresMcRestart
+ public boolean enableArchitectureCraftIntegration = true;
+
public static class DraconicEvolutionIntegration {
@Config.Comment({"Whether to enable Draconic Evolution Integration, which adds many features, such as:",
"Allowing GregTech Draconium and Awakened Draconium in the reactor and energy core.",
diff --git a/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java b/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java
index d27bfa9d..deb1d035 100644
--- a/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java
+++ b/src/main/java/com/nomiceu/nomilabs/core/LabsLateMixin.java
@@ -26,7 +26,10 @@ public class LabsLateMixin implements ILateMixinLoader {
new AbstractMap.SimpleImmutableEntry<>(LabsValues.GREGTECH_MODID, true),
new AbstractMap.SimpleImmutableEntry<>(LabsValues.JEI_MODID, true),
new AbstractMap.SimpleImmutableEntry<>(LabsValues.ROCKETRY_MODID,
- LabsConfig.modIntegration.enableAdvancedRocketryIntegration))
+ LabsConfig.modIntegration.enableAdvancedRocketryIntegration),
+ new AbstractMap.SimpleImmutableEntry<>(LabsValues.ARCHITECTURE_MODID,
+ LabsConfig.modIntegration.enableArchitectureCraftIntegration)
+ )
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
@Override
diff --git a/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java b/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java
index 0c75fea9..55d597f8 100644
--- a/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java
+++ b/src/main/java/com/nomiceu/nomilabs/event/CommonProxy.java
@@ -16,6 +16,7 @@
import com.nomiceu.nomilabs.gregtech.prefix.LabsOrePrefix;
import com.nomiceu.nomilabs.gregtech.recipe.PerfectGemsCutterRecipes;
import com.nomiceu.nomilabs.groovy.GroovyScriptHandManager;
+import com.nomiceu.nomilabs.integration.architecturecraft.LabsShapes;
import com.nomiceu.nomilabs.integration.top.TOPTooltipManager;
import com.nomiceu.nomilabs.item.ItemExcitationCoil;
import com.nomiceu.nomilabs.item.registry.LabsItems;
@@ -51,6 +52,10 @@
public class CommonProxy {
public static void preInit() {
LabsModeHelper.check();
+
+ if (Loader.isModLoaded(LabsValues.ARCHITECTURE_MODID) &&
+ LabsConfig.modIntegration.enableArchitectureCraftIntegration)
+ LabsShapes.preInit();
LabsCreativeTabs.preInit();
diff --git a/src/main/java/com/nomiceu/nomilabs/integration/architecturecraft/LabsShapes.java b/src/main/java/com/nomiceu/nomilabs/integration/architecturecraft/LabsShapes.java
new file mode 100644
index 00000000..aac599b6
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/integration/architecturecraft/LabsShapes.java
@@ -0,0 +1,37 @@
+package com.nomiceu.nomilabs.integration.architecturecraft;
+
+import com.elytradev.architecture.common.shape.Shape;
+import com.elytradev.architecture.common.shape.ShapeKind;
+import com.elytradev.architecture.common.shape.ShapeSymmetry;
+import com.nomiceu.nomilabs.mixin.architecturecraft.ShapeAccessor;
+import net.minecraftforge.common.util.EnumHelper;
+
+public class LabsShapes {
+ public static final Shape SLOPE_TILE_A1 = addShape("SLOPE_TILE_A1", 94, "Slope A Start", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 1, 0xcf);
+ public static final Shape SLOPE_TILE_A2 = addShape("SLOPE_TILE_A2", 95, "Slope A End", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 3, 0x0f);
+ public static final Shape SLOPE_TILE_B1 = addShape("SLOPE_TILE_B1", 96, "Slope B Start", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 1, 0xff);
+ public static final Shape SLOPE_TILE_B2 = addShape("SLOPE_TILE_B2", 97, "Slope B Middle", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 2, 0xcf);
+ public static final Shape SLOPE_TILE_B3 = addShape("SLOPE_TILE_B3", 98, "Slope B End", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 3, 0x0f);
+ public static final Shape SLOPE_TILE_C1 = addShape("SLOPE_TILE_C1", 99, "Slope C 1", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 1, 0xff);
+ public static final Shape SLOPE_TILE_C2 = addShape("SLOPE_TILE_C2", 100, "Slope C 2", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 2, 0xcf);
+ public static final Shape SLOPE_TILE_C3 = addShape("SLOPE_TILE_C3", 101, "Slope C 3", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 3, 0x0f);
+ public static final Shape SLOPE_TILE_C4 = addShape("SLOPE_TILE_C4", 102, "Slope C 4", ShapeKind.Roof, ShapeSymmetry.BILATERAL, 1, 4, 0x0f);
+
+ /**
+ * Essentially, this loads the class, allowing the above values to be added.
+ *
+ * If for some reason, the values are needed before this, they will still be loaded, and calling init will have no affect on that.
+ */
+ public static void preInit() {
+
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private static Shape addShape(String name, int id, String title, ShapeKind kind, ShapeSymmetry sym, int used, int made, int occ) {
+ var shape = EnumHelper.addEnum(Shape.class, name,
+ new Class>[]{int.class, String.class, ShapeKind.class, ShapeSymmetry.class, int.class, int.class, int.class},
+ id, title, kind, sym, used, made, occ);
+ ShapeAccessor.getIDMap().put(id, shape) ;
+ return shape;
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/GuiSawbenchMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/GuiSawbenchMixin.java
new file mode 100644
index 00000000..c58d0432
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/GuiSawbenchMixin.java
@@ -0,0 +1,37 @@
+package com.nomiceu.nomilabs.mixin.architecturecraft;
+
+import com.elytradev.architecture.client.gui.GuiSawbench;
+import com.elytradev.architecture.legacy.base.BaseGui;
+import net.minecraft.inventory.Container;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+/**
+ * Changes the Gui Shape Item Texture Used.
+ */
+@Mixin(value = GuiSawbench.class, remap = false)
+public class GuiSawbenchMixin extends BaseGui.Screen {
+ @Unique
+ private static final String ORIGINAL_GUI_ITEMS_PATH = "gui/shapemenu_items.png";
+
+ @Unique
+ private static final String NEW_GUI_ITEMS_PATH = "gui/labs_shapemenu_items.png";
+
+ /**
+ * Default Ignored Constructor.
+ */
+ public GuiSawbenchMixin(Container container, int width, int height) {
+ super(container, width, height);
+ }
+
+ @Redirect(method = "drawShapeMenu", at = @At(value = "INVOKE", target = "Lcom/elytradev/architecture/client/gui/GuiSawbench;bindTexture(Ljava/lang/String;II)V"), remap = false)
+ public void bindNewGuiTexture(GuiSawbench instance, String texture, int u, int v) {
+ if (texture.equals(ORIGINAL_GUI_ITEMS_PATH)) {
+ instance.bindTexture(NEW_GUI_ITEMS_PATH, u, v);
+ return;
+ }
+ instance.bindTexture(texture, u, v);
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/RenderRoofMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/RenderRoofMixin.java
new file mode 100644
index 00000000..a424dff5
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/RenderRoofMixin.java
@@ -0,0 +1,305 @@
+package com.nomiceu.nomilabs.mixin.architecturecraft;
+
+import com.elytradev.architecture.client.render.shape.RenderRoof;
+import com.elytradev.architecture.client.render.shape.RenderShape;
+import com.elytradev.architecture.client.render.target.RenderTargetBase;
+import com.elytradev.architecture.client.render.texture.ITexture;
+import com.elytradev.architecture.common.helpers.Trans3;
+import com.elytradev.architecture.common.tile.TileShape;
+import com.nomiceu.nomilabs.integration.architecturecraft.LabsShapes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Mixin(value = RenderRoof.class, remap = false)
+public abstract class RenderRoofMixin extends RenderShape {
+ @Unique
+ private Map ID_TO_RENDER_MAP = null;
+
+ @Shadow
+ protected abstract void bottomQuad();
+
+ @Shadow
+ protected abstract void backQuad();
+
+ @Shadow
+ protected abstract void beginNegZSlope();
+
+ @Shadow
+ protected abstract void beginQuad();
+
+ @Shadow
+ protected abstract void vertex(double x, double y, double z, double u, double v);
+
+ @Shadow
+ protected abstract void endFace();
+
+ @Shadow
+ protected abstract void beginPosXFace();
+
+ @Shadow
+ protected abstract void beginTriangle();
+
+ @Shadow
+ protected abstract void beginNegZFace();
+
+ @Shadow
+ protected abstract void beginPosZFace();
+
+ @Shadow
+ protected abstract void beginNegXFace();
+
+ /**
+ * Default Ignored Constructor
+ */
+ public RenderRoofMixin(TileShape te, ITexture[] textures, Trans3 t, RenderTargetBase target) {
+ super(te, textures, t, target);
+ }
+
+ @Unique
+ private Map getRenderMap() {
+ if (ID_TO_RENDER_MAP != null) return ID_TO_RENDER_MAP;
+
+ ID_TO_RENDER_MAP = new HashMap<>();
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_A1.id, this::renderSlopeA1);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_A2.id, this::renderSlopeA2);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_B1.id, this::renderSlopeB1);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_B2.id, this::renderSlopeB2);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_B3.id, this::renderSlopeB3);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_C1.id, this::renderSlopeC1);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_C2.id, this::renderSlopeC2);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_C3.id, this::renderSlopeC3);
+ ID_TO_RENDER_MAP.put(LabsShapes.SLOPE_TILE_C4.id, this::renderSlopeC4);
+ return ID_TO_RENDER_MAP;
+ }
+
+ @Inject(method = "render", at = @At("HEAD"), cancellable = true)
+ public void renderCustomSlopes(CallbackInfo ci) {
+ var map = getRenderMap();
+ var id = te.getShape().id;
+ if (!map.containsKey(id)) return;
+ map.get(id).run();
+ ci.cancel();
+ }
+
+
+ // -------------------------------------------------------------------------------------
+ @Unique
+ protected void renderSlopeA1() {
+ renderVariableSlope(1.0, 0.5);
+
+ renderVariableFaceLeft(0, 0.5);
+ renderVariableTriangleLeft(0.5, 0.5);
+
+ renderVariableFaceRight(0, 0.5);
+ renderVariableTriangleRight(0.5, 0.5);
+
+ renderVariableFrontFace(0.5);
+
+ bottomQuad();
+ backQuad();
+ }
+
+ @Unique
+ protected void renderSlopeA2() {
+ renderVariableSlope(0.5, 0);
+
+ renderVariableTriangleLeft(0, 0.5);
+
+ renderVariableTriangleRight(0, 0.5);
+
+ bottomQuad();
+ renderVariableBackFace(0.5);
+ }
+
+ @Unique
+ protected void renderSlopeB1() {
+ renderVariableSlope(1.0, 0.66666);
+
+ renderVariableFaceLeft(0, 0.66666);
+ renderVariableTriangleLeft(0.66666, 0.33333);
+
+ renderVariableFaceRight(0, 0.66666);
+ renderVariableTriangleRight(0.66666, 0.33333);
+
+ renderVariableFrontFace(0.66666);
+
+ bottomQuad();
+ backQuad();
+ }
+
+ @Unique
+ protected void renderSlopeB2() {
+ renderVariableSlope(0.66666, 0.33333);
+
+ renderVariableFaceLeft(0, 0.33333);
+ renderVariableTriangleLeft(0.33333, 0.33333);
+
+ renderVariableFaceRight(0, 0.33333);
+ renderVariableTriangleRight(0.33333, 0.33333);
+
+ renderVariableFrontFace(0.33333);
+
+ bottomQuad();
+ renderVariableBackFace(0.66666);
+ }
+
+ @Unique
+ protected void renderSlopeB3() {
+ renderVariableSlope(0.33333, 0);
+
+ renderVariableTriangleLeft(0, 0.33333);
+
+ renderVariableTriangleRight(0, 0.33333);
+
+ bottomQuad();
+ renderVariableBackFace(0.33333);
+ }
+
+ @Unique
+ protected void renderSlopeC1() {
+ renderVariableSlope(1, 0.75);
+
+ renderVariableFaceLeft(0, 0.75);
+ renderVariableTriangleLeft(0.75, 0.25);
+
+ renderVariableFaceRight(0, 0.75);
+ renderVariableTriangleRight(0.75, 0.25);
+
+ renderVariableFrontFace(0.75);
+
+ bottomQuad();
+ backQuad();
+ }
+
+ @Unique
+ protected void renderSlopeC2() {
+ renderVariableSlope(0.75, 0.50);
+
+ renderVariableFaceLeft(0, 0.50);
+ renderVariableTriangleLeft(0.50, 0.25);
+
+ renderVariableFaceRight(0, 0.50);
+ renderVariableTriangleRight(0.50, 0.25);
+
+ renderVariableFrontFace(0.50);
+
+ bottomQuad();
+ renderVariableBackFace(0.75);
+ }
+
+ @Unique
+ protected void renderSlopeC3() {
+ renderVariableSlope(0.50, 0.25);
+
+ renderVariableFaceLeft(0, 0.25);
+ renderVariableTriangleLeft(0.25, 0.25);
+
+ renderVariableFaceRight(0, 0.25);
+ renderVariableTriangleRight(0.25, 0.25);
+
+ renderVariableFrontFace(0.25);
+
+ bottomQuad();
+ renderVariableBackFace(0.50);
+ }
+
+ @Unique
+ protected void renderSlopeC4() {
+ renderVariableSlope(0.25, 0);
+
+ renderVariableTriangleLeft(0, 0.25);
+
+ renderVariableTriangleRight(0, 0.25);
+
+ bottomQuad();
+ renderVariableBackFace(0.25);
+ }
+
+
+ // -------------------------------------------------------------------------------------
+
+ @Unique
+ protected void renderVariableSlope(double start, double end) {
+ beginNegZSlope();
+ // Front slope
+ beginQuad();
+ vertex(1, start, 1, 0, 0);
+ vertex(1, end, 0, 0, 1);
+ vertex(0, end, 0, 1, 1);
+ vertex(0, start, 1, 1, 0);
+ endFace();
+ }
+
+ @Unique
+ protected void renderVariableTriangleLeft(double offset, double height) {
+ beginPosXFace();
+ beginTriangle();
+ vertex(1, offset + height, 1, 0, 0);
+ vertex(1, offset, 1, 0, 1-height);
+ vertex(1, offset, 0, 1, 1-height);
+ endFace();
+ }
+
+ @Unique
+ protected void renderVariableTriangleRight(double offset, double height) {
+ beginNegXFace();
+ beginTriangle();
+ vertex(0, offset + height, 1, 1, 0);
+ vertex(0, offset, 0, 0, 1-height);
+ vertex(0, offset, 1, 1, 1-height);
+ endFace();
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ @Unique
+ protected void renderVariableFaceLeft(double offset, double height) {
+ beginNegXFace();
+ beginQuad();
+ vertex(0, offset+height, 0, 0, 1-height);
+ vertex(0, offset, 0, 0, 1);
+ vertex(0, offset, 1, 1, 1);
+ vertex(0, offset+height, 1, 1, 1-height);
+ endFace();
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ @Unique
+ protected void renderVariableFaceRight(double offset, double height) {
+ beginPosXFace();
+ beginQuad();
+ vertex(1, offset+height, 1, 0, 1-height);
+ vertex(1, offset, 1, 0, 1);
+ vertex(1, offset, 0, 1, 1);
+ vertex(1, offset+height, 0, 1, 1-height);
+ endFace();
+ }
+
+ @Unique
+ protected void renderVariableFrontFace(double height) {
+ beginNegZFace();
+ beginQuad();
+ vertex(1, height, 0, 0, 1-height);
+ vertex(1, 0, 0, 0, 1);
+ vertex(0, 0, 0, 1, 1);
+ vertex(0, height, 0, 1, 1-height);
+ endFace();
+ }
+
+ @Unique
+ protected void renderVariableBackFace(double height) {
+ beginPosZFace();
+ beginQuad();
+ vertex(0, height, 1, 0, 1-height);
+ vertex(0, 0, 1, 0, 1);
+ vertex(1, 0, 1, 1, 1);
+ vertex(1, height, 1, 1, 1-height);
+ endFace();
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/ShapeAccessor.java b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/ShapeAccessor.java
new file mode 100644
index 00000000..43ad4473
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/ShapeAccessor.java
@@ -0,0 +1,19 @@
+package com.nomiceu.nomilabs.mixin.architecturecraft;
+
+import com.elytradev.architecture.common.shape.Shape;
+import org.apache.commons.lang3.NotImplementedException;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import java.util.Map;
+
+/**
+ * Allows accessing the protected static ID Map, which is used by Architecture Craft.
+ */
+@Mixin(value = Shape.class, remap = false)
+public interface ShapeAccessor {
+ @Accessor(value = "idMap")
+ static Map getIDMap() {
+ throw new NotImplementedException("ShapeAccessorMixin Failed to Apply!");
+ }
+}
diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/TileSawbenchMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/TileSawbenchMixin.java
new file mode 100644
index 00000000..6f451a21
--- /dev/null
+++ b/src/main/java/com/nomiceu/nomilabs/mixin/architecturecraft/TileSawbenchMixin.java
@@ -0,0 +1,122 @@
+package com.nomiceu.nomilabs.mixin.architecturecraft;
+
+import com.elytradev.architecture.common.shape.Shape;
+import com.elytradev.architecture.common.tile.TileSawbench;
+import com.nomiceu.nomilabs.integration.architecturecraft.LabsShapes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+
+import com.elytradev.architecture.common.shape.ShapePage;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(value = TileSawbench.class, remap = false)
+public class TileSawbenchMixin {
+ /**
+ * Adds the new Shapes to the pages.
+ */
+ @Inject(method = "", at = @At("TAIL"))
+ private static void changePages(CallbackInfo ci) {
+ TileSawbench.pages = new ShapePage[] {
+ new ShapePage("Roofing",
+ Shape.ROOF_TILE,
+ Shape.ROOF_OUTER_CORNER,
+ Shape.ROOF_INNER_CORNER,
+ Shape.ROOF_RIDGE,
+ Shape.ROOF_SMART_RIDGE,
+ Shape.ROOF_VALLEY,
+ Shape.ROOF_SMART_VALLEY,
+ Shape.ROOF_OVERHANG,
+ Shape.ROOF_OVERHANG_OUTER_CORNER,
+ Shape.ROOF_OVERHANG_INNER_CORNER,
+ Shape.ROOF_OVERHANG_GABLE_LH,
+ Shape.ROOF_OVERHANG_GABLE_RH,
+ Shape.ROOF_OVERHANG_GABLE_END_LH,
+ Shape.ROOF_OVERHANG_GABLE_END_RH,
+ Shape.ROOF_OVERHANG_RIDGE,
+ Shape.ROOF_OVERHANG_VALLEY,
+ Shape.BEVELLED_OUTER_CORNER,
+ Shape.BEVELLED_INNER_CORNER),
+ new ShapePage("Rounded",
+ Shape.CYLINDER,
+ Shape.CYLINDER_HALF,
+ Shape.CYLINDER_QUARTER,
+ Shape.CYLINDER_LARGE_QUARTER,
+ Shape.ANTICYLINDER_LARGE_QUARTER,
+ Shape.PILLAR,
+ Shape.POST,
+ Shape.POLE,
+ Shape.SPHERE_FULL,
+ Shape.SPHERE_HALF,
+ Shape.SPHERE_QUARTER,
+ Shape.SPHERE_EIGHTH,
+ Shape.SPHERE_EIGHTH_LARGE,
+ Shape.SPHERE_EIGHTH_LARGE_REV),
+ new ShapePage("Classical",
+ Shape.PILLAR_BASE,
+ Shape.PILLAR,
+ Shape.DORIC_CAPITAL,
+ Shape.DORIC_TRIGLYPH,
+ Shape.DORIC_TRIGLYPH_CORNER,
+ Shape.DORIC_METOPE,
+ Shape.IONIC_CAPITAL,
+ Shape.CORINTHIAN_CAPITAL,
+ Shape.ARCHITRAVE,
+ Shape.ARCHITRAVE_CORNER,
+ Shape.CORNICE_LH,
+ Shape.CORNICE_RH,
+ Shape.CORNICE_END_LH,
+ Shape.CORNICE_END_RH,
+ Shape.CORNICE_RIDGE,
+ Shape.CORNICE_VALLEY,
+ Shape.CORNICE_BOTTOM),
+ new ShapePage("Window",
+ Shape.WINDOW_FRAME,
+ Shape.WINDOW_CORNER,
+ Shape.WINDOW_MULLION),
+ new ShapePage("Arches",
+ Shape.ARCH_D_1,
+ Shape.ARCH_D_2,
+ Shape.ARCH_D_3_A,
+ Shape.ARCH_D_3_B,
+ Shape.ARCH_D_3_C,
+ Shape.ARCH_D_4_A,
+ Shape.ARCH_D_4_B,
+ Shape.ARCH_D_4_C),
+ new ShapePage("Railings",
+ Shape.BALUSTRADE_PLAIN,
+ Shape.BALUSTRADE_PLAIN_OUTER_CORNER,
+ Shape.BALUSTRADE_PLAIN_INNER_CORNER,
+ Shape.BALUSTRADE_PLAIN_WITH_NEWEL,
+ Shape.BALUSTRADE_PLAIN_END,
+ Shape.BANISTER_PLAIN_TOP,
+ Shape.BANISTER_PLAIN,
+ Shape.BANISTER_PLAIN_BOTTOM,
+ Shape.BANISTER_PLAIN_END,
+ Shape.BANISTER_PLAIN_INNER_CORNER,
+ Shape.BALUSTRADE_FANCY,
+ Shape.BALUSTRADE_FANCY_CORNER,
+ Shape.BALUSTRADE_FANCY_WITH_NEWEL,
+ Shape.BALUSTRADE_FANCY_NEWEL,
+ Shape.BANISTER_FANCY_TOP,
+ Shape.BANISTER_FANCY,
+ Shape.BANISTER_FANCY_BOTTOM,
+ Shape.BANISTER_FANCY_END,
+ Shape.BANISTER_FANCY_NEWEL_TALL),
+ new ShapePage("Other",
+ Shape.CLADDING_SHEET,
+ Shape.SLAB,
+ Shape.STAIRS,
+ Shape.STAIRS_OUTER_CORNER,
+ Shape.STAIRS_INNER_CORNER,
+ LabsShapes.SLOPE_TILE_A1,
+ LabsShapes.SLOPE_TILE_A2,
+ LabsShapes.SLOPE_TILE_B1,
+ LabsShapes.SLOPE_TILE_B2,
+ LabsShapes.SLOPE_TILE_B3,
+ LabsShapes.SLOPE_TILE_C1,
+ LabsShapes.SLOPE_TILE_C2,
+ LabsShapes.SLOPE_TILE_C3,
+ LabsShapes.SLOPE_TILE_C4)};
+ }
+}
diff --git a/src/main/resources/assets/architecturecraft/textures/gui/labs_shapemenu_items.png b/src/main/resources/assets/architecturecraft/textures/gui/labs_shapemenu_items.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0c5ce451f7ae62d65e5f2d524704d566dd244d4
GIT binary patch
literal 141357
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