Skip to content

Commit 50c9f18

Browse files
authored
Try to adapt map type changes. (#157)
* Move REPLACEMENTS to ImmutableMap.Builder * Try to adapt Map type changes. * Added SuppressWarnings * Use RedirectingIdMapper for Block/Item colors. * Apply ATs in source. * Widen and implement `byId` * `RedirectingInt2ObjectMap` * Rename generic to `V` * Lazy-load maps. * Apply code style
1 parent 9ebb361 commit 50c9f18

File tree

10 files changed

+328
-22
lines changed

10 files changed

+328
-22
lines changed

Diff for: build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ sourceSets {
204204
println("Java: ${System.getProperty("java.version")}, JVM: ${System.getProperty("java.vm.version")} (${System.getProperty("java.vendor")}), Arch: ${System.getProperty("os.arch")}")
205205
minecraft {
206206
mappings("official", versionMc)
207+
accessTransformer(file("src/mod/resources/META-INF/accesstransformer.cfg"))
207208

208209
runs {
209210
val config = Action<RunConfig> {

Diff for: gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ org.gradle.daemon=true
66
# Versions
77
versionConnector=1.0.0-beta.18
88
versionAdapter=1.6.0-1.20.1-20231002.193707
9-
versionAdapterDefinition=1.6.0
9+
versionAdapterDefinition=1.6.1
1010

1111
versionMc=1.20.1
1212
versionForge=47.1.3

Diff for: src/main/java/dev/su5ed/sinytra/connector/transformer/FieldToMethodTransformer.java

+31-20
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,51 @@
2525
import java.util.Objects;
2626

2727
public class FieldToMethodTransformer implements Transformer {
28-
public static final Map<String, Map<String, String>> REPLACEMENTS = Map.of(
28+
public static final Map<String, Map<String, String>> REPLACEMENTS = ImmutableMap.<String, Map<String, String>>builder()
2929
// Extracted from forge's coremods/field_to_method.js
30-
"net.minecraft.world.level.biome.Biome", Map.of(
30+
.put("net.minecraft.world.level.biome.Biome", Map.of(
3131
"f_47437_", "getModifiedClimateSettings",
3232
"f_47443_", "getModifiedSpecialEffects"
33-
),
34-
"net.minecraft.world.level.levelgen.structure.Structure", Map.of(
33+
))
34+
.put("net.minecraft.world.level.levelgen.structure.Structure", Map.of(
3535
"f_226555_", "getModifiedStructureSettings"
36-
),
37-
"net.minecraft.world.effect.MobEffectInstance", Map.of(
36+
))
37+
.put("net.minecraft.world.effect.MobEffectInstance", Map.of(
3838
"f_19502_", "m_19544_"
39-
),
40-
"net.minecraft.world.level.block.LiquidBlock", Map.of(
39+
))
40+
.put("net.minecraft.world.level.block.LiquidBlock", Map.of(
4141
"f_54689_", "getFluid"
42-
),
43-
"net.minecraft.world.item.BucketItem", Map.of(
42+
))
43+
.put("net.minecraft.world.item.BucketItem", Map.of(
4444
"f_40687_", "getFluid"
45-
),
46-
"net.minecraft.world.level.block.StairBlock", Map.of(
45+
))
46+
.put("net.minecraft.world.level.block.StairBlock", Map.of(
4747
"f_56858_", "getModelBlock",
4848
"f_56859_", "getModelState"
49-
),
50-
"net.minecraft.world.level.block.FlowerPotBlock", Map.of(
49+
))
50+
.put("net.minecraft.world.level.block.FlowerPotBlock", Map.of(
5151
"f_53525_", "m_53560_"
52-
),
53-
"net.minecraft.world.item.ItemStack", Map.of(
52+
))
53+
.put("net.minecraft.world.item.ItemStack", Map.of(
5454
"f_41589_", "m_41720_"
55-
),
55+
))
5656
// Additional fields that forge replaces with getters via patches statically
57-
"net.minecraft.world.item.MobBucketItem", Map.of(
57+
.put("net.minecraft.world.item.MobBucketItem", Map.of(
5858
"f_151134_", "getFishType",
5959
"f_151135_", "getEmptySound"
60-
)
61-
);
60+
))
61+
// Custom getters added by Connector
62+
.put("net.minecraft.client.particle.ParticleEngine", Map.of(
63+
"f_107293_", "connector$getProviders"
64+
))
65+
.put("net.minecraft.client.color.block.BlockColors", Map.of(
66+
"f_92571_", "connector$getBlockColors"
67+
))
68+
.put("net.minecraft.client.color.item.ItemColors", Map.of(
69+
"f_92674_", "connector$getItemColors"
70+
))
71+
.buildOrThrow();
72+
6273
private static final Logger LOGGER = LogUtils.getLogger();
6374
private final String accessWidenerResource;
6475
private final Map<String, String> mappedReplacements;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package dev.su5ed.sinytra.connector.mod.compat.fieldtypes;
2+
3+
import net.minecraft.core.IdMapper;
4+
import org.jetbrains.annotations.NotNull;
5+
6+
import java.util.Iterator;
7+
import java.util.Map;
8+
import java.util.Objects;
9+
import java.util.function.Function;
10+
import java.util.function.IntFunction;
11+
12+
public class RedirectingIdMapper<K, V> extends IdMapper<V> {
13+
IntFunction<K> keyFunction;
14+
Function<K, Integer> reverseKeyFunction;
15+
Map<K, V> map;
16+
17+
public RedirectingIdMapper(IntFunction<K> keyFunction, Function<K, Integer> reverseKeyFunction, Map<K, V> map) {
18+
this.keyFunction = keyFunction;
19+
this.reverseKeyFunction = reverseKeyFunction;
20+
this.map = map;
21+
}
22+
23+
@Override
24+
public void addMapping(@NotNull V value, int id) {
25+
this.map.put(this.keyFunction.apply(id), value);
26+
}
27+
28+
@Override
29+
public void add(@NotNull V value) {
30+
this.addMapping(value, this.map.size());
31+
}
32+
33+
@Override
34+
public int getId(@NotNull V value) {
35+
for (Map.Entry<K, V> ktEntry : this.map.entrySet()) {
36+
if (Objects.equals(ktEntry.getValue(), value)) {
37+
return this.reverseKeyFunction.apply(ktEntry.getKey());
38+
}
39+
}
40+
return -1;
41+
}
42+
43+
@Override
44+
public V byId(int id) {
45+
return this.map.get(this.keyFunction.apply(id));
46+
}
47+
48+
@Override
49+
public Iterator<V> iterator() {
50+
return this.map.values().iterator();
51+
}
52+
53+
@Override
54+
public boolean contains(int id) {
55+
return this.map.containsKey(this.keyFunction.apply(id));
56+
}
57+
58+
@Override
59+
public int size() {
60+
return this.map.size();
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package dev.su5ed.sinytra.connector.mod.compat.fieldtypes;
2+
3+
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
4+
import it.unimi.dsi.fastutil.ints.IntSet;
5+
import it.unimi.dsi.fastutil.objects.ObjectCollection;
6+
import it.unimi.dsi.fastutil.objects.ObjectSet;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
import java.util.Map;
10+
import java.util.function.BiConsumer;
11+
import java.util.function.Function;
12+
import java.util.function.IntFunction;
13+
14+
public class RedirectingInt2ObjectMap<K, V> implements Int2ObjectMap<V> {
15+
IntFunction<K> keyFunction;
16+
Function<K, Integer> reverseKeyFunction;
17+
Map<K, V> map;
18+
V defaultReturnValue;
19+
20+
public RedirectingInt2ObjectMap(IntFunction<K> keyFunction, Function<K, Integer> reverseKeyFunction, Map<K, V> map) {
21+
this.keyFunction = keyFunction;
22+
this.reverseKeyFunction = reverseKeyFunction;
23+
this.map = map;
24+
}
25+
26+
@Override
27+
public int size() {
28+
return this.map.size();
29+
}
30+
31+
@Override
32+
public void clear() {
33+
this.map.clear();
34+
}
35+
36+
@Override
37+
public boolean isEmpty() {
38+
return this.map.isEmpty();
39+
}
40+
41+
@Override
42+
public boolean containsValue(Object value) {
43+
return this.map.containsValue(value);
44+
}
45+
46+
@Override
47+
public void putAll(@NotNull Map<? extends Integer, ? extends V> m) {
48+
m.forEach((key, value) -> this.map.put(this.keyFunction.apply(key), value));
49+
}
50+
51+
@Override
52+
public void defaultReturnValue(V rv) {
53+
this.defaultReturnValue = rv;
54+
}
55+
56+
@Override
57+
public V defaultReturnValue() {
58+
return this.defaultReturnValue;
59+
}
60+
61+
@Override
62+
public ObjectSet<Entry<V>> int2ObjectEntrySet() {
63+
throw new UnsupportedOperationException("int2ObjectEntrySet is not redirected yet!");
64+
}
65+
66+
@Override
67+
public IntSet keySet() {
68+
throw new UnsupportedOperationException("keySet is not redirected yet!");
69+
}
70+
71+
@Override
72+
public ObjectCollection<V> values() {
73+
throw new UnsupportedOperationException("values is not redirected yet!");
74+
}
75+
76+
@Override
77+
public V put(int key, V value) {
78+
return this.map.put(this.keyFunction.apply(key), value);
79+
}
80+
81+
@Override
82+
public V get(int key) {
83+
return this.map.get(this.keyFunction.apply(key));
84+
}
85+
86+
@Override
87+
public V remove(int key) {
88+
return this.map.remove(this.keyFunction.apply(key));
89+
}
90+
91+
@Override
92+
public boolean containsKey(int key) {
93+
return this.map.containsKey(this.keyFunction.apply(key));
94+
}
95+
96+
@Override
97+
public void forEach(BiConsumer<? super Integer, ? super V> consumer) {
98+
this.map.forEach((key, value) -> consumer.accept(this.reverseKeyFunction.apply(key), value));
99+
}
100+
101+
@Override
102+
public boolean remove(int key, Object value) {
103+
return this.map.remove(this.keyFunction.apply(key), value);
104+
}
105+
106+
@Override
107+
public boolean replace(int key, V oldValue, V newValue) {
108+
return this.map.replace(this.keyFunction.apply(key), oldValue, newValue);
109+
}
110+
111+
@Override
112+
public V replace(int key, V value) {
113+
return this.map.replace(this.keyFunction.apply(key), value);
114+
}
115+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package dev.su5ed.sinytra.connector.mod.mixin.fieldtypes;
2+
3+
import dev.su5ed.sinytra.connector.mod.compat.fieldtypes.RedirectingIdMapper;
4+
import net.minecraft.client.color.block.BlockColor;
5+
import net.minecraft.client.color.block.BlockColors;
6+
import net.minecraft.core.Holder;
7+
import net.minecraft.core.IdMapper;
8+
import net.minecraft.core.registries.BuiltInRegistries;
9+
import net.minecraft.world.level.block.Block;
10+
import net.minecraftforge.registries.ForgeRegistries;
11+
import org.spongepowered.asm.mixin.Final;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
14+
import org.spongepowered.asm.mixin.Unique;
15+
16+
import java.util.Map;
17+
18+
@SuppressWarnings("unused")
19+
@Mixin(BlockColors.class)
20+
public class BlockColorsMixin {
21+
@Shadow
22+
@Final
23+
private Map<Holder.Reference<Block>, BlockColor> blockColors;
24+
@Unique
25+
private IdMapper<BlockColor> connector$blockColors;
26+
27+
@Unique
28+
public IdMapper<BlockColor> connector$getBlockColors() {
29+
if (this.connector$blockColors == null) {
30+
this.connector$blockColors = new RedirectingIdMapper<>(
31+
i -> ForgeRegistries.BLOCKS.getDelegateOrThrow(BuiltInRegistries.BLOCK.byId(i)),
32+
blockReference -> BuiltInRegistries.BLOCK.getId(blockReference.get()),
33+
this.blockColors
34+
);
35+
}
36+
return this.connector$blockColors;
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package dev.su5ed.sinytra.connector.mod.mixin.fieldtypes;
2+
3+
import dev.su5ed.sinytra.connector.mod.compat.fieldtypes.RedirectingIdMapper;
4+
import net.minecraft.client.color.item.ItemColor;
5+
import net.minecraft.client.color.item.ItemColors;
6+
import net.minecraft.core.Holder;
7+
import net.minecraft.core.IdMapper;
8+
import net.minecraft.core.registries.BuiltInRegistries;
9+
import net.minecraft.world.item.Item;
10+
import net.minecraftforge.registries.ForgeRegistries;
11+
import org.spongepowered.asm.mixin.Final;
12+
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
14+
import org.spongepowered.asm.mixin.Unique;
15+
16+
import java.util.Map;
17+
18+
@SuppressWarnings("unused")
19+
@Mixin(ItemColors.class)
20+
public class ItemColorsMixin {
21+
@Shadow
22+
@Final
23+
private Map<Holder.Reference<Item>, ItemColor> itemColors;
24+
@Unique
25+
private IdMapper<ItemColor> connector$itemColors;
26+
27+
@Unique
28+
public IdMapper<ItemColor> connector$getItemColors() {
29+
if (this.connector$itemColors == null) {
30+
this.connector$itemColors = new RedirectingIdMapper<>(
31+
i -> ForgeRegistries.ITEMS.getDelegateOrThrow(BuiltInRegistries.ITEM.byId(i)),
32+
itemReference -> BuiltInRegistries.ITEM.getId(itemReference.get()),
33+
this.itemColors
34+
);
35+
}
36+
return this.connector$itemColors;
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package dev.su5ed.sinytra.connector.mod.mixin.fieldtypes;
2+
3+
import dev.su5ed.sinytra.connector.mod.compat.fieldtypes.RedirectingInt2ObjectMap;
4+
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
5+
import net.minecraft.client.particle.ParticleEngine;
6+
import net.minecraft.client.particle.ParticleProvider;
7+
import net.minecraft.core.registries.BuiltInRegistries;
8+
import net.minecraft.resources.ResourceLocation;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.Unique;
13+
14+
import java.util.Map;
15+
16+
@SuppressWarnings("unused")
17+
@Mixin(ParticleEngine.class)
18+
public class ParticleEngineMixin {
19+
@Shadow
20+
@Final
21+
private Map<ResourceLocation, ParticleProvider<?>> providers;
22+
@Unique
23+
private Int2ObjectMap<ParticleProvider<?>> connector$providers;
24+
25+
@Unique
26+
public Int2ObjectMap<ParticleProvider<?>> connector$getProviders() {
27+
if (this.connector$providers == null) {
28+
this.connector$providers = new RedirectingInt2ObjectMap<>(
29+
i -> BuiltInRegistries.PARTICLE_TYPE.getKey(BuiltInRegistries.PARTICLE_TYPE.byId(i)),
30+
key -> BuiltInRegistries.PARTICLE_TYPE.getId(BuiltInRegistries.PARTICLE_TYPE.get(key)),
31+
this.providers
32+
);
33+
}
34+
return this.connector$providers;
35+
}
36+
}

Diff for: src/mod/resources/META-INF/accesstransformer.cfg

+2
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
# See dev.su5ed.sinytra.connector.transformer.FieldToMethodTransformer for more information
33
public net.minecraft.world.item.MobBucketItem getFishType()Lnet.minecraft.world.entity.EntityType; # getFishType
44
public net.minecraft.world.item.MobBucketItem getEmptySound()Lnet.minecraft.sounds.SoundEvent; # getFishType
5+
6+
public-f net.minecraft.core.IdMapper m_7942_(I)Ljava/lang/Object; # byId

0 commit comments

Comments
 (0)