/*
* Copyright (c) 2015 NOVA, All rights reserved.
* This library is free software, licensed under GNU Lesser General Public License version 3
*
* This file is part of NOVA.
*
* NOVA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* NOVA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NOVA. If not, see <http://www.gnu.org/licenses/>.
*/
package nova.core.wrapper.mc.forge.v18.asm.transformers;
import net.minecraft.launchwrapper.IClassTransformer;
import nova.core.wrapper.mc.forge.v18.asm.lib.ASMHelper;
import org.objectweb.asm.tree.ClassNode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public final class Transformers implements IClassTransformer {
private static Map<String, List<Transformer>> transformers = new HashMap<>();
public Transformers() {
registerTransformer(new ChunkTransformer(), "net.minecraft.world.chunk.Chunk");
registerTransformer(new TileEntityTransformer(), "net.minecraft.tileentity.TileEntity");
registerTransformer(new GameDataTransformer(), "net.minecraftforge.fml.common.registry.GameData");
}
public static void registerTransformer(Transformer transformer, String... classes) {
Objects.requireNonNull(classes);
for (String clazz : classes) {
List<Transformer> list = transformers.getOrDefault(clazz, new ArrayList<>());
list.add(transformer);
transformers.put(clazz, list);
}
}
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
if (transformers.containsKey(transformedName)) {
ClassNode cnode = ASMHelper.createClassNode(basicClass);
transformers.get(transformedName).forEach(t -> t.transform(cnode));
return ASMHelper.createBytes(cnode, 0);
}
return basicClass;
}
}