package choonster.testmod3.remap;
import choonster.testmod3.Logger;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent;
import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent.MissingMapping;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.registry.IForgeRegistry;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
/**
* Remaps this mod's {@link Block}s and {@link Item}s after registry names have been changed.
*
* @author Choonster
*/
public final class Remapper {
private static final Marker MARKER = MarkerManager.getMarker("Remapper", Logger.MOD_MARKER);
/**
* A list of remapping functions that return {@code true} if they took an action for the {@link MissingMapping}.
*/
private static final List<Predicate<MissingMapping>> remappingFunctions = ImmutableList.of(Remapper::remapCustomName);
private Remapper() {
}
/**
* Remap this mod's missing mappings.
*
* @param missingMappings This mod's missing mappings
*/
public static void remap(List<MissingMapping> missingMappings) {
for (MissingMapping missingMapping : missingMappings) { // For each missing mapping,
Logger.info(MARKER, "Trying to remap %s", missingMapping.resourceLocation);
for (Predicate<MissingMapping> remappingFunction : remappingFunctions) { // For each remapping function
if (remappingFunction.test(missingMapping)) { // If the function took an action,
break; // Break from the inner loop
}
}
if (missingMapping.getAction() == FMLMissingMappingsEvent.Action.DEFAULT) {
Logger.info(MARKER, "Couldn't remap %s", missingMapping.resourceLocation);
}
}
}
/**
* Try to remap {@code missingMapping} to the value of {@code registryName}.
*
* @param missingMapping The missing mapping
* @param registryName The registry name to remap to
* @return True if the remapping was successful
*/
private static boolean tryRemap(MissingMapping missingMapping, ResourceLocation registryName) {
switch (missingMapping.type) {
case BLOCK:
final IForgeRegistry<Block> blockRegistry = ForgeRegistries.BLOCKS;
if (blockRegistry.containsKey(registryName)) {
Logger.info(MARKER, "Remapped block %s to %s", missingMapping.resourceLocation, registryName);
missingMapping.remap(blockRegistry.getValue(registryName));
return true;
}
break;
case ITEM:
final IForgeRegistry<Item> itemRegistry = ForgeRegistries.ITEMS;
if (itemRegistry.containsKey(registryName)) {
Logger.info(MARKER, "Remapped item %s to %s", missingMapping.resourceLocation, registryName);
missingMapping.remap(itemRegistry.getValue(registryName));
return true;
}
break;
}
return false;
}
/**
* Custom names to remap. Keys are the old names, values are the new names.
*/
private static final Map<String, String> customNames = ImmutableMap.<String, String>builder()
.put("harvestswordwood", "wooden_harvest_sword")
.put("harvestsworddiamond", "diamond_harvest_sword")
.put("slowswordwood", "wooden_slow_sword")
.put("slowsworddiamond", "diamond_slow_sword")
.put("fluid.staticgas", "fluid.static_gas")
.put("fluid.normalgas", "fluid.normal_gas")
.put("stainedclayslablowdouble", "double_stained_clay_slab_low")
.put("stainedclayslabhighdouble", "double_stained_clay_slab_high")
.put("headreplacement", "replacement_helmet")
.put("chestreplacement", "replacement_chestplate")
.put("legsreplacement", "replacement_leggings")
.put("feetreplacement", "replacement_boots")
.put("modeltest", "model_test")
.put("pig_spawner.finite", "pig_spawner_finite")
.put("pig_spawner.infinite", "pig_spawner_infinite")
.build();
/**
* Remap names to those specified in {@link #customNames}.
*
* @param missingMapping The missing mapping
* @return True if the missing mapping was remapped
*/
private static boolean remapCustomName(MissingMapping missingMapping) {
final String missingPath = missingMapping.resourceLocation.getResourcePath();
if (!customNames.containsKey(missingPath)) return false;
final String newPath = customNames.get(missingPath);
final ResourceLocation newRegistryName = new ResourceLocation(missingMapping.resourceLocation.getResourceDomain(), newPath);
return tryRemap(missingMapping, newRegistryName);
}
}