Skip to content

Commit cd4b20c

Browse files
committed
tagに対しての対応と/repint matterへの移動
1 parent 399acd5 commit cd4b20c

30 files changed

Lines changed: 1024 additions & 398 deletions
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.p_nsk.replicated_integration.mixin;
2+
3+
import net.minecraft.world.item.crafting.Ingredient;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.gen.Accessor;
6+
7+
@Mixin(Ingredient.class)
8+
public interface IngredientAccessor {
9+
@Accessor("values")
10+
Ingredient.Value[] replicated_integration$getValues();
11+
}

‎1.20.1-forge/src/main/kotlin/com/p_nsk/replicated_integration/adapter/vanilla/BuiltinNodeResolver.kt‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import com.p_nsk.replicated_integration.api.LiteResourceLocation
44
import com.p_nsk.replicated_integration.api.MatterAmount
55
import com.p_nsk.replicated_integration.api.MatterNodeKey
66
import com.p_nsk.replicated_integration.api.MatterNodes
7+
import net.minecraft.core.registries.Registries
78
import net.minecraft.core.registries.BuiltInRegistries
89
import net.minecraft.resources.ResourceLocation
10+
import net.minecraft.tags.TagKey
911
import net.minecraft.world.item.ItemStack
1012
import net.minecraftforge.fluids.FluidStack
1113
import net.minecraftforge.registries.ForgeRegistries
@@ -19,6 +21,9 @@ object BuiltinNodeResolver {
1921
return MatterNodes.item(id.toLite())
2022
}
2123

24+
fun itemNode(id: ResourceLocation): MatterNodeKey =
25+
MatterNodes.item(id.toLite())
26+
2227
fun fluidNode(stack: FluidStack): MatterNodeKey? {
2328
if (stack.isEmpty) {
2429
return null
@@ -27,6 +32,28 @@ object BuiltinNodeResolver {
2732
return MatterNodes.fluid(id.toLite())
2833
}
2934

35+
fun fluidNode(id: ResourceLocation): MatterNodeKey? =
36+
ForgeRegistries.FLUIDS.getValue(id)?.let { fluid ->
37+
if (fluid == net.minecraft.world.level.material.Fluids.EMPTY) null else MatterNodes.fluid(id.toLite())
38+
}
39+
40+
fun itemNodesInTag(id: ResourceLocation): List<MatterNodeKey> =
41+
BuiltInRegistries.ITEM.getTag(TagKey.create(Registries.ITEM, id))
42+
.map { holders ->
43+
holders.map { holder -> MatterNodes.item(BuiltInRegistries.ITEM.getKey(holder.value()).toLite()) }
44+
}
45+
.orElse(emptyList())
46+
47+
fun fluidNodesInTag(id: ResourceLocation): List<MatterNodeKey> =
48+
BuiltInRegistries.FLUID.getTag(TagKey.create(Registries.FLUID, id))
49+
.map { holders ->
50+
holders.mapNotNull { holder ->
51+
val fluidId = BuiltInRegistries.FLUID.getKey(holder.value())
52+
if (holder.value() == net.minecraft.world.level.material.Fluids.EMPTY) null else MatterNodes.fluid(fluidId.toLite())
53+
}
54+
}
55+
.orElse(emptyList())
56+
3057
fun itemAmount(stack: ItemStack): MatterAmount? =
3158
itemNode(stack)?.let { MatterAmount(it, stack.count.coerceAtLeast(1).toLong()) }
3259

‎1.20.1-forge/src/main/kotlin/com/p_nsk/replicated_integration/adapter/vanilla/ReplicationVanillaAddon.kt‎

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,23 @@ package com.p_nsk.replicated_integration.adapter.vanilla
33
import com.buuz135.replication.calculation.MatterValue
44
import com.buuz135.replication.recipe.MatterValueRecipe
55
import com.p_nsk.replicated_integration.api.ExplicitMatterSource
6-
import com.p_nsk.replicated_integration.api.MatterValueRecipeExtension
76
import com.p_nsk.replicated_integration.api.IConversionSink
87
import com.p_nsk.replicated_integration.api.LiteMatterCompound
98
import com.p_nsk.replicated_integration.api.LiteResourceLocation
109
import com.p_nsk.replicated_integration.api.MatterAmount
10+
import com.p_nsk.replicated_integration.api.MatterNodeKey
1111
import com.p_nsk.replicated_integration.api.MatterNodes
1212
import com.p_nsk.replicated_integration.api.MutableMatterDefaults
13+
import com.p_nsk.replicated_integration.api.MutableMatterSelectors
1314
import com.p_nsk.replicated_integration.api.RecipeConversionMapper
1415
import com.p_nsk.replicated_integration.api.ReplicationAddon
1516
import com.p_nsk.replicated_integration.api.ReplicationAddonEnvironment
17+
import com.p_nsk.replicated_integration.api.MatterSelectorKey
18+
import com.p_nsk.replicated_integration.api.MatterSelectorKind
1619
import com.p_nsk.replicated_integration.bridge.ForgeRecipeConversionSupport
1720
import com.p_nsk.replicated_integration.bridge.ForgeReplicationAddonContext
1821
import com.p_nsk.replicated_integration.data.MatterNodeValueReloadListener
22+
import com.p_nsk.replicated_integration.mixin.IngredientAccessor
1923
import com.p_nsk.replicated_integration.recipe.replicatedIntegrationDenied
2024
import net.minecraft.core.registries.BuiltInRegistries
2125
import net.minecraft.resources.ResourceLocation
@@ -37,10 +41,13 @@ object ReplicationVanillaAddon : ReplicationAddon<ForgeReplicationAddonContext>
3741
override fun isEnabled(environment: ReplicationAddonEnvironment): Boolean = true
3842

3943
override fun collectDefaults(context: ForgeReplicationAddonContext, defaults: MutableMatterDefaults) {
40-
importDefaults(context.defaultMatterRecipes, defaults)
4144
defaults.putAll(MatterNodeValueReloadListener.snapshot())
4245
}
4346

47+
override fun collectSelectors(context: ForgeReplicationAddonContext, selectors: MutableMatterSelectors) {
48+
importDefaults(context.defaultMatterRecipes, selectors)
49+
}
50+
4451
override fun collectConversions(context: ForgeReplicationAddonContext, collector: IConversionSink) {
4552
val recipes = buildList {
4653
addAll(context.recipeManager.getAllRecipesFor(RecipeType.CRAFTING))
@@ -59,17 +66,27 @@ object ReplicationVanillaAddon : ReplicationAddon<ForgeReplicationAddonContext>
5966

6067
private fun importDefaults(
6168
recipes: List<MatterValueRecipe>,
62-
defaults: MutableMatterDefaults,
69+
selectors: MutableMatterSelectors,
6370
) {
6471
for (recipe in recipes) {
72+
val explicitSelector = recipe.input.explicitDefaultSelectorOrNull()
73+
if (explicitSelector != null) {
74+
if (recipe.replicatedIntegrationDenied) {
75+
selectors.deny(explicitSelector, ExplicitMatterSource.DATAPACK)
76+
continue
77+
}
78+
val compound = recipe.matter.toLiteMatterCompound() ?: continue
79+
selectors.put(explicitSelector, compound, ExplicitMatterSource.DATAPACK)
80+
continue
81+
}
6582
for (stack in recipe.input.items) {
66-
val node = BuiltinNodeResolver.itemNode(stack) ?: continue
83+
val itemNode = BuiltinNodeResolver.itemNode(stack) ?: continue
6784
if (recipe.replicatedIntegrationDenied) {
68-
defaults.deny(node, ExplicitMatterSource.DATAPACK)
85+
selectors.deny(MatterSelectorKey(MatterSelectorKind.NODE, itemNode.type, itemNode.id), ExplicitMatterSource.DATAPACK)
6986
continue
7087
}
7188
val compound = recipe.matter.toLiteMatterCompound() ?: continue
72-
defaults.put(node, compound, ExplicitMatterSource.DATAPACK)
89+
selectors.put(MatterSelectorKey(MatterSelectorKind.NODE, itemNode.type, itemNode.id), compound, ExplicitMatterSource.DATAPACK)
7390
}
7491
}
7592
}
@@ -131,6 +148,29 @@ object ReplicationVanillaAddon : ReplicationAddon<ForgeReplicationAddonContext>
131148
},
132149
)
133150

151+
private fun Ingredient.explicitDefaultSelectorOrNull() =
152+
explicitDefaultTagSelectorOrNull() ?: explicitDefaultItemSelectorOrNull()
153+
154+
private fun Ingredient.explicitDefaultItemSelectorOrNull() =
155+
((this as IngredientAccessor).`replicated_integration$getValues`().singleOrNull() as? Ingredient.ItemValue)
156+
?.serialize()
157+
?.getAsJsonPrimitive("item")
158+
?.asString
159+
?.let(ResourceLocation::parse)
160+
?.let { itemId ->
161+
MatterSelectorKey(MatterSelectorKind.NODE, MatterNodes.ITEM, ForgeRecipeConversionSupport.run { itemId.toLite() })
162+
}
163+
164+
private fun Ingredient.explicitDefaultTagSelectorOrNull() =
165+
((this as IngredientAccessor).`replicated_integration$getValues`().singleOrNull() as? Ingredient.TagValue)
166+
?.serialize()
167+
?.getAsJsonPrimitive("tag")
168+
?.asString
169+
?.let(ResourceLocation::parse)
170+
?.let { tagId ->
171+
MatterSelectorKey(MatterSelectorKind.TAG, MatterNodes.ITEM, ForgeRecipeConversionSupport.run { tagId.toLite() })
172+
}
173+
134174
private inline fun <reified R : Recipe<*>> singleOutputMapper(
135175
context: ForgeReplicationAddonContext,
136176
crossinline extractor: ForgeReplicationAddonContext.(R) -> ConversionInputs?,

‎1.20.1-forge/src/main/kotlin/com/p_nsk/replicated_integration/bridge/ForgeReplicationCalculationService.kt‎

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,21 @@ import com.buuz135.replication.calculation.MatterCompound
55
import com.buuz135.replication.calculation.MatterValue
66
import com.buuz135.replication.recipe.MatterValueRecipe
77
import com.p_nsk.replicated_integration.adapter.mekanism.ReplicationMekanismAddon
8+
import com.p_nsk.replicated_integration.adapter.vanilla.BuiltinNodeResolver
89
import com.p_nsk.replicated_integration.adapter.vanilla.ReplicationVanillaAddon
910
import com.p_nsk.replicated_integration.Constants
1011
import com.p_nsk.replicated_integration.api.ConversionGraphBuilder
11-
import com.p_nsk.replicated_integration.api.ExplicitMatterValue
1212
import com.p_nsk.replicated_integration.api.LiteMatterCompound
1313
import com.p_nsk.replicated_integration.api.LiteResourceLocation
14+
import com.p_nsk.replicated_integration.api.MatterNodeKey
1415
import com.p_nsk.replicated_integration.api.MatterNodes
1516
import com.p_nsk.replicated_integration.api.MutableMatterDefaults
17+
import com.p_nsk.replicated_integration.api.MutableMatterSelectors
18+
import com.p_nsk.replicated_integration.api.MatterSelectorMaterializer
1619
import com.p_nsk.replicated_integration.api.ReplicationAddonRegistry
1720
import com.p_nsk.replicated_integration.api.SimpleConversionSolver
1821
import com.p_nsk.replicated_integration.debug.MatterNodeDebugCache
22+
import com.p_nsk.replicated_integration.data.ForgeMatterConfigOverrides
1923
import com.p_nsk.replicated_integration.data.ForgeMatterRuntimeOverrides
2024
import com.p_nsk.replicated_integration.network.ReplicationCalculationSyncChannel
2125
import com.p_nsk.replicated_integration.network.ReplicationCalculationSyncPacket
@@ -54,6 +58,7 @@ object ForgeReplicationCalculationService {
5458
)
5559
val activeAddons = addons.active(ForgeReplicationAddonEnvironment)
5660
val defaults = MutableMatterDefaults()
61+
val selectors = MutableMatterSelectors()
5762
val builder = ConversionGraphBuilder()
5863

5964
Constants.LOGGER.info(
@@ -64,11 +69,17 @@ object ForgeReplicationCalculationService {
6469

6570
for (addon in activeAddons) {
6671
addon.collectDefaults(context, defaults)
67-
addon.collectConversions(context, builder)
72+
addon.collectSelectors(context, selectors)
6873
}
69-
defaults.putAll(ForgeMatterRuntimeOverrides.snapshot(server))
74+
selectors.putAll(ForgeMatterConfigOverrides.snapshot())
75+
selectors.putAll(ForgeMatterRuntimeOverrides.snapshot(server))
7076

77+
val selectorSnapshot = selectors.snapshot()
78+
defaults.putAll(MatterSelectorMaterializer.materialize(selectorSnapshot, ::expandSelectorTag))
7179
val explicitSnapshot = defaults.snapshot()
80+
for (addon in activeAddons) {
81+
addon.collectConversions(context, builder)
82+
}
7283
val graph = builder.build()
7384
Constants.LOGGER.info(
7485
"Replication addon calculation collected {} default nodes and {} conversions",
@@ -77,7 +88,7 @@ object ForgeReplicationCalculationService {
7788
)
7889

7990
val solved = SimpleConversionSolver().solve(graph, explicitSnapshot)
80-
MatterNodeDebugCache.publish(explicitSnapshot, graph, solved)
91+
MatterNodeDebugCache.publish(selectorSnapshot, explicitSnapshot, graph, solved)
8192

8293
val compounds = LinkedHashMap<String, MatterCompound>()
8394
for ((node, compound) in solved.entries.sortedBy { it.key }) {
@@ -147,6 +158,15 @@ object ForgeReplicationCalculationService {
147158

148159
fun nodeTypes() = addons.nodeTypes()
149160

161+
private fun expandSelectorTag(type: LiteResourceLocation, id: LiteResourceLocation): Iterable<MatterNodeKey> {
162+
val resourceId = id.toMcResourceLocation()
163+
return when (type) {
164+
MatterNodes.ITEM -> BuiltinNodeResolver.itemNodesInTag(resourceId)
165+
MatterNodes.FLUID -> BuiltinNodeResolver.fluidNodesInTag(resourceId)
166+
else -> emptyList()
167+
}
168+
}
169+
150170
private fun LiteMatterCompound.toMatterCompound(): MatterCompound? {
151171
val registry = ReplicationRegistry.MATTER_TYPES_REGISTRY.get()
152172
val compound = MatterCompound()

0 commit comments

Comments
 (0)