diff --git a/build.gradle b/build.gradle
index 2e17521865d..05e8103a68d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,7 +17,7 @@
*/
plugins {
- id 'fabric-loom' version '1.0-SNAPSHOT'
+ id 'fabric-loom' version '1.1-SNAPSHOT'
id 'io.github.juuxel.loom-quiltflower' version '1.7.1'
id "com.github.johnrengelman.shadow" version "7.0.0"
}
@@ -59,7 +59,7 @@ dependencies {
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings loom.layered() {
officialMojangMappings()
- parchment("org.parchmentmc.data:parchment-1.18.1:2021.12.19@zip")
+ parchment("org.parchmentmc.data:parchment-1.19.2:2022.11.27@zip")
}
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
@@ -116,9 +116,15 @@ dependencies {
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation("net.fabricmc.fabric-api:fabric-api:${project.fabric_version}")
- include modImplementation("teamreborn:energy:${project.tr_energy_version}") {
- exclude group: "net.fabricmc.fabric-api"
+
+ // Create - dependencies are added transitively
+ modCompileOnly("com.simibubi.create:create-fabric-1.19.2:0.5.0f-776") {
+ exclude group: "net.fabricmc.fabric-api"
+ exclude group: "dev.onyxstudios.cardinal-components-api"
+ exclude group: "dev.cafeteria"
}
+ modLocalRuntime("maven.modrinth:lazydfu:0.1.3")
+ modLocalRuntime("com.terraformersmc:modmenu:4.2.0-beta.2")
internal 'com.google.code.findbugs:jsr305:3.0.2'
@@ -191,6 +197,17 @@ allprojects {
includeGroup "curse.maven"
}
}
+ maven { url = "https://maven.shedaniel.me/" } // Cloth Config, REI
+ maven { url = "https://dvs1.progwml6.com/files/maven/" } // JEI
+ maven { url = "https://maven.parchmentmc.org" } // Parchment mappings
+ maven { url = "https://maven.quiltmc.org/repository/release" } // Quilt Mappings
+ maven { url = "https://api.modrinth.com/maven" } // LazyDFU
+ maven { url = "https://maven.terraformersmc.com/releases/" } // Mod Menu
+ maven { url = "https://mvn.devos.one/snapshots/" } // Create, Porting Lib, Forge Tags, Milk Lib, Registrate
+ maven { url = "https://cursemaven.com" } // Forge Config API Port
+ maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes
+ maven { url = "https://jitpack.io/" } // Mixin Extras, Fabric ASM
+ maven { url = "https://maven.tterrag.com/" } // Flywheel
}
// ensure everything uses UTF-8 and not some random codepage chosen by gradle
@@ -242,9 +259,9 @@ sourceSets {
main {
compileClasspath += sourceSets.portaforgy.output
runtimeClasspath += sourceSets.portaforgy.output
- resources {
- srcDir 'src/generated/resources'
- }
+ resources.srcDirs += 'src/generated/resources'
+ java.srcDirs += 'src/nsmp/java'
+ resources.srcDirs += 'src/nsmp/res'
}
test {
compileClasspath += sourceSets.portaforgy.output
diff --git a/gradle.properties b/gradle.properties
index 7212ee88334..0ec76f27523 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,9 +1,9 @@
version_major=0
version_minor=0
-version_patch=0
+version_patch=1
artifact_group=appeng
-artifact_basename=appliedenergistics2-fabric
+artifact_basename=nsmp-ae2
#########################################################
# Minecraft Versions #
@@ -22,7 +22,6 @@ fabric_version=0.66.0+1.19.2
rei_version=9.1.530
wthit_version=5.9.0
jade_file_id=3903505
-tr_energy_version=2.0.0-beta1
no_indium_version=1.1.0+1.19
# Set to rei or jei to pick which tooltip mod gets picked at runtime
@@ -31,7 +30,7 @@ runtime_itemlist_mod=rei
# Set to wthit or jade to pick which tooltip mod gets picked at runtime
# for the dev environment.
-runtime_tooltip_mod=jade
+runtime_tooltip_mod=wthit
#########################################################
# Third party dependencies
@@ -39,11 +38,6 @@ runtime_tooltip_mod=jade
snakeyaml_version=1.33
directory_watcher_version=0.17.1
-#########################################################
-# Deployment #
-#########################################################
-curseforge_project=223794
-
#########################################################
# Gradle #
#########################################################
diff --git a/src/main/java/appeng/api/behaviors/package-info.java b/src/main/java/appeng/api/behaviors/package-info.java
index 21c63c33f3f..73f2e8afd41 100644
--- a/src/main/java/appeng/api/behaviors/package-info.java
+++ b/src/main/java/appeng/api/behaviors/package-info.java
@@ -1,14 +1,6 @@
/**
* Classes to allow addons to define behavior of AE2's own devices when they have to interact with custom key types.
*
- *
Part implementations
- *
- * - Import bus: {@link appeng.api.behaviors.StackImportStrategy}.
- * - Export bus: {@link appeng.api.behaviors.StackExportStrategy}.
- * - Formation plane: {@link appeng.api.behaviors.PlacementStrategy}.
- * - Annihilation plane: {@link appeng.api.behaviors.PickupStrategy}.
- *
- *
* Working with inventories
*
* - Building {@link appeng.api.storage.MEStorage}s from other kinds of inventories, used by the storage bus and the
diff --git a/src/main/java/appeng/api/ids/AEBlockIds.java b/src/main/java/appeng/api/ids/AEBlockIds.java
index f03bb9ede17..2faa30d1c48 100644
--- a/src/main/java/appeng/api/ids/AEBlockIds.java
+++ b/src/main/java/appeng/api/ids/AEBlockIds.java
@@ -34,7 +34,7 @@ public final class AEBlockIds {
public static final ResourceLocation SECURITY_STATION = id("security_station");
public static final ResourceLocation CABLE_BUS = id("cable_bus");
- private static ResourceLocation id(String id) {
+ public static ResourceLocation id(String id) {
return new ResourceLocation(AEConstants.MOD_ID, id);
}
}
diff --git a/src/main/java/appeng/api/ids/AEItemIds.java b/src/main/java/appeng/api/ids/AEItemIds.java
index 5596795a822..c3445e5e47e 100644
--- a/src/main/java/appeng/api/ids/AEItemIds.java
+++ b/src/main/java/appeng/api/ids/AEItemIds.java
@@ -38,7 +38,7 @@ public final class AEItemIds {
public static final ResourceLocation CAPACITY_CARD = id("capacity_card");
public static final ResourceLocation FUZZY_CARD = id("fuzzy_card");
- private static ResourceLocation id(String id) {
+ public static ResourceLocation id(String id) {
return new ResourceLocation(AEConstants.MOD_ID, id);
}
}
diff --git a/src/main/java/appeng/api/parts/IPart.java b/src/main/java/appeng/api/parts/IPart.java
index 6d4bbfdeaab..2ce3ffb0e07 100644
--- a/src/main/java/appeng/api/parts/IPart.java
+++ b/src/main/java/appeng/api/parts/IPart.java
@@ -433,12 +433,4 @@ default Object getRenderAttachmentData() {
*/
default void addEntityCrashInfo(CrashReportCategory section) {
}
-
- /**
- * This method may be implemented by a part to request a specific type of cable connection for rendering. Mechanics
- * are not affected by this in any way.
- */
- default AECableType getDesiredConnectionType() {
- return AECableType.GLASS;
- }
}
diff --git a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java
index d536f9f4952..840f069c94d 100644
--- a/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java
+++ b/src/main/java/appeng/client/gui/widgets/SettingToggleButton.java
@@ -39,8 +39,6 @@
import appeng.api.config.FullnessMode;
import appeng.api.config.FuzzyMode;
import appeng.api.config.LockCraftingMode;
-import appeng.api.config.OperationMode;
-import appeng.api.config.RelativeDirection;
import appeng.api.config.SchedulingMode;
import appeng.api.config.Setting;
import appeng.api.config.Settings;
diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModel.java b/src/main/java/appeng/client/render/cablebus/CableBusModel.java
index 5cff10b56dc..9af65ee7980 100644
--- a/src/main/java/appeng/client/render/cablebus/CableBusModel.java
+++ b/src/main/java/appeng/client/render/cablebus/CableBusModel.java
@@ -49,13 +49,10 @@
@Environment(EnvType.CLIENT)
public class CableBusModel implements BasicUnbakedModel {
- public static final ResourceLocation TRANSLUCENT_FACADE_MODEL = AppEng.makeId("part/translucent_facade");
-
@Override
public Collection getDependencies() {
PartModelsInternal.freeze();
var models = new ArrayList<>(PartModelsInternal.getModels());
- models.add(TRANSLUCENT_FACADE_MODEL);
return models;
}
@@ -72,8 +69,6 @@ public BakedModel bake(ModelBakery bakery, Function> getBlocks() {
return Collections.unmodifiableList(BLOCKS);
}
- private static BlockDefinition block(String englishName, ResourceLocation id,
+ public static BlockDefinition block(String englishName, ResourceLocation id,
Supplier blockSupplier) {
return block(englishName, id, blockSupplier, null);
}
- private static BlockDefinition block(
+ public static BlockDefinition block(
String englishName,
ResourceLocation id,
Supplier blockSupplier,
diff --git a/src/main/java/appeng/core/definitions/AEItems.java b/src/main/java/appeng/core/definitions/AEItems.java
index 7aabfc88030..e3e6fb2e96c 100644
--- a/src/main/java/appeng/core/definitions/AEItems.java
+++ b/src/main/java/appeng/core/definitions/AEItems.java
@@ -25,6 +25,8 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyItem;
+
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.CreativeModeTab;
@@ -61,7 +63,7 @@ public final class AEItems {
public static final ItemDefinition
- INVERTER_CARD = item("Inverter Card", AEItemIds.INVERTER_CARD, Upgrades::createUpgradeCardItem);
public static final ItemDefinition
- CAPACITY_CARD = item("Capacity Card", AEItemIds.CAPACITY_CARD, Upgrades::createUpgradeCardItem);
public static final ItemDefinition
- FUZZY_CARD = item("Fuzzy Card", AEItemIds.FUZZY_CARD, Upgrades::createUpgradeCardItem);
-
+
// spotless:on
public static List> getItems() {
@@ -85,12 +87,12 @@ private static ColoredItemDefinition createColoredItems(Stri
return colors;
}
- static ItemDefinition item(String name, ResourceLocation id,
+ public static ItemDefinition item(String name, ResourceLocation id,
Function factory) {
return item(name, id, factory, CreativeTab.INSTANCE);
}
- static ItemDefinition item(String name, ResourceLocation id,
+ public static ItemDefinition item(String name, ResourceLocation id,
Function factory,
CreativeModeTab group) {
diff --git a/src/main/java/appeng/datagen/AE2DataGenerators.java b/src/main/java/appeng/datagen/AE2DataGenerators.java
index 3dcb47207d2..48d8da1b184 100644
--- a/src/main/java/appeng/datagen/AE2DataGenerators.java
+++ b/src/main/java/appeng/datagen/AE2DataGenerators.java
@@ -26,6 +26,7 @@
import appeng.datagen.providers.models.CableModelProvider;
import appeng.datagen.providers.models.ItemModelProvider;
import appeng.datagen.providers.models.PartModelProvider;
+import appeng.datagen.providers.recipes.CraftingRecipes;
import appeng.datagen.providers.tags.BlockTagsProvider;
import appeng.datagen.providers.tags.ItemTagsProvider;
@@ -45,6 +46,9 @@ public static void onGatherData(DataGenerator generator, ExistingFileHelper exis
generator.addProvider(true, new CableModelProvider(generator, existingFileHelper));
generator.addProvider(true, new PartModelProvider(generator, existingFileHelper));
+ // Recipes
+ generator.addProvider(true, new CraftingRecipes(generator));
+
// Must run last
generator.addProvider(true, localization);
}
diff --git a/src/main/java/appeng/datagen/providers/recipes/AE2RecipeProvider.java b/src/main/java/appeng/datagen/providers/recipes/AE2RecipeProvider.java
index d21f8573146..4c55b1ed2e4 100644
--- a/src/main/java/appeng/datagen/providers/recipes/AE2RecipeProvider.java
+++ b/src/main/java/appeng/datagen/providers/recipes/AE2RecipeProvider.java
@@ -16,52 +16,53 @@
* along with Applied Energistics 2. If not, see .
*/
-package appeng.datagen.providers.recipes;
+ package appeng.datagen.providers.recipes;
-import java.nio.file.Path;
-import java.util.Set;
-import java.util.function.Consumer;
-
-import com.google.common.collect.Sets;
-import com.google.gson.JsonObject;
-
-import net.minecraft.data.CachedOutput;
-import net.minecraft.data.DataGenerator;
-import net.minecraft.data.recipes.FinishedRecipe;
-import net.minecraft.resources.ResourceLocation;
-
-import appeng.datagen.providers.IAE2DataProvider;
-
-public abstract class AE2RecipeProvider extends net.minecraft.data.recipes.RecipeProvider implements IAE2DataProvider {
-
- private final Path outputFolder;
-
- public AE2RecipeProvider(DataGenerator generator) {
- super(generator);
- this.outputFolder = generator.getOutputFolder();
- }
-
- public void run(CachedOutput cache) {
- Path path = outputFolder;
- Set set = Sets.newHashSet();
- buildAE2CraftingRecipes((finishedRecipe) -> {
- if (!set.add(finishedRecipe.getId())) {
- throw new IllegalStateException("Duplicate recipe " + finishedRecipe.getId());
- } else {
- JsonObject json = finishedRecipe.serializeRecipe();
- String modId = finishedRecipe.getId().getNamespace();
- saveRecipe(cache, json,
- path.resolve("data/" + modId + "/recipes/" + finishedRecipe.getId().getPath() + ".json"));
- JsonObject jsonObject = finishedRecipe.serializeAdvancement();
- if (jsonObject != null) {
- modId = finishedRecipe.getId().getNamespace();
- saveAdvancement(cache, jsonObject, path.resolve("data/" + modId + "/advancements/"
- + finishedRecipe.getAdvancementId().getPath() + ".json"));
- }
-
- }
- });
- }
-
- protected abstract void buildAE2CraftingRecipes(Consumer consumer);
-}
+ import java.nio.file.Path;
+ import java.util.Set;
+ import java.util.function.Consumer;
+
+ import com.google.common.collect.Sets;
+ import com.google.gson.JsonObject;
+
+ import net.minecraft.data.CachedOutput;
+ import net.minecraft.data.DataGenerator;
+ import net.minecraft.data.recipes.FinishedRecipe;
+ import net.minecraft.resources.ResourceLocation;
+
+ import appeng.datagen.providers.IAE2DataProvider;
+
+ public abstract class AE2RecipeProvider extends net.minecraft.data.recipes.RecipeProvider implements IAE2DataProvider {
+
+ private final Path outputFolder;
+
+ public AE2RecipeProvider(DataGenerator generator) {
+ super(generator);
+ this.outputFolder = generator.getOutputFolder();
+ }
+
+ public void run(CachedOutput cache) {
+ Path path = outputFolder;
+ Set set = Sets.newHashSet();
+ buildAE2CraftingRecipes((finishedRecipe) -> {
+ if (!set.add(finishedRecipe.getId())) {
+ throw new IllegalStateException("Duplicate recipe " + finishedRecipe.getId());
+ } else {
+ JsonObject json = finishedRecipe.serializeRecipe();
+ String modId = finishedRecipe.getId().getNamespace();
+ saveRecipe(cache, json,
+ path.resolve("data/" + modId + "/recipes/" + finishedRecipe.getId().getPath() + ".json"));
+ JsonObject jsonObject = finishedRecipe.serializeAdvancement();
+ if (jsonObject != null) {
+ modId = finishedRecipe.getId().getNamespace();
+ saveAdvancement(cache, jsonObject, path.resolve("data/" + modId + "/advancements/"
+ + finishedRecipe.getAdvancementId().getPath() + ".json"));
+ }
+
+ }
+ });
+ }
+
+ protected abstract void buildAE2CraftingRecipes(Consumer consumer);
+ }
+
\ No newline at end of file
diff --git a/src/main/java/appeng/datagen/providers/recipes/CraftingRecipes.java b/src/main/java/appeng/datagen/providers/recipes/CraftingRecipes.java
new file mode 100644
index 00000000000..d303cafa8cb
--- /dev/null
+++ b/src/main/java/appeng/datagen/providers/recipes/CraftingRecipes.java
@@ -0,0 +1,46 @@
+
+package appeng.datagen.providers.recipes;
+
+import java.util.function.Consumer;
+
+import net.minecraft.data.DataGenerator;
+import net.minecraft.data.recipes.FinishedRecipe;
+import net.minecraft.data.recipes.ShapedRecipeBuilder;
+import net.minecraft.data.recipes.ShapelessRecipeBuilder;
+import appeng.api.util.AEColor;
+import appeng.core.AppEng;
+import appeng.core.definitions.AEParts;
+import appeng.datagen.providers.tags.ConventionTags;
+
+public class CraftingRecipes extends AE2RecipeProvider {
+ public CraftingRecipes(DataGenerator generator) {
+ super(generator);
+ }
+
+ @Override
+ protected void buildAE2CraftingRecipes(Consumer consumer) {
+ addCables(consumer);
+ }
+
+ // ====================================================
+ // recipes/network/cables
+ // ====================================================
+ private static void addCables(Consumer consumer) {
+ for (var color : AEColor.VALID_COLORS) {
+ ShapedRecipeBuilder.shaped(AEParts.GLASS_CABLE.item(color), 8)
+ .pattern("aaa")
+ .pattern("aba")
+ .pattern("aaa")
+ .define('a', AEParts.GLASS_CABLE.item(AEColor.TRANSPARENT))
+ .define('b', ConventionTags.dye(color.dye))
+ .unlockedBy("has_dyes/black", has(ConventionTags.dye(color.dye)))
+ .unlockedBy("has_fluix_glass_cable", has(AEParts.GLASS_CABLE.item(AEColor.TRANSPARENT)))
+ .save(consumer, AppEng.makeId("network/cables/glass_" + color.registryPrefix));
+ }
+ ShapelessRecipeBuilder.shapeless(AEParts.GLASS_CABLE.item(AEColor.TRANSPARENT))
+ .requires(ConventionTags.GLASS_CABLE)
+ .requires(ConventionTags.CAN_REMOVE_COLOR)
+ .unlockedBy("has_glass_cable", has(ConventionTags.GLASS_CABLE))
+ .save(consumer, AppEng.makeId("network/cables/glass_fluix_clean"));
+ }
+}
diff --git a/src/main/java/appeng/datagen/providers/recipes/RecipeCriteria.java b/src/main/java/appeng/datagen/providers/recipes/RecipeCriteria.java
deleted file mode 100644
index 9fbecf7c797..00000000000
--- a/src/main/java/appeng/datagen/providers/recipes/RecipeCriteria.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * This file is part of Applied Energistics 2.
- * Copyright (c) 2021, TeamAppliedEnergistics, All rights reserved.
- *
- * Applied Energistics 2 is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Applied Energistics 2 is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Applied Energistics 2. If not, see .
- */
-
-package appeng.datagen.providers.recipes;
-
-import appeng.core.definitions.BlockDefinition;
-import appeng.core.definitions.ItemDefinition;
-
-final class RecipeCriteria {
-
- private RecipeCriteria() {
- }
-
- public static String criterionName(BlockDefinition> block) {
- return String.format("has_%s", block.id().getPath());
- }
-
- public static String criterionName(ItemDefinition> item) {
- return String.format("has_%s", item.id().getPath());
- }
-
-}
diff --git a/src/main/java/appeng/datagen/providers/tags/ConventionTags.java b/src/main/java/appeng/datagen/providers/tags/ConventionTags.java
index 71ca144b2cb..658a4d273bc 100644
--- a/src/main/java/appeng/datagen/providers/tags/ConventionTags.java
+++ b/src/main/java/appeng/datagen/providers/tags/ConventionTags.java
@@ -18,9 +18,15 @@
package appeng.datagen.providers.tags;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
+import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.Item;
/**
@@ -39,6 +45,16 @@ private ConventionTags() {
public static final TagKey
- GLASS_CABLE = tag("ae2:glass_cable");
public static final TagKey
- WRENCH = tag("c:wrenches");
+ public static final TagKey
- CAN_REMOVE_COLOR = tag("ae2:can_remove_color");
+ public static final Map> DYES = Arrays.stream(DyeColor.values())
+ .collect(Collectors.toMap(
+ Function.identity(),
+ dye -> tag("c:" + dye.getSerializedName() + "_dye")));
+
+ public static final TagKey
- dye(DyeColor color) {
+ return DYES.get(color);
+ }
+
private static TagKey
- tag(String name) {
return TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(name));
}
diff --git a/src/main/java/appeng/datagen/providers/tags/ItemTagsProvider.java b/src/main/java/appeng/datagen/providers/tags/ItemTagsProvider.java
index b6cbf78ad7c..e329a3b1121 100644
--- a/src/main/java/appeng/datagen/providers/tags/ItemTagsProvider.java
+++ b/src/main/java/appeng/datagen/providers/tags/ItemTagsProvider.java
@@ -20,7 +20,8 @@
import net.minecraft.data.DataGenerator;
import net.minecraft.data.tags.BlockTagsProvider;
-
+import net.minecraft.world.item.DyeColor;
+import net.minecraft.world.item.Items;
import appeng.api.util.AEColor;
import appeng.core.definitions.AEParts;
import appeng.datagen.providers.IAE2DataProvider;
@@ -36,5 +37,24 @@ protected void addTags() {
for (AEColor color : AEColor.values()) {
tag(ConventionTags.GLASS_CABLE).add(AEParts.GLASS_CABLE.item(color));
}
+
+ tag(ConventionTags.dye(DyeColor.WHITE)).add(Items.WHITE_DYE);
+ tag(ConventionTags.dye(DyeColor.ORANGE)).add(Items.ORANGE_DYE);
+ tag(ConventionTags.dye(DyeColor.MAGENTA)).add(Items.MAGENTA_DYE);
+ tag(ConventionTags.dye(DyeColor.LIGHT_BLUE)).add(Items.LIGHT_BLUE_DYE);
+ tag(ConventionTags.dye(DyeColor.YELLOW)).add(Items.YELLOW_DYE);
+ tag(ConventionTags.dye(DyeColor.LIME)).add(Items.LIME_DYE);
+ tag(ConventionTags.dye(DyeColor.PINK)).add(Items.PINK_DYE);
+ tag(ConventionTags.dye(DyeColor.GRAY)).add(Items.GRAY_DYE);
+ tag(ConventionTags.dye(DyeColor.LIGHT_GRAY)).add(Items.LIGHT_GRAY_DYE);
+ tag(ConventionTags.dye(DyeColor.CYAN)).add(Items.CYAN_DYE);
+ tag(ConventionTags.dye(DyeColor.PURPLE)).add(Items.PURPLE_DYE);
+ tag(ConventionTags.dye(DyeColor.BLUE)).add(Items.BLUE_DYE);
+ tag(ConventionTags.dye(DyeColor.BROWN)).add(Items.BROWN_DYE);
+ tag(ConventionTags.dye(DyeColor.GREEN)).add(Items.GREEN_DYE);
+ tag(ConventionTags.dye(DyeColor.RED)).add(Items.RED_DYE);
+ tag(ConventionTags.dye(DyeColor.BLACK)).add(Items.BLACK_DYE);
+
+ tag(ConventionTags.CAN_REMOVE_COLOR).add(Items.WATER_BUCKET, Items.SNOWBALL);
}
}
diff --git a/src/main/java/appeng/helpers/LocationRotation.java b/src/main/java/appeng/helpers/LocationRotation.java
deleted file mode 100644
index a0d7760f014..00000000000
--- a/src/main/java/appeng/helpers/LocationRotation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * This file is part of Applied Energistics 2.
- * Copyright (c) 2013 - 2015, AlgorithmX2, All rights reserved.
- *
- * Applied Energistics 2 is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Applied Energistics 2 is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Applied Energistics 2. If not, see .
- */
-
-package appeng.helpers;
-
-import net.minecraft.core.Direction;
-import net.minecraft.world.level.BlockGetter;
-
-import appeng.api.util.IOrientable;
-
-public class LocationRotation implements IOrientable {
-
- private final BlockGetter level;
- private final int x;
- private final int y;
- private final int z;
-
- public LocationRotation(BlockGetter level, int x, int y, int z) {
- this.level = level;
- this.x = x;
- this.y = y;
- this.z = z;
- }
-
- @Override
- public boolean canBeRotated() {
- return false;
- }
-
- @Override
- public Direction getForward() {
- if (this.getUp().getStepY() == 0) {
- return Direction.UP;
- }
- return Direction.SOUTH;
- }
-
- @Override
- public Direction getUp() {
- final int num = Math.abs(this.x + this.y + this.z) % 6;
- return Direction.values()[num];
- }
-
- @Override
- public void setOrientation(Direction forward, Direction up) {
-
- }
-}
diff --git a/src/main/java/appeng/hooks/ItemRendererHooks.java b/src/main/java/appeng/hooks/ItemRendererHooks.java
index 9202ade2c1b..7eb5ec63b07 100644
--- a/src/main/java/appeng/hooks/ItemRendererHooks.java
+++ b/src/main/java/appeng/hooks/ItemRendererHooks.java
@@ -22,7 +22,6 @@
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.renderer.entity.ItemRenderer;
-import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.item.ItemStack;
import appeng.api.client.AEStackRendering;
@@ -32,9 +31,6 @@
public final class ItemRendererHooks {
- // Prevents recursion in the hook below
- private static final ThreadLocal OVERRIDING_FOR = new ThreadLocal<>();
-
private ItemRendererHooks() {
}
diff --git a/src/main/java/appeng/me/ManagedGridNode.java b/src/main/java/appeng/me/ManagedGridNode.java
index c7d9b3e6a0b..5d80592fc8e 100644
--- a/src/main/java/appeng/me/ManagedGridNode.java
+++ b/src/main/java/appeng/me/ManagedGridNode.java
@@ -64,7 +64,7 @@ private static class InitData {
private Set exposedOnSides = EnumSet.allOf(Direction.class);
private AEItemKey visualRepresentation = null;
private EnumSet flags = EnumSet.noneOf(GridFlags.class);
- private double idlePowerUsage = 1.0;
+
private int owner = -1; // ME player id of owner
private Level level;
private BlockPos pos;
diff --git a/src/main/java/appeng/parts/AEBasePart.java b/src/main/java/appeng/parts/AEBasePart.java
index b27f56817d3..54c94162a01 100644
--- a/src/main/java/appeng/parts/AEBasePart.java
+++ b/src/main/java/appeng/parts/AEBasePart.java
@@ -35,7 +35,6 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player;
-import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
@@ -57,7 +56,6 @@
import appeng.api.util.AEColor;
import appeng.helpers.ICustomNameObject;
import appeng.util.CustomNameUtil;
-import appeng.util.InteractionUtil;
import appeng.util.Platform;
import appeng.util.SettingsFrom;
diff --git a/src/main/java/appeng/parts/CableBusContainer.java b/src/main/java/appeng/parts/CableBusContainer.java
index 335063b3583..4ece5b297ef 100644
--- a/src/main/java/appeng/parts/CableBusContainer.java
+++ b/src/main/java/appeng/parts/CableBusContainer.java
@@ -911,9 +911,6 @@ public CableBusRenderState getRenderState() {
final IPartCollisionHelper bch = new BusCollisionHelper(renderState.getBoundingBoxes(), side, true);
part.getBoxes(bch);
- // Some attachments want a thicker cable than glass, account for that
- var desiredType = part.getDesiredConnectionType();
-
int length = (int) part.getCableConnectionLength(null);
if (length > 0 && length <= 8) {
renderState.getAttachmentConnections().put(side, length);
diff --git a/src/main/java/appeng/parts/automation/StackExportFacade.java b/src/main/java/appeng/parts/automation/StackExportFacade.java
deleted file mode 100644
index ca7b2ecda07..00000000000
--- a/src/main/java/appeng/parts/automation/StackExportFacade.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package appeng.parts.automation;
-
-import java.util.List;
-
-import appeng.api.behaviors.StackExportStrategy;
-import appeng.api.behaviors.StackTransferContext;
-import appeng.api.config.Actionable;
-import appeng.api.stacks.AEKey;
-
-/**
- * Simply iterates over a list of {@link StackExportStrategy} and exposes them as a single strategy. First come, first
- * serve.
- */
-public class StackExportFacade implements StackExportStrategy {
- private final List strategies;
-
- public StackExportFacade(List strategies) {
- this.strategies = strategies;
- }
-
- @Override
- public long transfer(StackTransferContext context, AEKey what, long maxAmount) {
- for (var strategy : strategies) {
- var result = strategy.transfer(context, what, maxAmount);
- if (result > 0) {
- return result;
- }
- }
- return 0;
- }
-
- @Override
- public long push(AEKey what, long amount, Actionable mode) {
- for (var strategy : strategies) {
- var result = strategy.push(what, amount, mode);
- if (result > 0) {
- return result;
- }
- }
- return 0;
- }
-}
diff --git a/src/main/java/appeng/parts/automation/StackImportFacade.java b/src/main/java/appeng/parts/automation/StackImportFacade.java
deleted file mode 100644
index f0549981cbe..00000000000
--- a/src/main/java/appeng/parts/automation/StackImportFacade.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package appeng.parts.automation;
-
-import java.util.List;
-
-import appeng.api.behaviors.StackImportStrategy;
-import appeng.api.behaviors.StackTransferContext;
-
-/**
- * Simply iterates over a list of {@link StackImportStrategy} and exposes them as a single strategy. First come, first
- * serve.
- */
-public class StackImportFacade implements StackImportStrategy {
- private final List strategies;
-
- public StackImportFacade(List strategies) {
- this.strategies = strategies;
- }
-
- @Override
- public boolean transfer(StackTransferContext context) {
- for (var strategy : strategies) {
- if (strategy.transfer(context)) {
- return true;
- }
- }
- return true;
- }
-}
diff --git a/src/main/java/appeng/parts/automation/StackTransferContextImpl.java b/src/main/java/appeng/parts/automation/StackTransferContextImpl.java
deleted file mode 100644
index 0094a5b18fa..00000000000
--- a/src/main/java/appeng/parts/automation/StackTransferContextImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package appeng.parts.automation;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import appeng.api.behaviors.StackTransferContext;
-import appeng.api.config.Actionable;
-import appeng.api.networking.security.IActionSource;
-import appeng.api.networking.storage.IStorageService;
-import appeng.api.stacks.AEItemKey;
-import appeng.api.stacks.AEKey;
-import appeng.api.stacks.AEKeyType;
-import appeng.util.prioritylist.IPartitionList;
-
-/**
- * Context for stack transfer operations, regardless of whether they occur in or out of the network.
- */
-class StackTransferContextImpl implements StackTransferContext {
- private final IStorageService internalStorage;
- private final IActionSource actionSource;
- private final IPartitionList filter;
- private final Set keyTypes;
- private final int initialOperations;
- private int operationsRemaining;
- private boolean isInverted;
-
- public StackTransferContextImpl(IStorageService internalStorage,
- IActionSource actionSource,
- int operationsRemaining,
- IPartitionList filter) {
- this.internalStorage = internalStorage;
- this.actionSource = actionSource;
- this.filter = filter;
- this.initialOperations = operationsRemaining;
- this.operationsRemaining = operationsRemaining;
- this.keyTypes = new HashSet<>();
- for (AEKey item : filter.getItems()) {
- this.keyTypes.add(item.getType());
- }
- }
-
- @Override
- public IStorageService getInternalStorage() {
- return internalStorage;
- }
-
- @Override
- public IActionSource getActionSource() {
- return actionSource;
- }
-
- @Override
- public int getOperationsRemaining() {
- return operationsRemaining;
- }
-
- @Override
- public void setOperationsRemaining(int operationsRemaining) {
- this.operationsRemaining = operationsRemaining;
- }
-
- @Override
- public boolean hasOperationsLeft() {
- return operationsRemaining > 0;
- }
-
- @Override
- public boolean hasDoneWork() {
- return initialOperations > operationsRemaining;
- }
-
- @Override
- public boolean isKeyTypeEnabled(AEKeyType space) {
- return keyTypes.isEmpty() || keyTypes.contains(space);
- }
-
- @Override
- public boolean isInFilter(AEKey key) {
- return filter.isEmpty() || filter.isListed(key);
- }
-
- @Override
- public IPartitionList getFilter() {
- return filter;
- }
-
- @Override
- public void setInverted(boolean inverted) {
- isInverted = inverted;
- }
-
- @Override
- public boolean isInverted() {
- return !filter.isEmpty() && isInverted;
- }
-
- @Override
- public boolean canInsert(AEItemKey what, long amount) {
- return internalStorage.getInventory().insert(
- what,
- amount,
- Actionable.SIMULATE,
- actionSource) > 0;
- }
-
- @Override
- public void reduceOperationsRemaining(long inserted) {
- operationsRemaining -= inserted;
- }
-}
diff --git a/src/main/java/appeng/parts/automation/StackWorldBehaviors.java b/src/main/java/appeng/parts/automation/StackWorldBehaviors.java
index 76c80f4907e..050fa189be4 100644
--- a/src/main/java/appeng/parts/automation/StackWorldBehaviors.java
+++ b/src/main/java/appeng/parts/automation/StackWorldBehaviors.java
@@ -1,6 +1,5 @@
package appeng.parts.automation;
-import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.Map;
@@ -55,22 +54,6 @@ public static AEKeyFilter hasExportStrategyFilter() {
return what -> exportStrategies.getMap().containsKey(what.getType());
}
- public static StackImportStrategy createImportFacade(ServerLevel level, BlockPos fromPos, Direction fromSide) {
- var strategies = new ArrayList(importStrategies.getMap().size());
- for (var supplier : importStrategies.getMap().values()) {
- strategies.add(supplier.create(level, fromPos, fromSide));
- }
- return new StackImportFacade(strategies);
- }
-
- public static StackExportStrategy createExportFacade(ServerLevel level, BlockPos fromPos, Direction fromSide) {
- var strategies = new ArrayList(exportStrategies.getMap().size());
- for (var supplier : exportStrategies.getMap().values()) {
- strategies.add(supplier.create(level, fromPos, fromSide));
- }
- return new StackExportFacade(strategies);
- }
-
public static Map createExternalStorageStrategies(ServerLevel level,
BlockPos fromPos, Direction fromSide) {
var strategies = new IdentityHashMap(
diff --git a/src/main/java/appeng/util/EnchantmentUtil.java b/src/main/java/appeng/util/EnchantmentUtil.java
deleted file mode 100644
index 97ee48231a0..00000000000
--- a/src/main/java/appeng/util/EnchantmentUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package appeng.util;
-
-import java.util.Map;
-
-import org.jetbrains.annotations.Nullable;
-
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.nbt.ListTag;
-import net.minecraft.nbt.Tag;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.item.enchantment.Enchantment;
-import net.minecraft.world.item.enchantment.EnchantmentHelper;
-
-/**
- * Allows serializing enchantments to and from NBT data in the same format as {@link ItemStack}.
- */
-public final class EnchantmentUtil {
- private EnchantmentUtil() {
- }
-
- /**
- * Read enchants written using {@link #setEnchantments} or added to an itemstack's tag using normal enchanting.
- *
- * @return null if no enchants are present
- */
- @Nullable
- public static Map getEnchantments(CompoundTag data) {
- if (data.contains(ItemStack.TAG_ENCH, Tag.TAG_LIST)) {
- var list = data.getList(ItemStack.TAG_ENCH, Tag.TAG_COMPOUND);
- var enchants = EnchantmentHelper.deserializeEnchantments(list);
- if (!enchants.isEmpty()) {
- return enchants;
- }
- }
- return null;
- }
-
- /**
- * Writes a list of enchantments to the given tag the same way as
- * {@link EnchantmentHelper#setEnchantments(Map, ItemStack)} would.
- */
- public static void setEnchantments(CompoundTag tag, Map enchantments) {
- ListTag enchantList = new ListTag();
- for (Map.Entry entry : enchantments.entrySet()) {
- Enchantment enchantment = entry.getKey();
- if (enchantment == null)
- continue;
- int level = entry.getValue();
- enchantList.add(EnchantmentHelper.storeEnchantment(EnchantmentHelper.getEnchantmentId(enchantment), level));
- }
- tag.put("Enchantments", enchantList);
- }
-}
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index 8f32982cdf2..572f39cd763 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -2,12 +2,11 @@
"schemaVersion": 1,
"id": "ae2",
"version": "${version}",
- "name": "Applied Energistics 2",
- "description": "A Mod about matter, energy and using them to conquer the world..",
- "authors": ["TeamAppliedEnergistics"],
+ "name": "AE2 [neko.smp]",
+ "description": "A Mod about matter, energy and using them to conquer the world.",
+ "authors": ["TeamAppliedEnergistics", "Atakku"],
"contact": {
- "homepage": "https://appliedenergistics.github.io/",
- "sources": "https://github.com/AppliedEnergistics/Applied-Energistics-2/"
+ "sources": "https://github.com/nekosmp/nsmp-ae2"
},
"license": "LGPL",
"icon": "assets/ae2/logo.png",
@@ -23,7 +22,8 @@
"depends": {
"fabricloader": ">=0.14.8",
"fabric": ">=0.66.0",
- "minecraft": ">=1.19.1"
+ "minecraft": ">=1.19.1",
+ "create": "*"
},
"conflicts": {
"appliedenergistics2": "*"
diff --git a/src/nsmp/java/rs/neko/nsmp/ae2/CreateCompat.java b/src/nsmp/java/rs/neko/nsmp/ae2/CreateCompat.java
new file mode 100644
index 00000000000..01d48e3da51
--- /dev/null
+++ b/src/nsmp/java/rs/neko/nsmp/ae2/CreateCompat.java
@@ -0,0 +1,43 @@
+package rs.neko.nsmp.ae2;
+
+import com.simibubi.create.content.contraptions.itemAssembly.SequencedAssemblyItem;
+
+import appeng.api.ids.AEBlockIds;
+import appeng.api.ids.AEItemIds;
+import appeng.core.definitions.AEBlocks;
+import appeng.core.definitions.AEItems;
+import appeng.core.definitions.BlockDefinition;
+import appeng.core.definitions.ItemDefinition;
+import appeng.items.materials.MaterialItem;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.state.BlockBehaviour.Properties;
+import net.minecraft.world.level.material.Material;
+
+public class CreateCompat {
+ public static class Ids {
+ // Item ids
+ public static final ResourceLocation INCOMPLETE_ALLOY = AEItemIds.id("incomplete_alloy");
+ public static final ResourceLocation INCOMPLETE_CABLE = AEItemIds.id("incomplete_cable");
+ public static final ResourceLocation INCOMPLETE_TERMINAL = AEItemIds.id("incomplete_terminal");
+
+ public static final ResourceLocation CRYSTALLINE_ALLOY = AEItemIds.id("crystalline_alloy");
+ public static final ResourceLocation WIRELESS_ANTENNA = AEItemIds.id("wireless_antenna");
+
+ // Block ids
+ public static final ResourceLocation CRYSTALLINE_CASING = AEBlockIds.id("crystalline_casing");
+ }
+
+ // Register items
+ public static final ItemDefinition INCOMPLETE_ALLOY = AEItems.item("Incomplete Crystalline Alloy", Ids.INCOMPLETE_ALLOY, SequencedAssemblyItem::new);
+ public static final ItemDefinition INCOMPLETE_CABLE = AEItems.item("Incomplete Crystalline Cables", Ids.INCOMPLETE_CABLE, SequencedAssemblyItem::new);
+ public static final ItemDefinition INCOMPLETE_TERMINAL = AEItems.item("Incomplete Terminal", Ids.INCOMPLETE_TERMINAL, SequencedAssemblyItem::new);
+
+ public static final ItemDefinition CRYSTALLINE_ALLOY = AEItems.item("Crystalline Alloy", Ids.CRYSTALLINE_ALLOY, MaterialItem::new);
+ public static final ItemDefinition WIRELESS_ANTENNA = AEItems.item("Wireless Antenna", Ids.WIRELESS_ANTENNA, MaterialItem::new);
+
+ // Register blocks
+ public static final BlockDefinition CABLE_BUS = AEBlocks.block("Crystalline Casing", Ids.CRYSTALLINE_CASING, () -> new Block(Properties.of(Material.AMETHYST)));
+
+ public static void init() {}
+}
diff --git a/src/nsmp/res/assets/ae2/models/block/crystalline_casing.json b/src/nsmp/res/assets/ae2/models/block/crystalline_casing.json
new file mode 100644
index 00000000000..063ae92f3c2
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/block/crystalline_casing.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:block/cube_all",
+ "textures": {
+ "all": "ae2:block/crystalline_casing"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/models/item/crystalline_alloy.json b/src/nsmp/res/assets/ae2/models/item/crystalline_alloy.json
new file mode 100644
index 00000000000..6f464111bcd
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/item/crystalline_alloy.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "ae2:item/crystalline_alloy"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/models/item/crystalline_casing.json b/src/nsmp/res/assets/ae2/models/item/crystalline_casing.json
new file mode 100644
index 00000000000..f56852b9762
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/item/crystalline_casing.json
@@ -0,0 +1,3 @@
+{
+ "parent": "ae2:block/crystalline_casing"
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/models/item/incomplete_alloy.json b/src/nsmp/res/assets/ae2/models/item/incomplete_alloy.json
new file mode 100644
index 00000000000..2c55d1f53a3
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/item/incomplete_alloy.json
@@ -0,0 +1,3 @@
+{
+ "parent": "ae2:item/crystalline_alloy"
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/models/item/incomplete_cable.json b/src/nsmp/res/assets/ae2/models/item/incomplete_cable.json
new file mode 100644
index 00000000000..fec9468e213
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/item/incomplete_cable.json
@@ -0,0 +1,3 @@
+{
+ "parent": "ae2:item/fluix_glass_cable"
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/models/item/incomplete_terminal.json b/src/nsmp/res/assets/ae2/models/item/incomplete_terminal.json
new file mode 100644
index 00000000000..285b7e871c4
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/item/incomplete_terminal.json
@@ -0,0 +1,3 @@
+{
+ "parent": "ae2:item/terminal"
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/models/item/wireless_antenna.json b/src/nsmp/res/assets/ae2/models/item/wireless_antenna.json
new file mode 100644
index 00000000000..4f43fe9472d
--- /dev/null
+++ b/src/nsmp/res/assets/ae2/models/item/wireless_antenna.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "ae2:item/wireless_antenna"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/assets/ae2/textures/block/crystalline_casing.png b/src/nsmp/res/assets/ae2/textures/block/crystalline_casing.png
new file mode 100644
index 00000000000..2bbce2b35af
Binary files /dev/null and b/src/nsmp/res/assets/ae2/textures/block/crystalline_casing.png differ
diff --git a/src/nsmp/res/assets/ae2/textures/item/crystalline_alloy.png b/src/nsmp/res/assets/ae2/textures/item/crystalline_alloy.png
new file mode 100644
index 00000000000..bda76faf77f
Binary files /dev/null and b/src/nsmp/res/assets/ae2/textures/item/crystalline_alloy.png differ
diff --git a/src/nsmp/res/assets/ae2/textures/item/wireless_antenna.png b/src/nsmp/res/assets/ae2/textures/item/wireless_antenna.png
new file mode 100644
index 00000000000..a7cf048d89f
Binary files /dev/null and b/src/nsmp/res/assets/ae2/textures/item/wireless_antenna.png differ
diff --git a/src/nsmp/res/data/ae2/recipes/biometric_card.json b/src/nsmp/res/data/ae2/recipes/biometric_card.json
new file mode 100644
index 00000000000..fe47f710104
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/biometric_card.json
@@ -0,0 +1,24 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "key": {
+ "R": {
+ "item": "minecraft:redstone"
+ },
+ "M": {
+ "tag": "ae2:metal_ingots"
+ },
+ "S": {
+ "tag": "ae2:metal_sheets"
+ },
+ "A": {
+ "item": "ae2:crystalline_alloy"
+ }
+ },
+ "pattern": [
+ "AMM",
+ "SRS"
+ ],
+ "result": {
+ "item": "ae2:biometric_card"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/capacity_card.json b/src/nsmp/res/data/ae2/recipes/capacity_card.json
new file mode 100644
index 00000000000..fac7dfbd97e
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/capacity_card.json
@@ -0,0 +1,14 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:crystalline_alloy"
+ },
+ {
+ "item": "minecraft:chest"
+ }
+ ],
+ "result": {
+ "item": "ae2:capacity_card"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/crafting_terminal.json b/src/nsmp/res/data/ae2/recipes/crafting_terminal.json
new file mode 100644
index 00000000000..2ac0f22b0e1
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/crafting_terminal.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:terminal"
+ },
+ {
+ "item": "minecraft:crafting_table"
+ },
+ {
+ "item": "ae2:crystalline_alloy"
+ }
+ ],
+ "result": {
+ "item": "ae2:crafting_terminal"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/fuzzy_card.json b/src/nsmp/res/data/ae2/recipes/fuzzy_card.json
new file mode 100644
index 00000000000..2732670ee0f
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/fuzzy_card.json
@@ -0,0 +1,14 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:crystalline_alloy"
+ },
+ {
+ "item": "minecraft:comparator"
+ }
+ ],
+ "result": {
+ "item": "ae2:fuzzy_card"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/inverter_card.json b/src/nsmp/res/data/ae2/recipes/inverter_card.json
new file mode 100644
index 00000000000..2db716cb105
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/inverter_card.json
@@ -0,0 +1,14 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:crystalline_alloy"
+ },
+ {
+ "item": "minecraft:redstone_torch"
+ }
+ ],
+ "result": {
+ "item": "ae2:inverter_card"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/item_application/crystalline_casing.json b/src/nsmp/res/data/ae2/recipes/item_application/crystalline_casing.json
new file mode 100644
index 00000000000..a43532d9cc9
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/item_application/crystalline_casing.json
@@ -0,0 +1,16 @@
+{
+ "type": "create:item_application",
+ "ingredients": [
+ {
+ "item": "create:railway_casing"
+ },
+ {
+ "item": "ae2:crystalline_alloy"
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:crystalline_casing"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/security_station.json b/src/nsmp/res/data/ae2/recipes/security_station.json
new file mode 100644
index 00000000000..b44a276af8c
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/security_station.json
@@ -0,0 +1,31 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "key": {
+ "T": {
+ "tag": "ae2:terminals"
+ },
+ "M": {
+ "tag": "ae2:metal_ingots"
+ },
+ "S": {
+ "tag": "ae2:metal_sheets"
+ },
+ "c": {
+ "tag": "ae2:glass_cable"
+ },
+ "C": {
+ "item": "ae2:crystalline_casing"
+ },
+ "G": {
+ "tag": "c:gems"
+ }
+ },
+ "pattern": [
+ "STS",
+ "cCc",
+ "MGM"
+ ],
+ "result": {
+ "item": "ae2:security_station"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/sequenced_assembly/crystalline_alloy.json b/src/nsmp/res/data/ae2/recipes/sequenced_assembly/crystalline_alloy.json
new file mode 100644
index 00000000000..04202305a49
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/sequenced_assembly/crystalline_alloy.json
@@ -0,0 +1,106 @@
+{
+ "type": "create:sequenced_assembly",
+ "ingredient": {
+ "tag": "c:diamonds"
+ },
+ "loops": 1,
+ "results": [
+ {
+ "item": "ae2:crystalline_alloy"
+ }
+ ],
+ "sequence": [
+ {
+ "type": "create:deploying",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_alloy"
+ },
+ [
+ {
+ "tag": "c:quartz"
+ }
+ ]
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ]
+ },
+ {
+ "type": "create:cutting",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ],
+ "processingTime": 50,
+ "results": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ]
+ },
+ {
+ "type": "create:pressing",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ]
+ },
+ {
+ "type": "create:pressing",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ]
+ },
+ {
+ "type": "create:filling",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_alloy"
+ },
+ {
+ "amount": 40500,
+ "fluid": "minecraft:lava",
+ "nbt": {}
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ]
+ },
+ {
+ "type": "create:pressing",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_alloy"
+ }
+ ]
+ }
+ ],
+ "transitionalItem": {
+ "item": "ae2:incomplete_alloy"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/sequenced_assembly/glass_cable.json b/src/nsmp/res/data/ae2/recipes/sequenced_assembly/glass_cable.json
new file mode 100644
index 00000000000..89b86c726b2
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/sequenced_assembly/glass_cable.json
@@ -0,0 +1,81 @@
+{
+ "type": "create:sequenced_assembly",
+ "ingredient": {
+ "tag": "c:glass_blocks"
+ },
+ "loops": 1,
+ "results": [
+ {
+ "count": 16,
+ "item": "ae2:fluix_glass_cable"
+ }
+ ],
+ "sequence": [
+ {
+ "type": "create:deploying",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_cable"
+ },
+ [
+ {
+ "item": "ae2:crystalline_alloy"
+ }
+ ]
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_cable"
+ }
+ ]
+ },
+ {
+ "type": "create:filling",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_cable"
+ },
+ {
+ "amount": 40500,
+ "fluid": "minecraft:lava",
+ "nbt": {}
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_cable"
+ }
+ ]
+ },
+ {
+ "type": "create:pressing",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_cable"
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_cable"
+ }
+ ]
+ },
+ {
+ "type": "create:cutting",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_cable"
+ }
+ ],
+ "processingTime": 50,
+ "results": [
+ {
+ "item": "ae2:incomplete_cable"
+ }
+ ]
+ }
+ ],
+ "transitionalItem": {
+ "item": "ae2:incomplete_cable"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/sequenced_assembly/terminal.json b/src/nsmp/res/data/ae2/recipes/sequenced_assembly/terminal.json
new file mode 100644
index 00000000000..e14462d27c0
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/sequenced_assembly/terminal.json
@@ -0,0 +1,98 @@
+{
+ "type": "create:sequenced_assembly",
+ "ingredient": {
+ "item": "ae2:crystalline_alloy"
+ },
+ "loops": 1,
+ "results": [
+ {
+ "item": "ae2:terminal"
+ }
+ ],
+ "sequence": [
+ {
+ "type": "create:filling",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_terminal"
+ },
+ {
+ "amount": 40500,
+ "fluid": "minecraft:lava",
+ "nbt": {}
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ]
+ },
+ {
+ "type": "create:deploying",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_terminal"
+ },
+ [
+ {
+ "item": "create:precision_mechanism"
+ }
+ ]
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ]
+ },
+ {
+ "type": "create:deploying",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_terminal"
+ },
+ [
+ {
+ "tag": "c:glass_blocks"
+ }
+ ]
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ]
+ },
+ {
+ "type": "create:pressing",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ],
+ "results": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ]
+ },
+ {
+ "type": "create:cutting",
+ "ingredients": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ],
+ "processingTime": 50,
+ "results": [
+ {
+ "item": "ae2:incomplete_terminal"
+ }
+ ]
+ }
+ ],
+ "transitionalItem": {
+ "item": "ae2:incomplete_terminal"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/storage_bus.json b/src/nsmp/res/data/ae2/recipes/storage_bus.json
new file mode 100644
index 00000000000..eea4133f9b7
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/storage_bus.json
@@ -0,0 +1,25 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "key": {
+ "c": {
+ "tag": "ae2:glass_cable"
+ },
+ "C": {
+ "item": "ae2:crystalline_casing"
+ },
+ "s": {
+ "tag": "ae2:metal_sheets"
+ },
+ "S": {
+ "tag": "ae2:metal_ingots"
+ }
+ },
+ "pattern": [
+ " c ",
+ "sCs",
+ "SSS"
+ ],
+ "result": {
+ "item": "ae2:storage_bus"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/wireless_access_point.json b/src/nsmp/res/data/ae2/recipes/wireless_access_point.json
new file mode 100644
index 00000000000..d1da200a5ee
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/wireless_access_point.json
@@ -0,0 +1,14 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:wireless_antenna"
+ },
+ {
+ "tag": "ae2:glass_cable"
+ }
+ ],
+ "result": {
+ "item": "ae2:wireless_access_point"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/wireless_antenna.json b/src/nsmp/res/data/ae2/recipes/wireless_antenna.json
new file mode 100644
index 00000000000..eac710a547d
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/wireless_antenna.json
@@ -0,0 +1,25 @@
+{
+ "type": "minecraft:crafting_shaped",
+ "key": {
+ "E": {
+ "item": "minecraft:ender_eye"
+ },
+ "M": {
+ "tag": "ae2:metal_ingots"
+ },
+ "S": {
+ "tag": "ae2:metal_sheets"
+ },
+ "A": {
+ "item": "ae2:crystalline_alloy"
+ }
+ },
+ "pattern": [
+ " E ",
+ "SAS",
+ " M "
+ ],
+ "result": {
+ "item": "ae2:wireless_antenna"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/wireless_crafting_terminal_from_crafting_terminal.json b/src/nsmp/res/data/ae2/recipes/wireless_crafting_terminal_from_crafting_terminal.json
new file mode 100644
index 00000000000..2efc396ec16
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/wireless_crafting_terminal_from_crafting_terminal.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:crafting_terminal"
+ },
+ {
+ "item": "ae2:wireless_antenna"
+ },
+ {
+ "item": "ae2:crystalline_casing"
+ }
+ ],
+ "result": {
+ "item": "ae2:wireless_crafting_terminal"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/wireless_crafting_terminal_from_wireless_terminal.json b/src/nsmp/res/data/ae2/recipes/wireless_crafting_terminal_from_wireless_terminal.json
new file mode 100644
index 00000000000..fb7bd2294e9
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/wireless_crafting_terminal_from_wireless_terminal.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:wireless_terminal"
+ },
+ {
+ "item": "minecraft:crafting_table"
+ },
+ {
+ "item": "ae2:crystalline_alloy"
+ }
+ ],
+ "result": {
+ "item": "ae2:wireless_crafting_terminal"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/recipes/wireless_terminal.json b/src/nsmp/res/data/ae2/recipes/wireless_terminal.json
new file mode 100644
index 00000000000..4f804d34d34
--- /dev/null
+++ b/src/nsmp/res/data/ae2/recipes/wireless_terminal.json
@@ -0,0 +1,17 @@
+{
+ "type": "minecraft:crafting_shapeless",
+ "ingredients": [
+ {
+ "item": "ae2:terminal"
+ },
+ {
+ "item": "ae2:wireless_antenna"
+ },
+ {
+ "item": "ae2:crystalline_casing"
+ }
+ ],
+ "result": {
+ "item": "ae2:wireless_terminal"
+ }
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/tags/items/metal_ingots.json b/src/nsmp/res/data/ae2/tags/items/metal_ingots.json
new file mode 100644
index 00000000000..4ac46a31461
--- /dev/null
+++ b/src/nsmp/res/data/ae2/tags/items/metal_ingots.json
@@ -0,0 +1,11 @@
+{
+ "replace": false,
+ "values": [
+ "minecraft:iron_ingot",
+ "minecraft:copper_ingot",
+ "minecraft:gold_ingot",
+ "minecraft:netherite_ingot",
+ "create:zinc_ingot",
+ "create:brass_ingot"
+ ]
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/tags/items/metal_sheets.json b/src/nsmp/res/data/ae2/tags/items/metal_sheets.json
new file mode 100644
index 00000000000..f07ec235348
--- /dev/null
+++ b/src/nsmp/res/data/ae2/tags/items/metal_sheets.json
@@ -0,0 +1,10 @@
+{
+ "replace": false,
+ "values": [
+ "create:sturdy_sheet",
+ "create:copper_sheet",
+ "create:brass_sheet",
+ "create:iron_sheet",
+ "create:golden_sheet"
+ ]
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/ae2/tags/items/terminals.json b/src/nsmp/res/data/ae2/tags/items/terminals.json
new file mode 100644
index 00000000000..8612af57ebc
--- /dev/null
+++ b/src/nsmp/res/data/ae2/tags/items/terminals.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "ae2:terminal",
+ "ae2:crafting_terminal"
+ ]
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/c/tags/blocks/glass_blocks.json b/src/nsmp/res/data/c/tags/blocks/glass_blocks.json
new file mode 100644
index 00000000000..9a23d087931
--- /dev/null
+++ b/src/nsmp/res/data/c/tags/blocks/glass_blocks.json
@@ -0,0 +1,22 @@
+{
+ "replace": false,
+ "values": [
+ "minecraft:glass",
+ "minecraft:white_stained_glass",
+ "minecraft:orange_stained_glass",
+ "minecraft:magenta_stained_glass",
+ "minecraft:light_blue_stained_glass",
+ "minecraft:yellow_stained_glass",
+ "minecraft:lime_stained_glass",
+ "minecraft:pink_stained_glass",
+ "minecraft:gray_stained_glass",
+ "minecraft:light_gray_stained_glass",
+ "minecraft:cyan_stained_glass",
+ "minecraft:purple_stained_glass",
+ "minecraft:blue_stained_glass",
+ "minecraft:brown_stained_glass",
+ "minecraft:green_stained_glass",
+ "minecraft:red_stained_glass",
+ "minecraft:black_stained_glass"
+ ]
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/c/tags/items/quartz.json b/src/nsmp/res/data/c/tags/items/quartz.json
new file mode 100644
index 00000000000..49ac1fd1527
--- /dev/null
+++ b/src/nsmp/res/data/c/tags/items/quartz.json
@@ -0,0 +1,6 @@
+{
+ "replace": false,
+ "values": [
+ "minecraft:quartz"
+ ]
+}
\ No newline at end of file
diff --git a/src/nsmp/res/data/c/tags/items/redstone_dusts.json b/src/nsmp/res/data/c/tags/items/redstone_dusts.json
new file mode 100644
index 00000000000..2703f553aa3
--- /dev/null
+++ b/src/nsmp/res/data/c/tags/items/redstone_dusts.json
@@ -0,0 +1,6 @@
+{
+ "replace": false,
+ "values": [
+ "minecraft:redstone"
+ ]
+}
\ No newline at end of file