Merge branch 'develop/fix' into develop/gtl_support

# Conflicts:
#	build.gradle
This commit is contained in:
C-H716 2025-11-17 14:18:11 +08:00
commit 54e0d8459d
158 changed files with 4442 additions and 359 deletions

9
.gitignore vendored
View File

@ -87,9 +87,6 @@ classes/
*.zip
# Reference source code (should not be tracked)
ExtendedAE-1.20-1.4.2-forge/
GTLCore/
# Gradle wrapper (optional - some prefer to commit this)
# gradle/wrapper/gradle-wrapper.jar
# gradle/wrapper/gradle-wrapper.properties
@ -118,6 +115,6 @@ temp/
tmp/
# Allow dependencies in libs
!libs/
!libs/*.jar
!libs/**/*.jar
libs/*
!libs/ExtendedAE-1.20-1.4.2-forge.jar
/src/generated/resources/.cache

View File

@ -17,6 +17,8 @@
- Added natural sorting functionality for the upload pattern list
- 添加合成计划字节数显示的格式化功能
- Added formatted display for crafting plan byte count
- 添加部分物品用于磁盘合成与AAE、APPFLUX、MEGA均有联动
- Add some items for disk synthesis (linked with AAE, APPFLUX, MEGA)
### Changed / 变更
- 调整实体加速器模型
@ -31,6 +33,12 @@
- Added version restrictions for MAE2
- 为部分文本添加翻译键支持,改善国际化体验
- Added translation key support for some previously hardcoded text, improving internationalization experience
- 略微提升无线收发器基础硬度锁定状态下挖掘速度降至10%
- Slightly increased wireless transceiver base hardness, mining speed reduced to 10% when locked
- 调整部分物品合成配方
- Adjust the synthesis formula of some items
- 优化本mod磁盘性能
- Optimize the disk performance of this mod
### Fixed / 修复
- 修复供应器高亮在服务器中不显示的问题

View File

@ -11,6 +11,14 @@ base {
archivesName = project.archives_name
}
sourceSets {
main {
resources {
srcDir 'src/generated/resources'
}
}
}
loom {
silentMojangMappingsLicense()
@ -19,11 +27,13 @@ loom {
}
runs {
client1 {
client()
name "Client 1"
runDir "run/client1"
programArgs "--username", "Player1"
data {
data()
name "Data Generation"
// IDE
programArgs.addAll(
'--mod', project.name, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
)
}
}
}
@ -75,6 +85,7 @@ dependencies {
minecraft "net.minecraft:minecraft:${minecraft_version}"
mappings loom.officialMojangMappings()
forge "net.minecraftforge:forge:${forge_version}"
annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor"
//exendedae前置
modImplementation "curse.maven:glodium-957920:${glodium_version}"
@ -85,15 +96,22 @@ dependencies {
//ae2
modImplementation "appeng:appliedenergistics2-forge:${ae2_version}"
modImplementation "org.appliedenergistics:guideme:${guideme_version}"
modCompileOnly "curse.maven:applied-energistics-2-wireless-terminals-459929:${wireless_terminals_version}"
modImplementation "curse.maven:applied-energistics-2-wireless-terminals-459929:${wireless_terminals_version}"
modImplementation "curse.maven:applied-flux-965012:6755986"
modImplementation "curse.maven:mega-cells-622112:${mega_cells_version}"
//mae2
modRuntimeOnly "curse.maven:modern-ae2-additions-1028068:6827727"
modCompileOnly "curse.maven:modern-ae2-additions-1028068:6827727"
//aea
modCompileOnly "curse.maven:advancedae-1084104:6939473"
modRuntimeOnly "curse.maven:advancedae-1084104:6939473"
modCompileOnly "mezz.jei:jei-${minecraft_version}-forge:${jei_version}"
annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor"
modImplementation "curse.maven:applied-flux-965012:6755986"
modCompileOnly "curse.maven:mega-cells-622112:${mega_cells_version}"
modCompileOnly "curse.maven:jade-324717:${jade_version}"
modRuntimeOnly "mezz.jei:jei-${minecraft_version}-forge:15.20.0.112"
modImplementation "mezz.jei:jei-${minecraft_version}-forge:${jei_version}"
modImplementation "curse.maven:jade-324717:${jade_version}"
// GregTech
modImplementation "curse.maven:gregtechceu-modern-890405:${gregtech_version}"
@ -111,18 +129,16 @@ dependencies {
modImplementation("curse.maven:rhino-416294:6186971")
//curios
modRuntimeOnly "curse.maven:curios-309927:${curios_version}"
modCompileOnly "curse.maven:curios-309927:${curios_version}"
modImplementation "curse.maven:curios-309927:${curios_version}"
// Runtime test
modRuntimeOnly "curse.maven:curios-309927:${curios_version}"
modImplementation "curse.maven:jade-324717:5339264"
modRuntimeOnly "dev.architectury:architectury-forge:9.2.14"
modRuntimeOnly "curse.maven:applied-energistics-2-wireless-terminals-459929:${wireless_terminals_version}"
modRuntimeOnly "mezz.jei:jei-${minecraft_version}-forge:${jei_version}"
modRuntimeOnly "curse.maven:cloth-config-348521:5729105"
//jec
modImplementation "curse.maven:just-enough-characters-250702:6680042"
modCompileOnly "curse.maven:just-enough-characters-250702:6680042"
//

View File

@ -0,0 +1,35 @@
{
"type": "advanced_ae:reaction",
"energy": 100000,
"fluid": {
"fluidStack": {
"Amount": 2000,
"FluidName": "advanced_ae:quantum_infusion_source"
}
},
"input_items": [
{
"amount": 2,
"ingredient": {
"item": "ae2:singularity"
}
},
{
"amount": 1,
"ingredient": {
"item": "minecraft:nether_star"
}
},
{
"amount": 4,
"ingredient": {
"item": "advanced_ae:quantum_alloy_plate"
}
}
],
"output": {
"#": 1,
"#c": "ae2:i",
"id": "extendedae_plus:oblivion_singularity"
}
}

View File

@ -0,0 +1,51 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_energy_stage_3": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/compat/energy_storage_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_energy_stage_3",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/compat/energy_storage_core"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
},
{
"type": "forge:mod_loaded",
"modid": "megacells"
}
]
}
]
}

View File

@ -0,0 +1,54 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/compat/infinity_core_1"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/compat/infinity_core_1"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
}
]
}
]
}

View File

@ -0,0 +1,54 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/compat/infinity_core_2"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/compat/infinity_core_2"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "appflux"
}
}
]
}
]
}

View File

@ -0,0 +1,51 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/compat/infinity_core_3"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/compat/infinity_core_3"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
},
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_storage_stage_3": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/compat/storage_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_storage_stage_3",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/compat/storage_core"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "megacells"
}
]
}
]
}

View File

@ -0,0 +1,54 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_energy_stage_3": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/energy_storage_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_energy_stage_3",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/energy_storage_core"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "megacells"
}
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/energy_storage_core_1"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/energy_storage_core_1"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_energy_stage_1": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/energy_storage_core_2"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_energy_stage_1",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/energy_storage_core_2"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_energy_stage_2": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/energy_storage_core_3"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_energy_stage_2",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/energy_storage_core_3"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
]
}
]
}

View File

@ -0,0 +1,57 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/infinity_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/infinity_core"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "appflux"
}
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_quantum_stage_3": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/quantum_storage_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_quantum_stage_3",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/quantum_storage_core"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/quantum_storage_core_1"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/quantum_storage_core_1"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_quantum_stage_1": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/quantum_storage_core_2"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_quantum_stage_1",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/quantum_storage_core_2"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
]
}
]
}

View File

@ -0,0 +1,47 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_quantum_stage_2": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/quantum_storage_core_3"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_quantum_stage_2",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/quantum_storage_core_3"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
]
}
]
}

View File

@ -0,0 +1,50 @@
{
"advancements": [
{
"advancement": {
"parent": "minecraft:recipes/root",
"criteria": {
"has_storage_stage_3": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/storage_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_storage_stage_3",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/storage_core"
]
},
"sends_telemetry_event": false
},
"conditions": [
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "megacells"
}
}
]
}
]
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_assembler_matrix_wall": {
"conditions": {
"items": [
{
"items": [
"expatternprovider:assembler_matrix_wall"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:assembler_matrix_upload_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_assembler_matrix_wall",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:assembler_matrix_upload_core"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_advanced_card": {
"conditions": {
"items": [
{
"items": [
"ae2:advanced_card"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:channel_card"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_advanced_card",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:channel_card"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_nether_star": {
"conditions": {
"items": [
{
"items": [
"minecraft:nether_star"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/basic_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_nether_star",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/basic_core"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_spatial_stage_3": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/spatial_core"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_spatial_stage_3",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/spatial_core"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/spatial_core_1"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/spatial_core_1"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_spatial_stage_1": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/spatial_core_2"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_spatial_stage_1",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/spatial_core_2"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_spatial_stage_2": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/spatial_core_3"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_spatial_stage_2",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/spatial_core_3"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_basic_core": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/storage_core_1"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_basic_core",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/storage_core_1"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_storage_stage_1": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/storage_core_2"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_storage_stage_1",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/storage_core_2"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_storage_stage_2": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:basic_core"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:core/storage_core_3"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_storage_stage_2",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:core/storage_core_3"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_entity_speed_card_8x": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:entity_speed_card"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:entity_speed_card_16x"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_entity_speed_card_8x",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:entity_speed_card_16x"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,48 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_64x_accelerator": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:64x_crafting_accelerator"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_speed_card": {
"conditions": {
"items": [
{
"items": [
"ae2:speed_card"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:entity_speed_card_2x"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_speed_card",
"has_64x_accelerator",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:entity_speed_card_2x"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_entity_speed_card_2x": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:entity_speed_card"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:entity_speed_card_4x"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_entity_speed_card_2x",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:entity_speed_card_4x"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_entity_speed_card_4x": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:entity_speed_card"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:entity_speed_card_8x"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_entity_speed_card_4x",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:entity_speed_card_8x"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,48 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_entity_speed_card_x2": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:entity_speed_card"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_singularity": {
"conditions": {
"items": [
{
"items": [
"ae2:singularity"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:entity_speed_ticker"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_entity_speed_card_x2",
"has_singularity",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:entity_speed_ticker"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_oblivion_singularity": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:oblivion_singularity"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:infinity_biginteger_cell"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_oblivion_singularity",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:infinity_biginteger_cell"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_256x": {
"conditions": {
"items": [
{
"items": [
"extendedae_plus:256x_crafting_accelerator"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:network/crafting/1024x_crafting_accelerator"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_256x",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:network/crafting/1024x_crafting_accelerator"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_accelerator": {
"conditions": {
"items": [
{
"items": [
"ae2:crafting_accelerator"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:network/crafting/16x_crafting_accelerator"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_accelerator",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:network/crafting/16x_crafting_accelerator"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_accelerator": {
"conditions": {
"items": [
{
"items": [
"ae2:crafting_accelerator"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:network/crafting/256x_crafting_accelerator"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_accelerator",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:network/crafting/256x_crafting_accelerator"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_accelerator": {
"conditions": {
"items": [
{
"items": [
"ae2:crafting_accelerator"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:network/crafting/4x_crafting_accelerator"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_accelerator",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:network/crafting/4x_crafting_accelerator"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_accelerator": {
"conditions": {
"items": [
{
"items": [
"ae2:crafting_accelerator"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:network/crafting/64x_crafting_accelerator"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_accelerator",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:network/crafting/64x_crafting_accelerator"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,46 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_network_tool": {
"conditions": {
"items": [
{
"items": [
"ae2:network_tool"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_pattern_provider": {
"conditions": {
"items": [
{
"tag": "ae2:pattern_provider"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:network_pattern_controller"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_network_tool",
"has_pattern_provider",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:network_pattern_controller"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,35 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_quantum_ring": {
"conditions": {
"items": [
{
"items": [
"ae2:quantum_ring"
]
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "extendedae_plus:wireless_transceiver"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_quantum_ring",
"has_the_recipe"
]
],
"rewards": {
"recipes": [
"extendedae_plus:wireless_transceiver"
]
},
"sends_telemetry_event": false
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"item": "expatternprovider:assembler_matrix_wall"
},
{
"item": "minecraft:lever"
}
],
"result": {
"item": "extendedae_plus:assembler_matrix_upload_core"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"item": "ae2:advanced_card"
},
{
"item": "extendedae_plus:wireless_transceiver"
}
],
"result": {
"item": "extendedae_plus:channel_card"
}
}

View File

@ -0,0 +1,33 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"A": {
"item": "minecraft:netherite_block"
},
"B": {
"item": "minecraft:nether_star"
},
"C": {
"item": "ae2:logic_processor"
},
"D": {
"item": "ae2:fluix_pearl"
},
"E": {
"item": "ae2:engineering_processor"
},
"F": {
"item": "ae2:calculation_processor"
}
},
"pattern": [
"ABA",
"CDE",
"AFA"
],
"result": {
"item": "extendedae_plus:basic_core"
},
"show_notification": true
}

View File

@ -0,0 +1,52 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
},
{
"type": "forge:mod_loaded",
"modid": "megacells"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 3
}
},
"C": {
"item": "appflux:core_256m"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"NBN",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:energy_storage_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,53 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"C": {
"item": "extendedae_plus:spatial_core"
},
"E": {
"item": "extendedae_plus:energy_storage_core"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
},
"S": {
"item": "extendedae_plus:storage_core"
}
},
"pattern": [
"MNM",
"SOE",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:infinity_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,53 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "appflux"
}
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"C": {
"item": "extendedae_plus:spatial_core"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
},
"Q": {
"item": "extendedae_plus:quantum_storage_core"
},
"S": {
"item": "extendedae_plus:storage_core"
}
},
"pattern": [
"MNM",
"SOQ",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:infinity_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,50 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
},
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"C": {
"item": "extendedae_plus:spatial_core"
},
"E": {
"item": "extendedae_plus:energy_storage_core"
},
"M": {
"item": "minecraft:netherite_block"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
},
"Q": {
"item": "extendedae_plus:quantum_storage_core"
},
"S": {
"item": "extendedae_plus:storage_core"
}
},
"pattern": [
"MQM",
"SOE",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:infinity_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,48 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "megacells"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 3
}
},
"C": {
"item": "megacells:cell_component_256m"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"NBN",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:storage_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,55 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "megacells"
}
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 3
}
},
"C": {
"item": "appflux:core_256k"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"NBN",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:energy_storage_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,45 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core"
},
"C": {
"item": "appflux:core_16k"
},
"E": {
"item": "appflux:energy_processor"
},
"M": {
"tag": "forge:gems/redstone"
}
},
"pattern": [
"MCM",
"EBE",
"MEM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 1
}
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,49 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 1
}
},
"C": {
"item": "appflux:core_64k"
},
"M": {
"item": "appflux:charged_redstone"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MOM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 2
}
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,49 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "appflux"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 2
}
},
"C": {
"item": "appflux:core_256k"
},
"M": {
"tag": "forge:ingots/sky_insulating_resin"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 3,
"core_stage": 3
}
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,53 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "appflux"
}
},
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"C": {
"item": "extendedae_plus:spatial_core"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
},
"S": {
"item": "extendedae_plus:storage_core"
}
},
"pattern": [
"MNM",
"SOS",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:infinity_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,48 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 4,
"core_stage": 3
}
},
"C": {
"item": "advanced_ae:quantum_storage_256"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"NBN",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:quantum_storage_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,45 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core"
},
"C": {
"item": "advanced_ae:quantum_storage_component"
},
"E": {
"item": "advanced_ae:quantum_processor"
},
"M": {
"item": "advanced_ae:quantum_alloy"
}
},
"pattern": [
"MCM",
"EBE",
"MEM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 4,
"core_stage": 1
}
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,49 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 4,
"core_stage": 1
}
},
"C": {
"item": "advanced_ae:quantum_storage_component"
},
"M": {
"item": "advanced_ae:quantum_alloy_block"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MOM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 4,
"core_stage": 2
}
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,49 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:mod_loaded",
"modid": "advanced_ae"
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 4,
"core_stage": 2
}
},
"C": {
"item": "advanced_ae:quantum_storage_128"
},
"M": {
"item": "advanced_ae:quantum_alloy_plate"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 4,
"core_stage": 3
}
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,35 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 2,
"core_stage": 3
}
},
"C": {
"item": "ae2:spatial_cell_component_128"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"NBN",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:spatial_core"
},
"show_notification": true
}

View File

@ -0,0 +1,38 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core"
},
"C": {
"item": "ae2:spatial_cell_component_2"
},
"E": {
"item": "ae2:engineering_processor"
},
"L": {
"item": "ae2:logic_processor"
},
"M": {
"tag": "forge:dusts/fluix"
},
"P": {
"item": "ae2:calculation_processor"
}
},
"pattern": [
"MCM",
"LBP",
"MEM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 2,
"core_stage": 1
}
},
"show_notification": true
}

View File

@ -0,0 +1,36 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 2,
"core_stage": 1
}
},
"C": {
"item": "ae2:spatial_cell_component_16"
},
"M": {
"tag": "forge:gems/fluix"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MOM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 2,
"core_stage": 2
}
},
"show_notification": true
}

View File

@ -0,0 +1,36 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 2,
"core_stage": 2
}
},
"C": {
"item": "ae2:spatial_cell_component_128"
},
"M": {
"item": "ae2:fluix_block"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 2,
"core_stage": 3
}
},
"show_notification": true
}

View File

@ -0,0 +1,51 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "forge:not",
"value": {
"type": "forge:mod_loaded",
"modid": "megacells"
}
}
],
"recipe": {
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 3
}
},
"C": {
"item": "ae2:cell_component_256k"
},
"M": {
"item": "minecraft:netherite_block"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"NBN",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:storage_core"
},
"show_notification": true
}
}
]
}

View File

@ -0,0 +1,38 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core"
},
"C": {
"item": "ae2:cell_component_16k"
},
"E": {
"item": "ae2:engineering_processor"
},
"L": {
"item": "ae2:logic_processor"
},
"M": {
"tag": "forge:dusts/certus_quartz"
},
"P": {
"item": "ae2:calculation_processor"
}
},
"pattern": [
"MCM",
"LBP",
"MEM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 1
}
},
"show_notification": true
}

View File

@ -0,0 +1,36 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 1
}
},
"C": {
"item": "ae2:cell_component_64k"
},
"M": {
"tag": "ae2:all_certus_quartz"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MOM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 2
}
},
"show_notification": true
}

View File

@ -0,0 +1,36 @@
{
"type": "minecraft:crafting_shaped",
"key": {
"B": {
"type": "forge:nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 2
}
},
"C": {
"item": "ae2:cell_component_256k"
},
"M": {
"item": "ae2:quartz_block"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"MOM",
"CBC",
"MCM"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:basic_core",
"nbt": {
"CustomModelData": 1,
"core_stage": 3
}
},
"show_notification": true
}

View File

@ -1,18 +1,6 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"SAS",
"QXQ",
"SBS"
],
"key": {
"S": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 8
}
},
"A": {
"item": "minecraft:nether_star"
},
@ -22,16 +10,28 @@
"Q": {
"item": "ae2:spatial_cell_component_128"
},
"S": {
"type": "forge:nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 8
}
},
"X": {
"item": "minecraft:dragon_egg"
}
},
"pattern": [
"SAS",
"QXQ",
"SBS"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"count": 1,
"nbt": {
"EAS:mult": 16
}
}
},
"show_notification": true
}

View File

@ -1,30 +1,30 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"SBS",
"QXQ",
"SBS"
],
"key": {
"S": {
"item": "ae2:speed_card"
},
"B": {
"item": "extendedae_plus:64x_crafting_accelerator"
},
"Q": {
"item": "ae2:spatial_cell_component_2"
},
"S": {
"item": "ae2:speed_card"
},
"X": {
"item": "ae2:cell_component_256k"
}
},
"pattern": [
"SBS",
"QXQ",
"SBS"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"count": 1,
"nbt": {
"EAS:mult": 2
}
}
},
"show_notification": true
}

View File

@ -1,34 +1,34 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"SBS",
"QXQ",
"SBS"
],
"key": {
"S": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 2
}
},
"B": {
"item": "extendedae_plus:256x_crafting_accelerator"
},
"Q": {
"item": "ae2:spatial_cell_component_16"
},
"S": {
"type": "forge:nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 2
}
},
"X": {
"item": "ae2:dense_energy_cell"
}
},
"pattern": [
"SBS",
"QXQ",
"SBS"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"count": 1,
"nbt": {
"EAS:mult": 4
}
}
},
"show_notification": true
}

View File

@ -1,34 +1,34 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"SBS",
"QXQ",
"SBS"
],
"key": {
"S": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 4
}
},
"B": {
"item": "extendedae_plus:1024x_crafting_accelerator"
},
"Q": {
"item": "ae2:spatial_cell_component_128"
},
"S": {
"type": "forge:nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 4
}
},
"X": {
"item": "minecraft:nether_star"
}
},
"pattern": [
"SBS",
"QXQ",
"SBS"
],
"result": {
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_card",
"count": 1,
"nbt": {
"EAS:mult": 8
}
}
},
"show_notification": true
}

View File

@ -1,33 +1,34 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"SZS",
"QXQ",
"SIS"
],
"key": {
"I": {
"item": "expatternprovider:ex_io_port"
},
"Q": {
"item": "ae2:singularity"
},
"S": {
"type": "forge:partial_nbt",
"type": "forge:nbt",
"item": "extendedae_plus:entity_speed_card",
"nbt": {
"EAS:mult": 2
}
},
"Z": {
"item": "ae2:dense_energy_cell"
},
"Q": {
"item": "ae2:singularity"
},
"X": {
"item": "minecraft:nether_star"
},
"I": {
"item": "expatternprovider:ex_io_port"
"Z": {
"item": "ae2:dense_energy_cell"
}
},
"pattern": [
"SZS",
"QXQ",
"SIS"
],
"result": {
"item": "extendedae_plus:entity_speed_ticker",
"count": 1
}
"type": "forge:partial_nbt",
"item": "extendedae_plus:entity_speed_ticker"
},
"show_notification": true
}

View File

@ -0,0 +1,30 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"B": {
"item": "minecraft:netherite_block"
},
"G": {
"item": "ae2:quartz_vibrant_glass"
},
"I": {
"item": "extendedae_plus:infinity_core"
},
"N": {
"item": "minecraft:nether_star"
},
"O": {
"item": "extendedae_plus:oblivion_singularity"
}
},
"pattern": [
"GOG",
"NIN",
"BBB"
],
"result": {
"item": "extendedae_plus:infinity_biginteger_cell"
},
"show_notification": true
}

View File

@ -0,0 +1,21 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"A": {
"item": "ae2:cell_component_256k"
},
"C": {
"item": "extendedae_plus:256x_crafting_accelerator"
}
},
"pattern": [
" ",
"ACA",
" "
],
"result": {
"item": "extendedae_plus:1024x_crafting_accelerator"
},
"show_notification": true
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"item": "ae2:crafting_accelerator"
},
{
"item": "ae2:cell_component_16k"
}
],
"result": {
"item": "extendedae_plus:16x_crafting_accelerator"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"item": "ae2:crafting_accelerator"
},
{
"item": "ae2:cell_component_256k"
}
],
"result": {
"item": "extendedae_plus:256x_crafting_accelerator"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"item": "ae2:crafting_accelerator"
},
{
"item": "ae2:cell_component_4k"
}
],
"result": {
"item": "extendedae_plus:4x_crafting_accelerator"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"item": "ae2:crafting_accelerator"
},
{
"item": "ae2:cell_component_64k"
}
],
"result": {
"item": "extendedae_plus:64x_crafting_accelerator"
}
}

View File

@ -0,0 +1,18 @@
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"ingredients": [
{
"tag": "ae2:illuminated_panel"
},
{
"tag": "ae2:pattern_provider"
},
{
"item": "ae2:network_tool"
}
],
"result": {
"item": "extendedae_plus:network_pattern_controller"
}
}

View File

@ -0,0 +1,20 @@
{
"type": "ae2:transform",
"circumstance": {
"type": "explosion"
},
"ingredients": [
{
"item": "ae2:singularity"
},
{
"item": "minecraft:nether_star"
},
{
"item": "minecraft:netherite_block"
}
],
"result": {
"item": "extendedae_plus:oblivion_singularity"
}
}

View File

@ -0,0 +1,21 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"L": {
"item": "ae2:quantum_link"
},
"R": {
"item": "ae2:quantum_ring"
}
},
"pattern": [
"RRR",
"RLR",
"RRR"
],
"result": {
"item": "extendedae_plus:wireless_transceiver"
},
"show_notification": true
}

View File

@ -2,7 +2,7 @@ package com.extendedae_plus;
import appeng.api.storage.StorageCells;
import appeng.menu.locator.MenuLocators;
import com.extendedae_plus.ae.api.storage.InfinityBigIntegerCellHandler;
import com.extendedae_plus.api.storage.InfinityBigIntegerCellHandler;
import com.extendedae_plus.client.ClientRegistrar;
import com.extendedae_plus.config.ModConfig;
import com.extendedae_plus.init.*;

View File

@ -103,13 +103,13 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
// 注册可记忆的配置YES/NO
this.getConfigManager().registerSetting(
com.extendedae_plus.ae.api.config.Settings.ACCELERATE,
com.extendedae_plus.api.config.Settings.ACCELERATE,
YesNo.YES
);
}
public boolean getAccelerateEnabled() {
return this.getConfigManager().getSetting(com.extendedae_plus.ae.api.config.Settings.ACCELERATE) == YesNo.YES;
return this.getConfigManager().getSetting(com.extendedae_plus.api.config.Settings.ACCELERATE) == YesNo.YES;
}
/**
@ -118,7 +118,7 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
* @param enabled 是否启用加速
*/
public void setAccelerateEnabled(boolean enabled) {
this.getConfigManager().putSetting(com.extendedae_plus.ae.api.config.Settings.ACCELERATE, enabled ? YesNo.YES : YesNo.NO);
this.getConfigManager().putSetting(com.extendedae_plus.api.config.Settings.ACCELERATE, enabled ? YesNo.YES : YesNo.NO);
if (menu != null) {
menu.setAccelerateEnabled(enabled);
}

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.ae.api.config;
package com.extendedae_plus.api.config;
import appeng.api.config.Setting;
import appeng.api.config.YesNo;

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.ae.api.crafting;
package com.extendedae_plus.api.crafting;
import appeng.api.crafting.IPatternDetails;
import appeng.api.stacks.AEItemKey;

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.ae.api.crafting;
package com.extendedae_plus.api.crafting;
import appeng.api.crafting.IPatternDetails;
import appeng.api.stacks.AEKey;

View File

@ -1,8 +1,8 @@
package com.extendedae_plus.ae.api.storage;
package com.extendedae_plus.api.storage;
import appeng.api.storage.cells.ICellHandler;
import appeng.api.storage.cells.ISaveProvider;
import com.extendedae_plus.ae.items.InfinityBigIntegerCellItem;
import com.extendedae_plus.items.InfinityBigIntegerCellItem;
import net.minecraft.world.item.ItemStack;
public class InfinityBigIntegerCellHandler implements ICellHandler {

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.ae.api.storage;
package com.extendedae_plus.api.storage;
import appeng.api.config.Actionable;
import appeng.api.networking.security.IActionSource;
@ -10,7 +10,7 @@ import appeng.api.storage.cells.ISaveProvider;
import appeng.api.storage.cells.StorageCell;
import appeng.core.AELog;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.ae.items.InfinityBigIntegerCellItem;
import com.extendedae_plus.items.InfinityBigIntegerCellItem;
import com.extendedae_plus.util.storage.InfinityConstants;
import com.extendedae_plus.util.storage.InfinityDataStorage;
import com.extendedae_plus.util.storage.InfinityStorageManager;
@ -42,10 +42,13 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
// 存储的物品种类数量
private int totalAEKeyType;
// 存储的物品总数
private BigInteger totalAEKey2Amounts = BigInteger.ZERO;
private BigInteger totalAEKey2Amounts = BI_ZERO;
// 标记是否已持久化到 SavedData
private boolean isPersisted = true;
private static final BigInteger BI_ZERO = BigInteger.ZERO;
private static final BigInteger BI_LONG_MAX = BigInteger.valueOf(Long.MAX_VALUE);
public InfinityBigIntegerCellInventory(InfinityBigIntegerCellItem cell, ItemStack stack, ISaveProvider saveProvider) {
// 保存存储单元类型InfinityBigIntegerCellItem 实例用于访问磁盘属性
@ -93,15 +96,16 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
private void initData() {
// 如果磁盘有 UUID加载存储的物品数据
if (hasUUID()) {
this.totalAEKeyType = getCellStorage().amounts.size();
this.totalAEKey2Amounts = getCellStorage().itemCount.equals(BigInteger.ZERO) ?
BigInteger.ZERO :
getCellStorage().itemCount;
InfinityDataStorage storage = getCellStorage();
this.totalAEKeyType = storage.amounts.size();
this.totalAEKey2Amounts = storage.itemCount.equals(BI_ZERO) ?
BI_ZERO :
storage.itemCount;
} else {
// 否则初始化为空
this.totalAEKeyType = 0;
this.totalAEKey2Amounts = BigInteger.ZERO;
this.totalAEKey2Amounts = BI_ZERO;
// 加载物品数据
getCellStoredMap();
}
@ -111,7 +115,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
@Override
public CellState getStatus() {
// 如果没有存储任何物品返回空状态
if (this.getTotalAEKey2Amounts().equals(BigInteger.ZERO)) {
if (this.getTotalAEKey2Amounts().equals(BI_ZERO)) {
return CellState.EMPTY;
}
// 否则返回满状态
@ -130,7 +134,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
if (this.isPersisted)
return;
if (totalAEKey2Amounts.equals(BigInteger.ZERO)) {
if (totalAEKey2Amounts.equals(BI_ZERO)) {
if (hasUUID()) {
getStorageManagerInstance().removeCell(getUUID());
if (self.hasTag()) {
@ -152,12 +156,12 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
// 创建物品数量列表
ListTag amounts = new ListTag();
// 初始化物品总数
BigInteger itemCount = BigInteger.ZERO;
BigInteger itemCount = BI_ZERO;
for (var entry : this.AEKey2AmountsMap.object2ObjectEntrySet()) {
BigInteger amount = entry.getValue();
// 如果数量大于 0添加到键和数量列表
if (amount.compareTo(BigInteger.ZERO) > 0) {
if (amount.compareTo(BI_ZERO) > 0) {
keys.add(entry.getKey().toTagGeneric());
CompoundTag amountTag = new CompoundTag();
amountTag.putByteArray("value", amount.toByteArray());
@ -233,7 +237,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
// 获取或初始化存储映射
private Object2ObjectMap<AEKey, BigInteger> getCellStoredMap() {
if (AEKey2AmountsMap == null) {
AEKey2AmountsMap = new Object2ObjectOpenHashMap<>();
AEKey2AmountsMap = new Object2ObjectOpenHashMap<>(512, 0.6f);
this.loadCellStoredMap();
}
return AEKey2AmountsMap;
@ -242,30 +246,39 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
// 获取所有可用的物品堆栈及其数量
@Override
public void getAvailableStacks(KeyCounter out) {
BigInteger maxLong = BigInteger.valueOf(Long.MAX_VALUE);
if(this.getCellStoredMap() == null) return;
for (var entry : this.getCellStoredMap().object2ObjectEntrySet()) {
AEKey key = entry.getKey();
BigInteger value = entry.getValue();
var map = getCellStoredMap();
if (map == null || map.isEmpty()) {
return;
}
// 获取 KeyCounter 中已有的值
for (var entry : map.object2ObjectEntrySet()) {
AEKey key = entry.getKey();
BigInteger amount = entry.getValue();
// 如果当前要添加的数量本身就超过 Long.MAX_VALUE直接设为 MAX
if (amount.compareTo(BI_LONG_MAX) > 0) {
out.set(key, Long.MAX_VALUE);
continue;
}
long addAmount = amount.longValue();
long existing = out.get(key);
// 计算总和并限制到 Long.MAX_VALUE
BigInteger sum = BigInteger.valueOf(existing).add(value);
long toSet = sum.compareTo(maxLong) > 0 ? Long.MAX_VALUE : sum.longValue();
// 更新 KeyCounter
// 如果已有值已是 MAX直接跳过
if (existing == Long.MAX_VALUE) {
continue;
}
long delta = toSet - existing;
if (delta != 0) {
out.add(key, delta);
// 计算总和防止溢出
long sum = existing + addAmount;
if (sum < 0 || sum < existing) { // 溢出检测
out.set(key, Long.MAX_VALUE);
} else {
out.add(key, addAmount); // 安全添加
}
}
}
// 从存储中加载物品映射
private void loadCellStoredMap() {
boolean dataCorruption = false;
@ -282,7 +295,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
AEKey key = AEKey.fromTagGeneric(keys.getCompound(i));
BigInteger amount = new BigInteger(amounts.getCompound(i).getByteArray("value"));
// 检查数据是否损坏
if (amount.compareTo(BigInteger.ZERO) <= 0 || key == null) {
if (amount.compareTo(BI_ZERO) <= 0 || key == null) {
dataCorruption = true;
} else {
AEKey2AmountsMap.put(key, amount);
@ -303,7 +316,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
// 更新存储的物品种类数量
this.totalAEKeyType = this.AEKey2AmountsMap.size();
// 重置物品总数
this.totalAEKey2Amounts = BigInteger.ZERO;
this.totalAEKey2Amounts = BI_ZERO;
// 计算物品总数
for (BigInteger AEKey2Amounts : this.AEKey2AmountsMap.values()) {
this.totalAEKey2Amounts = this.totalAEKey2Amounts.add(AEKey2Amounts);
@ -341,7 +354,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
loadCellStoredMap();
}
// 获取当前物品数量
BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BigInteger.ZERO);
BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BI_ZERO);
if (mode == Actionable.MODULATE) {
// 实际插入更新数量并保存
@ -355,9 +368,9 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
// 从存储单元提取物品
@Override
public long extract(AEKey what, long amount, Actionable mode, IActionSource source) {
BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BigInteger.ZERO);
BigInteger currentAmount = this.getCellStoredMap().getOrDefault(what, BI_ZERO);
// 如果有物品可提取
if (currentAmount.compareTo(BigInteger.ZERO) > 0) {
if (currentAmount.compareTo(BI_ZERO) > 0) {
BigInteger requested = BigInteger.valueOf(amount);
@ -367,7 +380,7 @@ public class InfinityBigIntegerCellInventory implements StorageCell {
getCellStoredMap().remove(what);
this.saveChanges();
}
return currentAmount.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0 ? Long.MAX_VALUE : currentAmount.longValue();
return currentAmount.compareTo(BI_LONG_MAX) > 0 ? Long.MAX_VALUE : currentAmount.longValue();
} else {
// 提取部分数量
if (mode == Actionable.MODULATE) {

View File

@ -3,7 +3,6 @@ package com.extendedae_plus.client;
import appeng.client.render.crafting.CraftingCubeModel;
import appeng.init.client.InitScreens;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.ae.definitions.upgrades.EntitySpeedCardItem;
import com.extendedae_plus.ae.menu.EntitySpeedTickerMenu;
import com.extendedae_plus.ae.screen.EntitySpeedTickerScreen;
import com.extendedae_plus.client.render.crafting.EPlusCraftingCubeModelProvider;
@ -12,6 +11,7 @@ import com.extendedae_plus.content.crafting.EPlusCraftingUnitType;
import com.extendedae_plus.hooks.BuiltInModelHooks;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.init.ModMenuTypes;
import com.extendedae_plus.items.materials.EntitySpeedCardItem;
import net.minecraft.client.gui.screens.MenuScreens;
import net.minecraft.client.renderer.item.ItemProperties;

View File

@ -1,9 +1,8 @@
package com.extendedae_plus.content.crafting;
import appeng.block.crafting.ICraftingUnitType;
import net.minecraft.world.item.Item;
import com.extendedae_plus.init.ModItems;
import net.minecraft.world.item.Item;
public enum EPlusCraftingUnitType implements ICraftingUnitType {
ACCELERATOR_4x(0, 4),
@ -34,11 +33,11 @@ public enum EPlusCraftingUnitType implements ICraftingUnitType {
@Override
public Item getItemFromType() {
return switch (this) {
case ACCELERATOR_4x -> ModItems.ACCELERATOR_4x.get();
case ACCELERATOR_16x -> ModItems.ACCELERATOR_16x.get();
case ACCELERATOR_64x -> ModItems.ACCELERATOR_64x.get();
case ACCELERATOR_256x -> ModItems.ACCELERATOR_256x.get();
case ACCELERATOR_1024x -> ModItems.ACCELERATOR_1024x.get();
case ACCELERATOR_4x -> ModItems.CRAFTING_ACCELERATOR_4x.get();
case ACCELERATOR_16x -> ModItems.CRAFTING_ACCELERATOR_16x.get();
case ACCELERATOR_64x -> ModItems.CRAFTING_ACCELERATOR_64x.get();
case ACCELERATOR_256x -> ModItems.CRAFTING_ACCELERATOR_256x.get();
case ACCELERATOR_1024x -> ModItems.CRAFTING_ACCELERATOR_1024x.get();
};
}
}

View File

@ -1,8 +1,8 @@
package com.extendedae_plus.content.wireless;
import com.extendedae_plus.ae.items.ChannelCardItem;
import com.extendedae_plus.init.ModBlockEntities;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.items.materials.ChannelCardItem;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
@ -11,6 +11,7 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
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;
@ -154,6 +155,21 @@ public class WirelessTransceiverBlock extends Block implements EntityBlock {
super.onRemove(state, level, pos, newState, isMoving);
}
@Override
public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) {
// 基础挖掘进度
float baseProgress = super.getDestroyProgress(state, player, level, pos);
// 获取方块实体并检查锁定状态
if (level.getBlockEntity(pos) instanceof WirelessTransceiverBlockEntity te) {
if (te.isLocked()) {
// 如果被锁定大幅降低挖掘速度
return baseProgress * 0.1f; // 只有10%的挖掘速度
}
}
return baseProgress; // 正常挖掘速度
}
@Override
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> type) {
if (level.isClientSide) return null;

View File

@ -0,0 +1,527 @@
package com.extendedae_plus.datagen;
import appeng.core.definitions.AEBlocks;
import appeng.core.definitions.AEItems;
import appeng.datagen.providers.tags.ConventionTags;
import appeng.recipes.transform.TransformCircumstance;
import appeng.recipes.transform.TransformRecipeBuilder;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.items.BasicCoreItem;
import com.extendedae_plus.items.materials.EntitySpeedCardItem;
import com.extendedae_plus.util.ModCheckUtils;
import com.glodblock.github.appflux.common.AFItemAndBlock;
import com.glodblock.github.appflux.util.AFTags;
import com.glodblock.github.extendedae.common.EPPItemAndBlock;
import gripe._90.megacells.definition.MEGAItems;
import net.minecraft.data.PackOutput;
import net.minecraft.data.recipes.*;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks;
import net.pedroksl.advanced_ae.common.definitions.AAEBlocks;
import net.pedroksl.advanced_ae.common.definitions.AAEFluids;
import net.pedroksl.advanced_ae.common.definitions.AAEItems;
import net.pedroksl.advanced_ae.recipes.ReactionChamberRecipeBuilder;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
public class CraftingRecipes extends RecipeProvider {
public CraftingRecipes(PackOutput output) {
super(output);
}
@Override
public void buildRecipes(@NotNull Consumer<FinishedRecipe> consumer) {
addCraftingAccelerators(consumer);
addCardRecipes(consumer);
addCoreRecipes(consumer);
addTransformRecipes(consumer);
addReactionChamberRecipes(consumer);
// 吞噬盘
ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.INFINITY_BIGINTEGER_CELL.get())
.pattern("GOG")
.pattern("NIN")
.pattern("BBB")
.define('G', AEBlocks.QUARTZ_VIBRANT_GLASS)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('I', ModItems.INFINITY_CORE.get())
.define('B', Items.NETHERITE_BLOCK)
.unlockedBy("has_oblivion_singularity", has(ModItems.OBLIVION_SINGULARITY.get()))
.save(consumer);
// 状态控制器
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.NETWORK_PATTERN_CONTROLLER.get())
.requires(ConventionTags.ILLUMINATED_PANEL)
.requires(ConventionTags.PATTERN_PROVIDER)
.requires(AEItems.NETWORK_TOOL)
.unlockedBy("has_network_tool", has(AEItems.NETWORK_TOOL))
.unlockedBy("has_pattern_provider", has(ConventionTags.PATTERN_PROVIDER))
.save(consumer);
// 无线收发器
ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.WIRELESS_TRANSCEIVER.get())
.pattern("RRR")
.pattern("RLR")
.pattern("RRR")
.define('R', AEBlocks.QUANTUM_RING)
.define('L', AEBlocks.QUANTUM_LINK)
.unlockedBy("has_quantum_ring", has(AEBlocks.QUANTUM_RING))
.save(consumer);
// 实体加速器
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.ENTITY_TICKER_PART_ITEM.get())
.pattern("SZS")
.pattern("QXQ")
.pattern("SIS")
.defineNbt('S', EntitySpeedCardItem.withMultiplier(2))
.define('Z', AEBlocks.DENSE_ENERGY_CELL)
.define('Q', AEItems.SINGULARITY)
.define('X', Items.NETHER_STAR)
.define('I', EPPItemAndBlock.EX_IO_PORT)
.unlockedBy("has_entity_speed_card_x2", has(EntitySpeedCardItem.withMultiplier(2).getItem()))
.unlockedBy("has_singularity", has(AEItems.SINGULARITY))
.save(consumer);
// 上传核心
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.ASSEMBLER_MATRIX_UPLOAD_CORE.get())
.requires(EPPItemAndBlock.ASSEMBLER_MATRIX_WALL)
.requires(Items.LEVER)
.unlockedBy("has_assembler_matrix_wall", has(EPPItemAndBlock.ASSEMBLER_MATRIX_WALL))
.save(consumer);
}
private void addCraftingAccelerators(Consumer<FinishedRecipe> consumer) {
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.CRAFTING_ACCELERATOR_4x.get())
.requires(AEBlocks.CRAFTING_ACCELERATOR)
.requires(AEItems.CELL_COMPONENT_4K)
.unlockedBy("has_accelerator", has(AEBlocks.CRAFTING_ACCELERATOR))
.save(consumer, ExtendedAEPlus.id("network/crafting/" + ModItems.CRAFTING_ACCELERATOR_4x.get().toString().toLowerCase()));
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.CRAFTING_ACCELERATOR_16x.get())
.requires(AEBlocks.CRAFTING_ACCELERATOR)
.requires(AEItems.CELL_COMPONENT_16K)
.unlockedBy("has_accelerator", has(AEBlocks.CRAFTING_ACCELERATOR))
.save(consumer, ExtendedAEPlus.id("network/crafting/" + ModItems.CRAFTING_ACCELERATOR_16x.get().toString().toLowerCase()));
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.CRAFTING_ACCELERATOR_64x.get())
.requires(AEBlocks.CRAFTING_ACCELERATOR)
.requires(AEItems.CELL_COMPONENT_64K)
.unlockedBy("has_accelerator", has(AEBlocks.CRAFTING_ACCELERATOR))
.save(consumer, ExtendedAEPlus.id("network/crafting/" + ModItems.CRAFTING_ACCELERATOR_64x.get().toString().toLowerCase()));
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.CRAFTING_ACCELERATOR_256x.get())
.requires(AEBlocks.CRAFTING_ACCELERATOR)
.requires(AEItems.CELL_COMPONENT_256K)
.unlockedBy("has_accelerator", has(AEBlocks.CRAFTING_ACCELERATOR))
.save(consumer, ExtendedAEPlus.id("network/crafting/" + ModItems.CRAFTING_ACCELERATOR_256x.get().toString().toLowerCase()));
ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.CRAFTING_ACCELERATOR_1024x.get())
.pattern(" ")
.pattern("ACA")
.pattern(" ")
.define('A', AEItems.CELL_COMPONENT_256K)
.define('C', ModItems.CRAFTING_ACCELERATOR_256x.get())
.unlockedBy("has_256x", has(ModItems.CRAFTING_ACCELERATOR_256x.get()))
.save(consumer, ExtendedAEPlus.id("network/crafting/" + ModItems.CRAFTING_ACCELERATOR_1024x.get().toString().toLowerCase()));
}
private void addCardRecipes(Consumer<FinishedRecipe> consumer) {
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.CHANNEL_CARD.get())
.requires(AEItems.ADVANCED_CARD)
.requires(ModItems.WIRELESS_TRANSCEIVER.get())
.unlockedBy("has_advanced_card", has(AEItems.ADVANCED_CARD))
.save(consumer);
// 2x Entity Speed Card
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, EntitySpeedCardItem.withMultiplier(2))
.pattern("SBS")
.pattern("QXQ")
.pattern("SBS")
.define('S', AEItems.SPEED_CARD)
.define('B', ModItems.CRAFTING_ACCELERATOR_64x.get())
.define('Q', AEItems.SPATIAL_2_CELL_COMPONENT)
.define('X', AEItems.CELL_COMPONENT_256K)
.unlockedBy("has_speed_card", has(AEItems.SPEED_CARD))
.unlockedBy("has_64x_accelerator", has(ModItems.CRAFTING_ACCELERATOR_64x.get()))
.save(consumer, ExtendedAEPlus.id("entity_speed_card_2x"));
// 4x Entity Speed Card
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, EntitySpeedCardItem.withMultiplier(4))
.pattern("SBS")
.pattern("QXQ")
.pattern("SBS")
.defineNbt('S', EntitySpeedCardItem.withMultiplier(2))
.define('B', ModItems.CRAFTING_ACCELERATOR_256x.get())
.define('Q', AEItems.SPATIAL_16_CELL_COMPONENT)
.define('X', AEBlocks.DENSE_ENERGY_CELL)
.unlockedBy("has_entity_speed_card_2x", has(EntitySpeedCardItem.withMultiplier(2).getItem()))
.save(consumer, ExtendedAEPlus.id("entity_speed_card_4x"));
// 8x Entity Speed Card
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, EntitySpeedCardItem.withMultiplier(8))
.pattern("SBS")
.pattern("QXQ")
.pattern("SBS")
.defineNbt('S', EntitySpeedCardItem.withMultiplier(4))
.define('B', ModItems.CRAFTING_ACCELERATOR_1024x.get())
.define('Q', AEItems.SPATIAL_128_CELL_COMPONENT)
.define('X', Items.NETHER_STAR)
.unlockedBy("has_entity_speed_card_4x", has(EntitySpeedCardItem.withMultiplier(4).getItem()))
.save(consumer, ExtendedAEPlus.id("entity_speed_card_8x"));
// 16x Entity Speed Card
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC,
EntitySpeedCardItem.withMultiplier(16))
.pattern("SAS")
.pattern("QXQ")
.pattern("SBS")
.defineNbt('S', EntitySpeedCardItem.withMultiplier(8))
.define('A', Items.NETHER_STAR)
.define('Q', AEItems.SPATIAL_128_CELL_COMPONENT)
.define('X', Items.DRAGON_EGG)
.define('B', Blocks.BEACON)
.unlockedBy("has_entity_speed_card_8x", has(EntitySpeedCardItem.withMultiplier(8).getItem()))
.save(consumer, ExtendedAEPlus.id("entity_speed_card_16x"));
}
private void addCoreRecipes(Consumer<FinishedRecipe> consumer) {
// 基础核心配方
ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.BASIC_CORE.get())
.pattern("ABA")
.pattern("CDE")
.pattern("AFA")
.define('A', Items.NETHERITE_BLOCK)
.define('B', Items.NETHER_STAR)
.define('C', AEItems.LOGIC_PROCESSOR)
.define('D', AEItems.FLUIX_PEARL)
.define('E', AEItems.ENGINEERING_PROCESSOR)
.define('F', AEItems.CALCULATION_PROCESSOR)
.unlockedBy("has_nether_star", has(Items.NETHER_STAR))
.save(consumer, ExtendedAEPlus.id("core/basic_core"));
ItemStack base = BasicCoreItem.of(null, 0); // 未定型核心
// ====================== STORAGE LINE ======================
// storage_1
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.storageStage(1))
.pattern("MCM")
.pattern("LBP")
.pattern("MEM")
.define('M', ConventionTags.CERTUS_QUARTZ_DUST)
.define('C', AEItems.CELL_COMPONENT_16K)
.define('L', AEItems.LOGIC_PROCESSOR)
.defineNbt('B', base)
.define('P', AEItems.CALCULATION_PROCESSOR)
.define('E', AEItems.ENGINEERING_PROCESSOR)
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.save(consumer, ExtendedAEPlus.id("core/storage_core_1"));
// storage_2
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.storageStage(2))
.pattern("MOM")
.pattern("CBC")
.pattern("MOM")
.define('M', ConventionTags.ALL_CERTUS_QUARTZ)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AEItems.CELL_COMPONENT_64K)
.defineNbt('B', BasicCoreItem.storageStage(1))
.unlockedBy("has_storage_stage_1", has(BasicCoreItem.storageStage(1).getItem()))
.save(consumer, ExtendedAEPlus.id("core/storage_core_2"));
// storage_3
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.storageStage(3))
.pattern("MOM")
.pattern("CBC")
.pattern("MCM")
.define('M', AEBlocks.QUARTZ_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AEItems.CELL_COMPONENT_256K)
.defineNbt('B', BasicCoreItem.storageStage(2))
.unlockedBy("has_storage_stage_2", has(BasicCoreItem.storageStage(2).getItem()))
.save(consumer, ExtendedAEPlus.id("core/storage_core_3"));
// ====================== SPATIAL LINE ======================
// spatial_1
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.spatialStage(1))
.pattern("MCM")
.pattern("LBP")
.pattern("MEM")
.define('M', ConventionTags.FLUIX_DUST)
.define('C', AEItems.SPATIAL_2_CELL_COMPONENT)
.define('L', AEItems.LOGIC_PROCESSOR)
.defineNbt('B', base)
.define('P', AEItems.CALCULATION_PROCESSOR)
.define('E', AEItems.ENGINEERING_PROCESSOR)
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.save(consumer, ExtendedAEPlus.id("core/spatial_core_1"));
// spatial_2
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.spatialStage(2))
.pattern("MOM")
.pattern("CBC")
.pattern("MOM")
.define('M', ConventionTags.FLUIX_CRYSTAL)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AEItems.SPATIAL_16_CELL_COMPONENT)
.defineNbt('B', BasicCoreItem.spatialStage(1))
.unlockedBy("has_spatial_stage_1", has(BasicCoreItem.spatialStage(1).getItem()))
.save(consumer, ExtendedAEPlus.id("core/spatial_core_2"));
// spatial_3
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.spatialStage(3))
.pattern("MOM")
.pattern("CBC")
.pattern("MCM")
.define('M', AEBlocks.FLUIX_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AEItems.SPATIAL_128_CELL_COMPONENT)
.defineNbt('B', BasicCoreItem.spatialStage(2))
.unlockedBy("has_spatial_stage_2", has(BasicCoreItem.spatialStage(2).getItem()))
.save(consumer, ExtendedAEPlus.id("core/spatial_core_3"));
// ====================== ENERGY LINE (依赖 AppFlux) ======================
// energy_storage_1
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.energyStage(1))
.pattern("MCM")
.pattern("EBE")
.pattern("MEM")
.define('M', AFTags.REDSTONE_GEM)
.define('C', AFItemAndBlock.CORE_16k)
.define('E', AFItemAndBlock.ENERGY_PROCESSOR)
.defineNbt('B', base)
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.save(consumer, ExtendedAEPlus.id("core/energy_storage_core_1"));
// energy_storage_2
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.energyStage(2))
.pattern("MOM")
.pattern("CBC")
.pattern("MOM")
.define('M', AFItemAndBlock.CHARGED_REDSTONE)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AFItemAndBlock.CORE_64k)
.defineNbt('B', BasicCoreItem.energyStage(1))
.unlockedBy("has_energy_stage_1", has(BasicCoreItem.energyStage(1).getItem()))
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.save(consumer, ExtendedAEPlus.id("core/energy_storage_core_2"));
// energy_storage_3
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.energyStage(3))
.pattern("MOM")
.pattern("CBC")
.pattern("MCM")
.define('M', AFTags.SKY_RESIN_INGOT)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AFItemAndBlock.CORE_256k)
.defineNbt('B', BasicCoreItem.energyStage(2))
.unlockedBy("has_energy_stage_2", has(BasicCoreItem.energyStage(2).getItem()))
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.save(consumer, ExtendedAEPlus.id("core/energy_storage_core_3"));
// ====================== QUANTUM LINE (依赖 Advanced AE) ======================
// quantum_storage_1
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.quantumStage(1))
.pattern("MCM")
.pattern("EBE")
.pattern("MEM")
.define('M', AAEItems.QUANTUM_ALLOY)
.define('C', AAEItems.QUANTUM_STORAGE_COMPONENT)
.define('E', AAEItems.QUANTUM_PROCESSOR)
.defineNbt('B', base)
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.requiresMod(ModCheckUtils.MODID_AAE)
.save(consumer, ExtendedAEPlus.id("core/quantum_storage_core_1"));
// quantum_storage_2
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.quantumStage(2))
.pattern("MOM")
.pattern("CBC")
.pattern("MOM")
.define('M', AAEBlocks.QUANTUM_ALLOY_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AAEItems.QUANTUM_STORAGE_COMPONENT)
.defineNbt('B', BasicCoreItem.quantumStage(1))
.unlockedBy("has_quantum_stage_1", has(BasicCoreItem.quantumStage(1).getItem()))
.requiresMod(ModCheckUtils.MODID_AAE)
.save(consumer, ExtendedAEPlus.id("core/quantum_storage_core_2"));
// quantum_storage_3
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, BasicCoreItem.quantumStage(3))
.pattern("MOM")
.pattern("CBC")
.pattern("MCM")
.define('M', AAEItems.QUANTUM_ALLOY_PLATE)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', AAEBlocks.QUANTUM_STORAGE_128M)
.defineNbt('B', BasicCoreItem.quantumStage(2))
.unlockedBy("has_quantum_stage_2", has(BasicCoreItem.quantumStage(2).getItem()))
.requiresMod(ModCheckUtils.MODID_AAE)
.save(consumer, ExtendedAEPlus.id("core/quantum_storage_core_3"));
// storage_core
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.STORAGE_CORE.get())
.pattern("MOM")
.pattern("NBN")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('C', AEItems.CELL_COMPONENT_256K)
.defineNbt('B', BasicCoreItem.storageStage(3))
.unlockedBy("has_storage_stage_3", has(BasicCoreItem.storageStage(3).getItem()))
.notRequiresMod(ModCheckUtils.MODID_MEGA)
.save(consumer, ExtendedAEPlus.id("core/" + ModItems.STORAGE_CORE.get().toString().toLowerCase()));
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.STORAGE_CORE.get())
.pattern("MOM")
.pattern("NBN")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('C', MEGAItems.CELL_COMPONENT_256M)
.defineNbt('B', BasicCoreItem.storageStage(3))
.unlockedBy("has_storage_stage_3", has(BasicCoreItem.storageStage(3).getItem()))
.requiresMod(ModCheckUtils.MODID_MEGA)
.save(consumer, ExtendedAEPlus.id("core/compat/" + ModItems.STORAGE_CORE.get().toString().toLowerCase()));
// spatial_core
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.SPATIAL_CORE.get())
.pattern("MOM")
.pattern("NBN")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('C', AEItems.SPATIAL_128_CELL_COMPONENT)
.defineNbt('B', BasicCoreItem.spatialStage(3))
.unlockedBy("has_spatial_stage_3", has(BasicCoreItem.spatialStage(3).getItem()))
.save(consumer, ExtendedAEPlus.id("core/" + ModItems.SPATIAL_CORE.get().toString().toLowerCase()));
// energy_storage_core
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.ENERGY_STORAGE_CORE.get())
.pattern("MOM")
.pattern("NBN")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('C', AFItemAndBlock.CORE_256k)
.defineNbt('B', BasicCoreItem.energyStage(3))
.unlockedBy("has_energy_stage_3", has(BasicCoreItem.energyStage(3).getItem()))
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.notRequiresMod(ModCheckUtils.MODID_MEGA)
.save(consumer, ExtendedAEPlus.id("core/" + ModItems.ENERGY_STORAGE_CORE.get().toString().toLowerCase()));
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.ENERGY_STORAGE_CORE.get())
.pattern("MOM")
.pattern("NBN")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('C', AFItemAndBlock.CORE_256M)
.defineNbt('B', BasicCoreItem.energyStage(3))
.unlockedBy("has_energy_stage_3", has(BasicCoreItem.energyStage(3).getItem()))
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.requiresMod(ModCheckUtils.MODID_MEGA)
.save(consumer, ExtendedAEPlus.id("core/compat/" + ModItems.ENERGY_STORAGE_CORE.get().toString().toLowerCase()));
// quantum_storage_core
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.QUANTUM_STORAGE_CORE.get())
.pattern("MOM")
.pattern("NBN")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('N', Items.NETHER_STAR)
.define('C', AAEBlocks.QUANTUM_STORAGE_256M)
.defineNbt('B', BasicCoreItem.quantumStage(3))
.unlockedBy("has_quantum_stage_3", has(BasicCoreItem.quantumStage(3).getItem()))
.requiresMod(ModCheckUtils.MODID_AAE)
.save(consumer, ExtendedAEPlus.id("core/" + ModItems.QUANTUM_STORAGE_CORE.get().toString().toLowerCase()));
// infinity_core
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.INFINITY_CORE.get())
.pattern("MNM")
.pattern("SOS")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('N', Items.NETHER_STAR)
.define('S', ModItems.STORAGE_CORE.get())
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('C', ModItems.SPATIAL_CORE.get())
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.notRequiresMod(ModCheckUtils.MODID_APPFLUX)
.notRequiresMod(ModCheckUtils.MODID_AAE)
.save(consumer, ExtendedAEPlus.id("core/" + ModItems.INFINITY_CORE.get().toString().toLowerCase()));
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.INFINITY_CORE.get())
.pattern("MNM")
.pattern("SOE")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('N', Items.NETHER_STAR)
.define('S', ModItems.STORAGE_CORE.get())
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('E', ModItems.ENERGY_STORAGE_CORE.get())
.define('C', ModItems.SPATIAL_CORE.get())
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.notRequiresMod(ModCheckUtils.MODID_AAE)
.save(consumer, ExtendedAEPlus.id("core/compat/" + ModItems.INFINITY_CORE.get().toString().toLowerCase() + "_1"));
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.INFINITY_CORE.get())
.pattern("MNM")
.pattern("SOQ")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('N', Items.NETHER_STAR)
.define('S', ModItems.STORAGE_CORE.get())
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('Q', ModItems.QUANTUM_STORAGE_CORE.get())
.define('C', ModItems.SPATIAL_CORE.get())
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.requiresMod(ModCheckUtils.MODID_AAE)
.notRequiresMod(ModCheckUtils.MODID_APPFLUX)
.save(consumer, ExtendedAEPlus.id("core/compat/" + ModItems.INFINITY_CORE.get().toString().toLowerCase() + "_2"));
NBTShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.INFINITY_CORE.get())
.pattern("MQM")
.pattern("SOE")
.pattern("MCM")
.define('M', Items.NETHERITE_BLOCK)
.define('Q', ModItems.QUANTUM_STORAGE_CORE.get())
.define('S', ModItems.STORAGE_CORE.get())
.define('O', ModItems.OBLIVION_SINGULARITY.get())
.define('E', ModItems.ENERGY_STORAGE_CORE.get())
.define('C', ModItems.SPATIAL_CORE.get())
.unlockedBy("has_basic_core", has(ModItems.BASIC_CORE.get()))
.requiresMod(ModCheckUtils.MODID_AAE)
.requiresMod(ModCheckUtils.MODID_APPFLUX)
.save(consumer, ExtendedAEPlus.id("core/compat/" + ModItems.INFINITY_CORE.get().toString().toLowerCase() + "_3"));
}
private void addTransformRecipes(Consumer<FinishedRecipe> consumer) {
TransformRecipeBuilder.transform(consumer,
ExtendedAEPlus.id("transform/" + ModItems.OBLIVION_SINGULARITY.get().toString().toLowerCase()),
ModItems.OBLIVION_SINGULARITY.get(), 1,
TransformCircumstance.EXPLOSION,
AEItems.SINGULARITY, Items.NETHER_STAR, Items.NETHERITE_BLOCK
);
}
private void addReactionChamberRecipes(Consumer<FinishedRecipe> consumer) {
ReactionChamberRecipeBuilder.react(ModItems.OBLIVION_SINGULARITY.get(), 1, 100000)
.input(AEItems.SINGULARITY, 2)
.input(Items.NETHER_STAR, 1)
.input(AAEItems.QUANTUM_ALLOY_PLATE, 4)
.fluid(AAEFluids.QUANTUM_INFUSION.source(), 2000)
.save(consumer, ModItems.OBLIVION_SINGULARITY.get().toString().toLowerCase());
}
}

View File

@ -0,0 +1,21 @@
package com.extendedae_plus.datagen;
import com.extendedae_plus.ExtendedAEPlus;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class DataGenerators {
@SubscribeEvent
public static void onGatherData(GatherDataEvent event) {
DataGenerator generator = event.getGenerator();
ExistingFileHelper helper = event.getExistingFileHelper();
// 仅添加配方生成器
generator.addProvider(true, new CraftingRecipes(generator.getPackOutput()));
}
}

View File

@ -0,0 +1,295 @@
package com.extendedae_plus.datagen;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.CriterionTriggerInstance;
import net.minecraft.advancements.RequirementsStrategy;
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
import net.minecraft.data.recipes.CraftingRecipeBuilder;
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.nbt.*;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingBookCategory;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.ItemLike;
import net.minecraftforge.common.crafting.ConditionalRecipe;
import net.minecraftforge.common.crafting.conditions.ICondition;
import net.minecraftforge.common.crafting.conditions.ModLoadedCondition;
import net.minecraftforge.common.crafting.conditions.NotCondition;
import net.minecraftforge.registries.ForgeRegistries;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.*;
import java.util.function.Consumer;
public class NBTShapedRecipeBuilder extends CraftingRecipeBuilder implements RecipeBuilder {
private final RecipeCategory category;
private final ItemStack result;
private final List<String> rows = Lists.newArrayList();
private final Map<Character, JsonObject> key = Maps.newLinkedHashMap();
private final Advancement.Builder advancement = Advancement.Builder.recipeAdvancement();
private final List<ICondition> conditions = new ArrayList<>();
@Nullable private String group;
private boolean showNotification = true;
private NBTShapedRecipeBuilder(RecipeCategory category, ItemStack result) {
this.category = category;
this.result = result;
}
public static NBTShapedRecipeBuilder shaped(RecipeCategory category, ItemStack result) {
return new NBTShapedRecipeBuilder(category, result);
}
public static NBTShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result) {
return shaped(category, new ItemStack(result));
}
public static NBTShapedRecipeBuilder shaped(RecipeCategory category, ItemLike result, int count) {
return shaped(category, new ItemStack(result, count));
}
/** 普通物品 */
public NBTShapedRecipeBuilder define(Character symbol, ItemLike item) {
JsonObject json = new JsonObject();
json.addProperty("item", Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item.asItem())).toString());
this.key.put(symbol, json);
return this;
}
public NBTShapedRecipeBuilder define(Character symbol, TagKey<Item> tag) {
JsonObject json = new JsonObject();
json.addProperty("tag", tag.location().toString());
this.key.put(symbol, json);
return this;
}
/** forge:nbt 输入(无 count结构化 NBT */
public NBTShapedRecipeBuilder defineNbt(Character symbol, ItemStack stackWithNbt) {
JsonObject json = new JsonObject();
json.addProperty("type", "forge:nbt");
json.addProperty("item", Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(stackWithNbt.getItem())).toString());
if (stackWithNbt.hasTag() && stackWithNbt.getTag() != null) {
json.add("nbt", nbtToJson(stackWithNbt.getTag()));
}
this.key.put(symbol, json);
return this;
}
public NBTShapedRecipeBuilder pattern(String pattern) {
if (!this.rows.isEmpty() && pattern.length() != this.rows.get(0).length()) {
throw new IllegalArgumentException("Pattern must be the same width");
}
this.rows.add(pattern);
return this;
}
public @NotNull NBTShapedRecipeBuilder unlockedBy(@NotNull String name, @NotNull CriterionTriggerInstance criterion) {
this.advancement.addCriterion(name, criterion);
return this;
}
public @NotNull NBTShapedRecipeBuilder group(@Nullable String group) {
this.group = group;
return this;
}
public NBTShapedRecipeBuilder showNotification(boolean show) {
this.showNotification = show;
return this;
}
/** 添加 Forge 条件 */
public NBTShapedRecipeBuilder condition(ICondition condition) {
this.conditions.add(Objects.requireNonNull(condition));
return this;
}
/** 便捷mod loaded 条件 */
public NBTShapedRecipeBuilder requiresMod(String modid) {
return condition(new ModLoadedCondition(modid));
}
/** NOT 条件mod 未加载时生效 */
public NBTShapedRecipeBuilder notRequiresMod(String modid) {
return condition(new NotCondition(new ModLoadedCondition(modid)));
}
@Override
public @NotNull Item getResult() {
return this.result.getItem();
}
// === save 方法重载 ===
@Override
public void save(@NotNull Consumer<FinishedRecipe> consumer, @NotNull String id) {
this.save(consumer, new ResourceLocation(id));
}
@Override
public void save(@NotNull Consumer<FinishedRecipe> consumer, @NotNull ResourceLocation id) {
this.ensureValid(id);
// 构建 advancement
Advancement.Builder advancementBuilder = this.advancement
.parent(ROOT_RECIPE_ADVANCEMENT)
.addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(id))
.rewards(AdvancementRewards.Builder.recipe(id))
.requirements(RequirementsStrategy.OR);
// 构建普通配方结果
FinishedRecipe plainRecipe = new NBTResult(
id, this.result, this.group == null ? "" : this.group,
determineBookCategory(this.category), this.rows, this.key,
advancementBuilder, id.withPrefix("recipes/" + this.category.getFolderName() + "/"),
this.showNotification
);
if (this.conditions.isEmpty()) {
// 无条件 直接保存
consumer.accept(plainRecipe);
} else {
// 有条件 使用 ConditionalRecipe 包装
ConditionalRecipe.Builder builder = ConditionalRecipe.builder();
for (ICondition cond : this.conditions) {
builder.addCondition(cond);
}
builder.addRecipe(c -> c.accept(plainRecipe));
builder.generateAdvancement();
builder.build(consumer, id);
}
}
private void ensureValid(ResourceLocation id) {
if (this.rows.isEmpty()) throw new IllegalStateException("No pattern for " + id);
Set<Character> defined = Sets.newHashSet(this.key.keySet());
defined.remove(' ');
for (String row : this.rows) {
for (int i = 0; i < row.length(); i++) {
char c = row.charAt(i);
if (!this.key.containsKey(c) && c != ' ') throw new IllegalStateException("Undefined symbol '" + c + "'");
defined.remove(c);
}
}
if (!defined.isEmpty()) throw new IllegalStateException("Unused ingredients: " + defined);
if (this.rows.size() == 1 && this.rows.get(0).length() == 1) throw new IllegalStateException("Use shapeless for 1x1");
if (this.advancement.getCriteria().isEmpty()) throw new IllegalStateException("No unlock criterion for " + id);
}
/** NBT → JsonElement结构化 */
private static JsonElement nbtToJson(CompoundTag tag) {
JsonObject obj = new JsonObject();
tag.getAllKeys().forEach(key -> {
Tag value = tag.get(key);
if (value instanceof CompoundTag c) {
obj.add(key, nbtToJson(c));
} else if (value instanceof ListTag list) {
JsonArray arr = new JsonArray();
for (Tag item : list) {
arr.add(nbtToJson(item));
}
obj.add(key, arr);
} else if (value instanceof StringTag s) {
obj.addProperty(key, s.getAsString());
} else if (value instanceof NumericTag n) {
if (value instanceof ByteTag) obj.addProperty(key, n.getAsByte());
else if (value instanceof ShortTag) obj.addProperty(key, n.getAsShort());
else if (value instanceof IntTag) obj.addProperty(key, n.getAsInt());
else if (value instanceof LongTag) obj.addProperty(key, n.getAsLong());
else if (value instanceof FloatTag) obj.addProperty(key, n.getAsFloat());
else if (value instanceof DoubleTag) obj.addProperty(key, n.getAsDouble());
} else {
if (value != null) {
obj.addProperty(key, value.getAsString());
}
}
});
return obj;
}
private static JsonElement nbtToJson(Tag tag) {
if (tag instanceof CompoundTag c) return nbtToJson(c);
if (tag instanceof StringTag s) return new JsonPrimitive(s.getAsString());
if (tag instanceof NumericTag n) {
if (tag instanceof ByteTag) return new JsonPrimitive(n.getAsByte());
if (tag instanceof ShortTag) return new JsonPrimitive(n.getAsShort());
if (tag instanceof IntTag) return new JsonPrimitive(n.getAsInt());
if (tag instanceof LongTag) return new JsonPrimitive(n.getAsLong());
if (tag instanceof FloatTag) return new JsonPrimitive(n.getAsFloat());
if (tag instanceof DoubleTag) return new JsonPrimitive(n.getAsDouble());
}
return new JsonPrimitive(tag.getAsString());
}
/** 完美 Result */
public static class NBTResult extends CraftingRecipeBuilder.CraftingResult {
private final ResourceLocation id;
private final ItemStack result;
private final String group;
private final List<String> pattern;
private final Map<Character, JsonObject> key;
private final Advancement.Builder advancement;
private final ResourceLocation advancementId;
private final boolean showNotification;
public NBTResult(ResourceLocation id, ItemStack result, String group,
CraftingBookCategory category, List<String> pattern,
Map<Character, JsonObject> key, Advancement.Builder advancement,
ResourceLocation advancementId, boolean showNotification) {
super(category);
this.id = id;
this.result = result;
this.group = group;
this.pattern = pattern;
this.key = key;
this.advancement = advancement;
this.advancementId = advancementId;
this.showNotification = showNotification;
}
@Override
public void serializeRecipeData(@NotNull JsonObject json) {
if (!this.group.isEmpty()) json.addProperty("group", this.group);
JsonArray patternArray = new JsonArray();
this.pattern.forEach(patternArray::add);
json.add("pattern", patternArray);
JsonObject keyObj = new JsonObject();
this.key.forEach((c, jsonObj) -> keyObj.add(String.valueOf(c), jsonObj));
json.add("key", keyObj);
JsonObject resultObj = new JsonObject();
resultObj.addProperty("type", "forge:partial_nbt");
resultObj.addProperty("item", Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(this.result.getItem())).toString());
if (this.result.getCount() > 1) resultObj.addProperty("count", this.result.getCount());
if (this.result.hasTag() && this.result.getTag() != null) {
resultObj.add("nbt", nbtToJson(this.result.getTag()));
}
json.add("result", resultObj);
json.addProperty("show_notification", this.showNotification);
}
@Override public @NotNull RecipeSerializer<?> getType() { return RecipeSerializer.SHAPED_RECIPE; }
@Override public @NotNull ResourceLocation getId() { return this.id; }
@Nullable @Override public JsonObject serializeAdvancement() { return this.advancement.serializeToJson(); }
@Nullable @Override public ResourceLocation getAdvancementId() { return this.advancementId; }
}
}

View File

@ -1,4 +1,4 @@
package com.extendedae_plus.ae.client.gui;
package com.extendedae_plus.gui;
import appeng.client.gui.style.Blitter;
import com.extendedae_plus.ExtendedAEPlus;

View File

@ -1,12 +1,12 @@
package com.extendedae_plus.init;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.content.wireless.WirelessTransceiverBlock;
import com.extendedae_plus.content.matrix.UploadCoreBlock;
import com.extendedae_plus.content.crafting.EPlusCraftingUnitType;
import appeng.block.crafting.CraftingUnitBlock;
import appeng.blockentity.crafting.CraftingBlockEntity;
import appeng.core.definitions.AEBlockEntities;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.content.crafting.EPlusCraftingUnitType;
import com.extendedae_plus.content.matrix.UploadCoreBlock;
import com.extendedae_plus.content.wireless.WirelessTransceiverBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
@ -24,7 +24,7 @@ public final class ModBlocks {
() -> new WirelessTransceiverBlock(
BlockBehaviour.Properties.of()
.mapColor(MapColor.METAL)
.strength(1.5F, 6.0F)
.strength(2F, 6.0F)
.requiresCorrectToolForDrops()
)
);
@ -51,7 +51,7 @@ public final class ModBlocks {
);
// Crafting Accelerators (reuse MAE2 textures/models)
public static final RegistryObject<CraftingUnitBlock> ACCELERATOR_4x = BLOCKS.register(
public static final RegistryObject<CraftingUnitBlock> CRAFTING_ACCELERATOR_4x = BLOCKS.register(
"4x_crafting_accelerator",
() -> {
var b = new CraftingUnitBlock(EPlusCraftingUnitType.ACCELERATOR_4x);
@ -60,7 +60,7 @@ public final class ModBlocks {
}
);
public static final RegistryObject<CraftingUnitBlock> ACCELERATOR_16x = BLOCKS.register(
public static final RegistryObject<CraftingUnitBlock> CRAFTING_ACCELERATOR_16x = BLOCKS.register(
"16x_crafting_accelerator",
() -> {
var b = new CraftingUnitBlock(EPlusCraftingUnitType.ACCELERATOR_16x);
@ -69,7 +69,7 @@ public final class ModBlocks {
}
);
public static final RegistryObject<CraftingUnitBlock> ACCELERATOR_64x = BLOCKS.register(
public static final RegistryObject<CraftingUnitBlock> CRAFTING_ACCELERATOR_64x = BLOCKS.register(
"64x_crafting_accelerator",
() -> {
var b = new CraftingUnitBlock(EPlusCraftingUnitType.ACCELERATOR_64x);
@ -78,7 +78,7 @@ public final class ModBlocks {
}
);
public static final RegistryObject<CraftingUnitBlock> ACCELERATOR_256x = BLOCKS.register(
public static final RegistryObject<CraftingUnitBlock> CRAFTING_ACCELERATOR_256x = BLOCKS.register(
"256x_crafting_accelerator",
() -> {
var b = new CraftingUnitBlock(EPlusCraftingUnitType.ACCELERATOR_256x);
@ -87,7 +87,7 @@ public final class ModBlocks {
}
);
public static final RegistryObject<CraftingUnitBlock> ACCELERATOR_1024x = BLOCKS.register(
public static final RegistryObject<CraftingUnitBlock> CRAFTING_ACCELERATOR_1024x = BLOCKS.register(
"1024x_crafting_accelerator",
() -> {
var b = new CraftingUnitBlock(EPlusCraftingUnitType.ACCELERATOR_1024x);

View File

@ -8,11 +8,8 @@ import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.RegistryObject;
public final class ModCreativeTabs {
private ModCreativeTabs() {}
public static final DeferredRegister<CreativeModeTab> TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, ExtendedAEPlus.MODID);
public static final RegistryObject<CreativeModeTab> MAIN = TABS.register("main",
() -> CreativeModeTab.builder()
.title(Component.translatable("itemGroup." + ExtendedAEPlus.MODID + ".main"))
@ -23,11 +20,11 @@ public final class ModCreativeTabs {
output.accept(ModItems.NETWORK_PATTERN_CONTROLLER.get());
// 装配矩阵上传核心
output.accept(ModItems.ASSEMBLER_MATRIX_UPLOAD_CORE.get());
output.accept(ModItems.ACCELERATOR_4x.get());
output.accept(ModItems.ACCELERATOR_16x.get());
output.accept(ModItems.ACCELERATOR_64x.get());
output.accept(ModItems.ACCELERATOR_256x.get());
output.accept(ModItems.ACCELERATOR_1024x.get());
output.accept(ModItems.CRAFTING_ACCELERATOR_4x.get());
output.accept(ModItems.CRAFTING_ACCELERATOR_16x.get());
output.accept(ModItems.CRAFTING_ACCELERATOR_64x.get());
output.accept(ModItems.CRAFTING_ACCELERATOR_256x.get());
output.accept(ModItems.CRAFTING_ACCELERATOR_1024x.get());
output.accept(ModItems.ENTITY_TICKER_PART_ITEM.get());
// 放入四个预设的 stacksx2,x4,x8,x16使用 ModItems 工厂创建
@ -35,11 +32,22 @@ public final class ModCreativeTabs {
output.accept(ModItems.createEntitySpeedCardStack(4));
output.accept(ModItems.createEntitySpeedCardStack(8));
output.accept(ModItems.createEntitySpeedCardStack(16));
output.accept(ModItems.INFINITY_BIGINTEGER_CELL_ITEM.get());
// 频道卡
output.accept(ModItems.CHANNEL_CARD.get());
output.accept(ModItems.OBLIVION_SINGULARITY.get());
output.accept(ModItems.BASIC_CORE.get());
output.accept(ModItems.STORAGE_CORE.get());
if (ModItems.ENERGY_STORAGE_CORE != null) {
output.accept(ModItems.ENERGY_STORAGE_CORE.get());
}
if (ModItems.QUANTUM_STORAGE_CORE != null) {
output.accept(ModItems.QUANTUM_STORAGE_CORE.get());
}
output.accept(ModItems.SPATIAL_CORE.get());
output.accept(ModItems.INFINITY_CORE.get());
output.accept(ModItems.INFINITY_BIGINTEGER_CELL.get());
})
.build());
}

View File

@ -4,19 +4,20 @@ import appeng.api.parts.IPart;
import appeng.api.parts.PartModels;
import appeng.items.parts.PartModelsHelper;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.ae.definitions.upgrades.EntitySpeedCardItem;
import com.extendedae_plus.ae.items.ChannelCardItem;
import com.extendedae_plus.ae.items.EntitySpeedTickerPartItem;
import com.extendedae_plus.ae.items.InfinityBigIntegerCellItem;
import com.extendedae_plus.items.BasicCoreItem;
import com.extendedae_plus.items.EntitySpeedTickerPartItem;
import com.extendedae_plus.items.InfinityBigIntegerCellItem;
import com.extendedae_plus.items.materials.ChannelCardItem;
import com.extendedae_plus.items.materials.EntitySpeedCardItem;
import com.extendedae_plus.util.ModCheckUtils;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
public final class ModItems {
private ModItems() {}
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, ExtendedAEPlus.MODID);
public static final RegistryObject<Item> WIRELESS_TRANSCEIVER = ITEMS.register(
@ -36,34 +37,34 @@ public final class ModItems {
);
// Crafting Accelerators
public static final RegistryObject<Item> ACCELERATOR_4x = ITEMS.register(
public static final RegistryObject<Item> CRAFTING_ACCELERATOR_4x = ITEMS.register(
"4x_crafting_accelerator",
() -> new BlockItem(ModBlocks.ACCELERATOR_4x.get(), new Item.Properties())
() -> new BlockItem(ModBlocks.CRAFTING_ACCELERATOR_4x.get(), new Item.Properties())
);
public static final RegistryObject<Item> ACCELERATOR_16x = ITEMS.register(
public static final RegistryObject<Item> CRAFTING_ACCELERATOR_16x = ITEMS.register(
"16x_crafting_accelerator",
() -> new BlockItem(ModBlocks.ACCELERATOR_16x.get(), new Item.Properties())
() -> new BlockItem(ModBlocks.CRAFTING_ACCELERATOR_16x.get(), new Item.Properties())
);
public static final RegistryObject<Item> ACCELERATOR_64x = ITEMS.register(
public static final RegistryObject<Item> CRAFTING_ACCELERATOR_64x = ITEMS.register(
"64x_crafting_accelerator",
() -> new BlockItem(ModBlocks.ACCELERATOR_64x.get(), new Item.Properties())
() -> new BlockItem(ModBlocks.CRAFTING_ACCELERATOR_64x.get(), new Item.Properties())
);
public static final RegistryObject<Item> ACCELERATOR_256x = ITEMS.register(
public static final RegistryObject<Item> CRAFTING_ACCELERATOR_256x = ITEMS.register(
"256x_crafting_accelerator",
() -> new BlockItem(ModBlocks.ACCELERATOR_256x.get(), new Item.Properties())
() -> new BlockItem(ModBlocks.CRAFTING_ACCELERATOR_256x.get(), new Item.Properties())
);
public static final RegistryObject<Item> ACCELERATOR_1024x = ITEMS.register(
public static final RegistryObject<Item> CRAFTING_ACCELERATOR_1024x = ITEMS.register(
"1024x_crafting_accelerator",
() -> new BlockItem(ModBlocks.ACCELERATOR_1024x.get(), new Item.Properties())
() -> new BlockItem(ModBlocks.CRAFTING_ACCELERATOR_1024x.get(), new Item.Properties())
);
public static final RegistryObject<EntitySpeedTickerPartItem> ENTITY_TICKER_PART_ITEM = ITEMS.register(
"entity_speed_ticker",
() -> new EntitySpeedTickerPartItem(new Item.Properties())
() -> new EntitySpeedTickerPartItem(new Item.Properties())
);
// AE Upgrade Cards: 实体加速卡四个等级x2,x4,x8,x16
@ -73,8 +74,8 @@ public final class ModItems {
() -> new EntitySpeedCardItem(new Item.Properties())
);
public static final RegistryObject<Item> INFINITY_BIGINTEGER_CELL_ITEM = ITEMS.register(
"infinity_biginteger_cell", InfinityBigIntegerCellItem::new
public static final RegistryObject<InfinityBigIntegerCellItem> INFINITY_BIGINTEGER_CELL = ITEMS.register(
"infinity_biginteger_cell", () -> new InfinityBigIntegerCellItem(new Item.Properties())
);
// 频道卡作为 AE 升级卡使用
@ -83,6 +84,50 @@ public final class ModItems {
() -> new ChannelCardItem(new Item.Properties())
);
public static final RegistryObject<BasicCoreItem> BASIC_CORE = ITEMS.register(
"basic_core",
() -> new BasicCoreItem(new Item.Properties())
);
public static final RegistryObject<Item> STORAGE_CORE = ITEMS.register(
"storage_core",
() -> new Item(new Item.Properties())
);
public static final RegistryObject<Item> SPATIAL_CORE = ITEMS.register(
"spatial_core",
() -> new Item(new Item.Properties())
);
public static final RegistryObject<Item> INFINITY_CORE = ITEMS.register(
"infinity_core",
() -> new Item(new Item.Properties())
);
public static final RegistryObject<Item> OBLIVION_SINGULARITY = ITEMS.register(
"oblivion_singularity",
() -> new Item(new Item.Properties())
);
public static final RegistryObject<Item> ENERGY_STORAGE_CORE;
public static final RegistryObject<Item> QUANTUM_STORAGE_CORE;
static {
if (ModCheckUtils.isAppfluxLoading()) {
ENERGY_STORAGE_CORE = ITEMS.register(
"energy_storage_core",
() -> new Item(new Item.Properties())
);
} else {
ENERGY_STORAGE_CORE = null;
}
if (ModCheckUtils.isAAELoading()) {
QUANTUM_STORAGE_CORE = ITEMS.register(
"quantum_storage_core",
() -> new Item(new Item.Properties())
);
} else {
QUANTUM_STORAGE_CORE = null;
}
}
private ModItems() {}
/**
* PartItem 注册 AE2 部件模型
@ -99,7 +144,7 @@ public final class ModItems {
/**
* 工厂创建带 multiplier 的实体加速卡 ItemStack2/4/8/16
*/
public static net.minecraft.world.item.ItemStack createEntitySpeedCardStack(int multiplier) {
public static ItemStack createEntitySpeedCardStack(int multiplier) {
return EntitySpeedCardItem.withMultiplier(multiplier);
}
}

View File

@ -1,7 +1,10 @@
package com.extendedae_plus.integration.jei;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.ae.definitions.upgrades.EntitySpeedCardItem;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.items.BasicCoreItem;
import com.extendedae_plus.items.materials.EntitySpeedCardItem;
import com.extendedae_plus.util.ModCheckUtils;
import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin;
import mezz.jei.api.registration.ISubtypeRegistration;
@ -24,10 +27,43 @@ public class ExtendedAEJeiPlugin implements IModPlugin {
@Override
public void registerItemSubtypes(ISubtypeRegistration registration) {
// Register NBT-based subtype interpreter so JEI treats different multipliers as distinct items
// Entity Speed Card
registration.registerSubtypeInterpreter(
com.extendedae_plus.init.ModItems.ENTITY_SPEED_CARD.get(),
(stack, context) -> String.valueOf(EntitySpeedCardItem.readMultiplier(stack))
ModItems.ENTITY_SPEED_CARD.get(),
(stack, ctx) -> String.valueOf(EntitySpeedCardItem.readMultiplier(stack))
);
// Basic Core 使用 CustomModelData + core_stage
registration.registerSubtypeInterpreter(
ModItems.BASIC_CORE.get(),
(stack, ctx) -> {
if (!BasicCoreItem.isTyped(stack)) {
return "untyped";
}
BasicCoreItem.CoreType type = BasicCoreItem.getType(stack).orElse(null);
if (type == null) {
return "untyped";
}
int stage = BasicCoreItem.getStage(stack);
// 依赖检查
if (!isCoreTypeAvailable(type.id)) {
return "hidden"; // JEI 隐藏
}
return type.id + "_" + stage; // "0_1", "1_4"
}
);
}
}
private boolean isCoreTypeAvailable(int typeId) {
return switch (typeId) {
case 1, 2 -> true; // storage, spatial
case 3 -> ModCheckUtils.isAppfluxLoading();
case 4 -> ModCheckUtils.isAAELoading();
default -> false;
};
}
}

View File

@ -0,0 +1,176 @@
package com.extendedae_plus.items;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.init.ModItems;
import net.minecraft.ChatFormatting;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Optional;
public class BasicCoreItem extends Item {
private static final String NBT_MODEL = "CustomModelData"; // 1~4 = 类型, 无或0 = 未定型
private static final String NBT_STAGE = "core_stage"; // 0~3 = 阶段
private static final int MAX_STAGE = 3;
public BasicCoreItem(Properties props) {
super(props.stacksTo(1).setNoRepair());
}
// ==================== 工厂方法 ====================
public static ItemStack of(CoreType type, int stage) {
ItemStack stack = new ItemStack(ModItems.BASIC_CORE.get());
if (type != null && stage >= 0 && stage <= MAX_STAGE) {
CompoundTag tag = stack.getOrCreateTag();
tag.putInt(NBT_MODEL, type.id);
tag.putInt(NBT_STAGE, stage);
}
// NBT 默认模型
return stack;
}
public static ItemStack storageStage(int stage) { return of(CoreType.STORAGE, stage); }
public static ItemStack spatialStage(int stage) { return of(CoreType.SPATIAL, stage); }
public static ItemStack energyStage(int stage) { return of(CoreType.ENERGY, stage); }
public static ItemStack quantumStage(int stage) { return of(CoreType.QUANTUM, stage); }
// ==================== NBT 查询 ====================
public static Optional<CoreType> getType(ItemStack stack) {
if (!stack.hasTag() || !stack.getTag().contains(NBT_MODEL)) {
return Optional.empty();
}
int cmd = stack.getTag().getInt(NBT_MODEL);
return CoreType.byId(cmd);
}
public static int getStage(ItemStack stack) {
if (!stack.hasTag()) return 0;
return Math.min(stack.getTag().getInt(NBT_STAGE), MAX_STAGE);
}
public static boolean isTyped(ItemStack stack) { return getType(stack).isPresent(); }
public static boolean isFinalStage(ItemStack stack) { return getStage(stack) >= MAX_STAGE; }
// ==================== 耐久条 ====================
@Override
public boolean isBarVisible(ItemStack stack) {
return isTyped(stack);
}
@Override
public int getBarWidth(@NotNull ItemStack stack) {
if (!isTyped(stack)) return 0;
return Math.round(13.0f * getStage(stack) / MAX_STAGE);
}
@Override
public int getBarColor(@NotNull ItemStack stack) {
return getType(stack)
.map(type -> type.getTextColor().getColor())
.orElse(0xFFFFFF);
}
// ==================== Tooltip ====================
@OnlyIn(Dist.CLIENT)
@Override
public void appendHoverText(ItemStack stack, @Nullable Level level, List<Component> tooltip, TooltipFlag flag) {
if (!isTyped(stack)) {
tooltip.add(Component.translatable("tooltip." + ExtendedAEPlus.MODID + ".basic_core.untyped")
.withStyle(ChatFormatting.GRAY));
return;
}
getType(stack).ifPresent(type -> {
String finalKey = "item." + ExtendedAEPlus.MODID + "." + type.key + "_core";
tooltip.add(Component.translatable("tooltip." + ExtendedAEPlus.MODID + ".basic_core.evolving_to",
Component.translatable(finalKey).withStyle(type.getTextColor()))
.withStyle(ChatFormatting.AQUA));
tooltip.add(Component.empty());
tooltip.add(Component.translatable("tooltip." + ExtendedAEPlus.MODID + ".basic_core.progress")
.withStyle(ChatFormatting.YELLOW));
int stage = getStage(stack);
for (int i = 1; i <= 3; i++) {
String key = "item." + ExtendedAEPlus.MODID + ".basic_core." + type.key + "." + i;
ChatFormatting color = i <= stage ? ChatFormatting.GREEN : ChatFormatting.DARK_GRAY;
String prefix = i <= stage ? "" : "";
tooltip.add(Component.literal(prefix).withStyle(color).append(Component.translatable(key)));
}
if (stage >= MAX_STAGE) {
tooltip.add(Component.empty());
tooltip.add(Component.translatable("tooltip." + ExtendedAEPlus.MODID + ".basic_core.ready_to_craft")
.withStyle(ChatFormatting.GOLD));
}
});
}
// ==================== 显示名称 ====================
@Override
public @NotNull Component getName(@NotNull ItemStack stack) {
if (!isTyped(stack)) {
return Component.translatable("item." + ExtendedAEPlus.MODID + ".basic_core");
}
return getType(stack).<Component>map(type -> {
String key = "item." + ExtendedAEPlus.MODID + ".basic_core." + type.key + "." + getStage(stack);
return Component.translatable(key).withStyle(type.getTextColor());
}).orElseGet(() -> Component.translatable("item." + ExtendedAEPlus.MODID + ".basic_core"));
}
@Override
public @NotNull Rarity getRarity(@NotNull ItemStack stack) {
return isTyped(stack)
? getType(stack).map(t -> t.getRarity(getStage(stack))).orElse(Rarity.COMMON)
: Rarity.COMMON;
}
// ==================== 核心类型枚举 ====================
public enum CoreType {
STORAGE (1, "storage", ChatFormatting.AQUA),
SPATIAL (2, "spatial", ChatFormatting.YELLOW),
ENERGY (3, "energy_storage", ChatFormatting.RED),
QUANTUM (4, "quantum_storage",ChatFormatting.LIGHT_PURPLE);
public final int id;
public final String key;
public final ChatFormatting textColor;
CoreType(int id, String key, ChatFormatting textColor) {
this.id = id;
this.key = key;
this.textColor = textColor;
}
public static Optional<CoreType> byId(int id) {
return switch (id) {
case 1 -> Optional.of(STORAGE);
case 2 -> Optional.of(SPATIAL);
case 3 -> Optional.of(ENERGY);
case 4 -> Optional.of(QUANTUM);
default -> Optional.empty();
};
}
public ChatFormatting getTextColor() { return textColor; }
public Rarity getRarity(int stage) {
return switch (stage) {
case 1, 2 -> Rarity.UNCOMMON;
case 3 -> Rarity.EPIC;
default -> Rarity.COMMON;
};
}
}
}

Some files were not shown because too many files have changed in this diff Show More