Skip to content

Commit 3fd900a

Browse files
committed
support loading legacy side config for tiles
1 parent e4ba3cc commit 3fd900a

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

src/main/java/mekanism/common/lib/transmitter/TransmissionType.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
@NothingNullByDefault
1818
public enum TransmissionType implements IHasTranslationKey, StringRepresentable {
19-
ENERGY("EnergyNetwork", "energy", MekanismLang.TRANSMISSION_TYPE_ENERGY),
20-
FLUID("FluidNetwork", "fluids", MekanismLang.TRANSMISSION_TYPE_FLUID),
21-
CHEMICAL("ChemicalNetwork", "chemicals", MekanismLang.TRANSMISSION_TYPE_CHEMICALS),
22-
ITEM("InventoryNetwork", "items", MekanismLang.TRANSMISSION_TYPE_ITEM),
23-
HEAT("HeatNetwork", "heat", MekanismLang.TRANSMISSION_TYPE_HEAT);
19+
ENERGY("EnergyNetwork", "energy", MekanismLang.TRANSMISSION_TYPE_ENERGY, 0),
20+
FLUID("FluidNetwork", "fluids", MekanismLang.TRANSMISSION_TYPE_FLUID, 1),
21+
CHEMICAL("ChemicalNetwork", "chemicals", MekanismLang.TRANSMISSION_TYPE_CHEMICALS, 2),//3,4,5 deleted
22+
ITEM("InventoryNetwork", "items", MekanismLang.TRANSMISSION_TYPE_ITEM, 6),
23+
HEAT("HeatNetwork", "heat", MekanismLang.TRANSMISSION_TYPE_HEAT, 7);
2424

2525
public static final Codec<TransmissionType> CODEC = StringRepresentable.fromEnum(TransmissionType::values);
2626
public static final IntFunction<TransmissionType> BY_ID = ByIdMap.continuous(TransmissionType::ordinal, values(), ByIdMap.OutOfBoundsStrategy.WRAP);
@@ -29,11 +29,13 @@ public enum TransmissionType implements IHasTranslationKey, StringRepresentable
2929
private final String name;
3030
private final String transmission;
3131
private final ILangEntry langEntry;
32+
private final int legacyOrdinal;
3233

33-
TransmissionType(String name, String transmission, ILangEntry langEntry) {
34+
TransmissionType(String name, String transmission, ILangEntry langEntry, int legacyOrdinal) {
3435
this.name = name;
3536
this.transmission = transmission;
3637
this.langEntry = langEntry;
38+
this.legacyOrdinal = legacyOrdinal;
3739
}
3840

3941
public String getName() {
@@ -65,4 +67,8 @@ public boolean checkTransmissionType(TileEntityTransmitter transmitter) {
6567
public String getSerializedName() {
6668
return transmission;
6769
}
70+
71+
public int getLegacyOrdinal() {
72+
return legacyOrdinal;
73+
}
6874
}

src/main/java/mekanism/common/tile/component/TileComponentConfig.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252

5353
public class TileComponentConfig implements ITileComponent, ISpecificContainerTracker {
5454

55+
public static final String LEGACY_ITEM_EJECT_KEY = SerializationConstants.EJECT + TransmissionType.ITEM.getLegacyOrdinal();
56+
public static final String LEGACY_ITEM_CONFIG_KEY = SerializationConstants.CONFIG + TransmissionType.ITEM.getLegacyOrdinal();
5557
public final TileEntityMekanism tile;
5658
private final Map<TransmissionType, ConfigInfo> configInfo = new EnumMap<>(TransmissionType.class);
5759
private final Map<TransmissionType, List<Consumer<Direction>>> configChangeListeners = new EnumMap<>(TransmissionType.class);
@@ -297,23 +299,39 @@ public static void read(CompoundTag configNBT, Map<TransmissionType, ConfigInfo>
297299
}
298300

299301
public static void read(CompoundTag configNBT, Map<TransmissionType, ConfigInfo> configInfo, BiConsumer<TransmissionType, RelativeSide> onChange) {
302+
//todo 1.22 remove backcompat - check for old ITEM ordinal, switch to legacy ordinals if found
303+
boolean isLegacyData = configNBT.contains(LEGACY_ITEM_CONFIG_KEY) || configNBT.contains(LEGACY_ITEM_EJECT_KEY);
300304
for (Entry<TransmissionType, ConfigInfo> entry : configInfo.entrySet()) {
301305
TransmissionType type = entry.getKey();
302306
ConfigInfo info = entry.getValue();
303-
NBTUtils.setBooleanIfPresent(configNBT, SerializationConstants.EJECT + type.ordinal(), info::setEjecting);
304-
String configKey = SerializationConstants.CONFIG + type.ordinal();
307+
int ordinalToUse = isLegacyData ? type.getLegacyOrdinal() : type.ordinal();
308+
NBTUtils.setBooleanIfPresent(configNBT, SerializationConstants.EJECT + ordinalToUse, info::setEjecting);
309+
String configKey = SerializationConstants.CONFIG + ordinalToUse;
305310
if (configNBT.contains(configKey, Tag.TAG_INT_ARRAY)) {
306-
int[] sideData = configNBT.getIntArray(configKey);
307-
for (int i = 0; i < sideData.length && i < EnumUtils.SIDES.length; i++) {
308-
RelativeSide side = EnumUtils.SIDES[i];
309-
if (info.setDataType(DataType.BY_ID.apply(sideData[i]), side)) {
310-
onChange.accept(type, side);
311+
readConfigSides(configNBT, onChange, configKey, info, type);
312+
} else if (isLegacyData && type == TransmissionType.CHEMICAL) {
313+
//fallback to try load other types in case a machine didn't have GAS
314+
for (int legacyOrdinal = TransmissionType.CHEMICAL.getLegacyOrdinal() + 1; legacyOrdinal < TransmissionType.ITEM.getLegacyOrdinal(); legacyOrdinal++) {
315+
configKey = SerializationConstants.CONFIG + legacyOrdinal;
316+
if (configNBT.contains(configKey, Tag.TAG_INT_ARRAY)) {
317+
readConfigSides(configNBT, onChange, configKey, info, type);
318+
break;
311319
}
312320
}
313321
}
314322
}
315323
}
316324

325+
private static void readConfigSides(CompoundTag configNBT, BiConsumer<TransmissionType, RelativeSide> onChange, String configKey, ConfigInfo info, TransmissionType type) {
326+
int[] sideData = configNBT.getIntArray(configKey);
327+
for (int i = 0; i < sideData.length && i < EnumUtils.SIDES.length; i++) {
328+
RelativeSide side = EnumUtils.SIDES[i];
329+
if (info.setDataType(DataType.BY_ID.apply(sideData[i]), side)) {
330+
onChange.accept(type, side);
331+
}
332+
}
333+
}
334+
317335
@Override
318336
public CompoundTag serialize(HolderLookup.Provider provider) {
319337
return write(configInfo, true);

0 commit comments

Comments
 (0)