Files
openosrs-injector/src/main/java/com/openosrs/injector/Injection.java
2020-06-18 13:12:24 +01:00

136 lines
3.6 KiB
Java

/*
* Copyright (c) 2019, Lucas <https://github.com/Lucwousin>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this source tree.
*/
package com.openosrs.injector;
import com.openosrs.injector.injection.InjectData;
import com.openosrs.injector.injection.InjectTaskHandler;
import com.openosrs.injector.injectors.InjectConstruct;
import com.openosrs.injector.injectors.Injector;
import com.openosrs.injector.injectors.InterfaceInjector;
import com.openosrs.injector.injectors.MixinInjector;
import com.openosrs.injector.injectors.RSApiInjector;
import com.openosrs.injector.injectors.raw.ClearColorBuffer;
import com.openosrs.injector.injectors.raw.DrawAfterWidgets;
import com.openosrs.injector.injectors.raw.DrawMenu;
import com.openosrs.injector.injectors.raw.AddPlayerToMenu;
import com.openosrs.injector.injectors.raw.Occluder;
import com.openosrs.injector.injectors.raw.RasterizerAlpha;
import com.openosrs.injector.injectors.raw.RenderDraw;
import com.openosrs.injector.injectors.raw.ScriptVM;
import com.openosrs.injector.rsapi.RSApi;
import com.openosrs.injector.transformers.InjectTransformer;
import com.openosrs.injector.transformers.SourceChanger;
import java.io.File;
import java.io.IOException;
import net.runelite.deob.util.JarUtil;
import org.gradle.api.file.FileTree;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
public class Injection extends InjectData implements InjectTaskHandler
{
private static final Logger log = Logging.getLogger(Injection.class);
public Injection(File vanilla, File rsclient, File mixins, FileTree rsapi) throws InjectException, IOException
{
super(
JarUtil.loadJar(vanilla),
JarUtil.loadJar(rsclient),
JarUtil.loadJar(mixins),
new RSApi(rsapi)
);
}
public void inject() throws InjectException
{
log.debug("[DEBUG] Starting injection");
inject(new InterfaceInjector(this));
inject(new RasterizerAlpha(this));
inject(new MixinInjector(this));
// This is where field hooks runs
// This is where method hooks runs
inject(new InjectConstruct(this));
inject(new RSApiInjector(this));
inject(new DrawAfterWidgets(this));
inject(new ScriptVM(this));
// All GPU raw injectors should probably be combined, especially RenderDraw and Occluder
inject(new ClearColorBuffer(this));
inject(new RenderDraw(this));
inject(new Occluder(this));
inject(new DrawMenu(this));
inject(new AddPlayerToMenu(this));
validate(new InjectorValidator(this));
transform(new SourceChanger(this));
}
public void save(File outputJar) throws IOException
{
log.info("[INFO] Saving jar to {}", outputJar.toString());
JarUtil.saveJar(this.getVanilla(), outputJar);
}
private void inject(Injector injector) throws InjectException
{
final String name = injector.getName();
log.info("[INFO] Starting {}", name);
injector.start();
injector.inject();
log.lifecycle("{} {}", name, injector.getCompletionMsg());
if (injector instanceof Validator)
validate((Validator) injector);
}
private void validate(Validator validator) throws InjectException
{
final String name = validator.getName();
if (!validator.validate())
{
throw new InjectException(name + " failed validation");
}
}
private void transform(InjectTransformer transformer)
{
final String name = transformer.getName();
log.info("[INFO] Starting {}", name);
transformer.transform();
log.lifecycle("{} {}", name, transformer.getCompletionMsg());
}
public void runChildInjector(Injector injector) throws InjectException
{
inject(injector);
}
}