Skip to content

Commit 8879928

Browse files
committed
got a nice foundation for userdev
1 parent a85f69d commit 8879928

File tree

5 files changed

+556
-1
lines changed

5 files changed

+556
-1
lines changed

src/main/java/net/minecraftforge/gradle/user/UserBasePlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ else if (tasks.contains(TASK_RECOMPILE) || tasks.contains(TASK_SETUP_DECOMP))
337337
* @return useable deobfsucated output file
338338
*/
339339
@SuppressWarnings("serial")
340-
private Object chooseDeobfOutput(final String globalPattern, final String localPattern, final String appendage, final String classifier)
340+
protected final Object chooseDeobfOutput(final String globalPattern, final String localPattern, final String appendage, final String classifier)
341341
{
342342
return new Closure<DelayedFile>(project, this) {
343343
public DelayedFile call()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package net.minecraftforge.gradle.user.patcherUser;
2+
3+
import net.minecraftforge.gradle.user.UserBasePlugin;
4+
import net.minecraftforge.gradle.user.UserExtension;
5+
6+
public class PatcherUserBaseExtension extends UserExtension
7+
{
8+
9+
public PatcherUserBaseExtension(UserBasePlugin<? extends UserExtension> plugin)
10+
{
11+
super(plugin);
12+
// TODO Auto-generated constructor stub
13+
}
14+
15+
}
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
package net.minecraftforge.gradle.user.patcherUser;
2+
3+
import static net.minecraftforge.gradle.common.Constants.DIR_JSONS;
4+
import static net.minecraftforge.gradle.common.Constants.JAR_MERGED;
5+
import static net.minecraftforge.gradle.common.Constants.TASK_DL_VERSION_JSON;
6+
import static net.minecraftforge.gradle.common.Constants.TASK_GENERATE_SRGS;
7+
import static net.minecraftforge.gradle.user.UserConstants.*;
8+
import static net.minecraftforge.gradle.user.patcherUser.PatcherUserConstants.*;
9+
import groovy.lang.Closure;
10+
11+
import java.io.File;
12+
13+
import net.minecraftforge.gradle.tasks.DeobfuscateJar;
14+
import net.minecraftforge.gradle.tasks.ExtractConfigTask;
15+
import net.minecraftforge.gradle.tasks.ProcessSrcJarTask;
16+
import net.minecraftforge.gradle.tasks.RemapSources;
17+
import net.minecraftforge.gradle.user.UserBasePlugin;
18+
import net.minecraftforge.gradle.util.delayed.TokenReplacer;
19+
20+
import org.gradle.api.plugins.JavaPluginConvention;
21+
import org.gradle.api.tasks.SourceSet;
22+
23+
public abstract class PatcherUserBasePlugin<T extends PatcherUserBaseExtension> extends UserBasePlugin<T>
24+
{
25+
@Override
26+
@SuppressWarnings("serial")
27+
protected void applyUserPlugin()
28+
{
29+
// add the MC setup tasks..
30+
String global = DIR_API_JAR_BASE + "/" + REPLACE_API_NAME + "%s-" + REPLACE_API_VERSION;
31+
String local = DIR_LOCAL_CACHE + "/" + REPLACE_API_NAME + "%s-" + REPLACE_API_VERSION + "-PROJECT(" + project.getName() + ")";
32+
this.tasksMerged(global, local);
33+
34+
// setup userdev
35+
{
36+
project.getConfigurations().maybeCreate(CONFIG_USERDEV);
37+
38+
ExtractConfigTask extractUserdev = makeTask(TASK_EXTRACT_USERDEV, ExtractConfigTask.class);
39+
extractUserdev.setDestinationDir(delayedFile(DIR_USERDEV));
40+
extractUserdev.setConfig(CONFIG_USERDEV);
41+
extractUserdev.exclude("META-INF/**", "META-INF/**");
42+
extractUserdev.dependsOn(TASK_DL_VERSION_JSON);
43+
44+
extractUserdev.doLast(new Closure<Boolean>(project) // normalizes to linux endings
45+
{
46+
@Override
47+
public Boolean call()
48+
{
49+
parseAndStoreVersion(delayedFile(JSON_USERDEV).call(), delayedFile(DIR_JSONS).call());
50+
return true;
51+
}
52+
});
53+
54+
// See afterEvaluate for more config
55+
56+
project.getTasks().getByName(TASK_GENERATE_SRGS).dependsOn(extractUserdev);
57+
project.getTasks().getByName(TASK_RECOMPILE).dependsOn(extractUserdev);
58+
project.getTasks().getByName(TASK_MAKE_START).dependsOn(extractUserdev);
59+
}
60+
61+
// setup patching
62+
63+
// add the binPatching task
64+
{
65+
final Object patchedJar = chooseDeobfOutput(global, local, "", "binpatched");
66+
67+
TaskApplyBinPatches task = makeTask("applyBinPatches", TaskApplyBinPatches.class);
68+
task.setInJar(delayedFile(JAR_MERGED));
69+
task.setOutJar(patchedJar);
70+
task.setPatches(delayedFile(BINPATCH_USERDEV));
71+
task.setClassJar(delayedFile(JAR_UD_CLASSES));
72+
task.setResourceJar(delayedTree(ZIP_UD_RES));
73+
task.dependsOn("mergeJars");
74+
75+
project.getTasks().getByName(TASK_DEOBF_BIN).dependsOn(task);
76+
77+
DeobfuscateJar deobf = (DeobfuscateJar) project.getTasks().getByName(TASK_DEOBF_BIN).dependsOn(task);
78+
79+
deobf.setInJar(patchedJar);
80+
deobf.dependsOn(task);
81+
}
82+
83+
// add source patching task
84+
{
85+
final Object decompFixed = chooseDeobfOutput(global, local, "", "decompFixed");
86+
final Object patched = chooseDeobfOutput(global, local, "", "patched");
87+
88+
ProcessSrcJarTask patch = makeTask("processSources", ProcessSrcJarTask.class);
89+
patch.dependsOn("decompile");
90+
patch.setInJar(decompFixed);
91+
patch.setOutJar(patched);
92+
93+
RemapSources remap = (RemapSources) project.getTasks().getByName(TASK_REMAP);
94+
remap.setInJar(patched);
95+
remap.dependsOn(patch);
96+
}
97+
98+
}
99+
100+
@Override
101+
protected void afterEvaluate()
102+
{
103+
// add replacements
104+
T ext = getExtension();
105+
TokenReplacer.putReplacement(REPLACE_API_GROUP, getApiGroup(ext));
106+
TokenReplacer.putReplacement(REPLACE_API_NAME, getApiName(ext));
107+
TokenReplacer.putReplacement(REPLACE_API_VERSION, getApiVersion(ext));
108+
109+
// add userdev dep
110+
project.getDependencies().add(CONFIG_USERDEV, delayedString(""
111+
+ REPLACE_API_GROUP + ":"
112+
+ REPLACE_API_NAME + ":"
113+
+ REPLACE_API_VERSION + ":"
114+
+ getUserdevClassifier(ext) + "@"
115+
+ getUserdevExtension(ext)
116+
));
117+
}
118+
119+
@Override
120+
protected void addAtsToDeobf()
121+
{
122+
// add src ATs
123+
DeobfuscateJar binDeobf = (DeobfuscateJar) project.getTasks().getByName(TASK_DEOBF_BIN);
124+
DeobfuscateJar decompDeobf = (DeobfuscateJar) project.getTasks().getByName(TASK_DEOBF);
125+
126+
// ATs from the ExtensionObject
127+
Object[] extAts = getExtension().getAccessTransformers().toArray();
128+
binDeobf.addTransformer(extAts);
129+
decompDeobf.addTransformer(extAts);
130+
131+
// grab ATs from resource dirs
132+
JavaPluginConvention javaConv = (JavaPluginConvention) project.getConvention().getPlugins().get("java");
133+
SourceSet main = javaConv.getSourceSets().getByName("main");
134+
SourceSet api = javaConv.getSourceSets().getByName("api");
135+
136+
boolean addedAts = false;
137+
138+
for (File at : main.getResources().getFiles())
139+
{
140+
if (at.getName().toLowerCase().endsWith("_at.cfg"))
141+
{
142+
project.getLogger().lifecycle("Found AccessTransformer in main resources: " + at.getName());
143+
binDeobf.addTransformer(at);
144+
decompDeobf.addTransformer(at);
145+
addedAts = true;
146+
}
147+
}
148+
149+
for (File at : api.getResources().getFiles())
150+
{
151+
if (at.getName().toLowerCase().endsWith("_at.cfg"))
152+
{
153+
project.getLogger().lifecycle("Found AccessTransformer in api resources: " + at.getName());
154+
binDeobf.addTransformer(at);
155+
decompDeobf.addTransformer(at);
156+
addedAts = true;
157+
}
158+
}
159+
160+
// TODO: search dependency jars for resources
161+
162+
useLocalCache = useLocalCache || addedAts;
163+
}
164+
165+
@Override
166+
protected void afterDecomp(boolean isDecomp, boolean useLocalCache, String mcConfig)
167+
{
168+
// TODO: add MC dep
169+
}
170+
171+
public abstract String getApiGroup(T ext);
172+
173+
public abstract String getApiName(T ext);
174+
175+
public abstract String getApiVersion(T ext);
176+
177+
public abstract String getUserdevClassifier(T ext);
178+
179+
public abstract String getUserdevExtension(T ext);
180+
181+
//@formatter:off
182+
@Override protected boolean hasServerRun() { return true; }
183+
@Override protected boolean hasClientRun() { return true; }
184+
@Override protected void applyOverlayPlugin() { }
185+
@Override public boolean canOverlayPlugin() { return false; }
186+
@Override protected T getOverlayExtension() { return null; }
187+
//@formatter:on
188+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.minecraftforge.gradle.user.patcherUser;
2+
3+
import static net.minecraftforge.gradle.common.Constants.*;
4+
5+
public final class PatcherUserConstants
6+
{
7+
public static final String CONFIG_USERDEV = "forgeGradleUserDevPackage";
8+
9+
public static final String REPLACE_API_GROUP = "{API_GROUP}";
10+
public static final String REPLACE_API_NAME = "{API_NAME}";
11+
public static final String REPLACE_API_VERSION = "{API_VERSION}";
12+
13+
public static final String DIR_API_BASE = REPLACE_CACHE_DIR + "/" + REPLACE_API_GROUP + "/" + REPLACE_API_NAME + "/" + REPLACE_API_VERSION;
14+
public static final String DIR_API_JAR_BASE = DIR_API_BASE + "/" + REPLACE_MCP_CHANNEL + "/" + REPLACE_MCP_VERSION;
15+
16+
// userdev locations
17+
public static final String DIR_USERDEV = DIR_API_BASE + "/" + "userdev";
18+
public static final String SRG_USERDEV = DIR_USERDEV + "/merged.srg";
19+
public static final String EXC_USERDEV = DIR_USERDEV + "/merged.exc";
20+
public static final String AT_USERDEV = DIR_USERDEV + "/merged_at.cfg";
21+
public static final String JSON_USERDEV = DIR_USERDEV + "/dev.json";
22+
public static final String ZIP_UD_SRC = DIR_USERDEV + "/sources.zip";
23+
public static final String ZIP_UD_RES = DIR_USERDEV + "/resources.zip";
24+
public static final String ZIP_UD_PATCHES = DIR_USERDEV + "/patches.zip";
25+
public static final String JAR_UD_CLASSES = DIR_USERDEV + "/resources.zip";
26+
public static final String BINPATCH_USERDEV = DIR_USERDEV + "/devbinpatches.pack.lzma";
27+
28+
29+
public static final String TASK_EXTRACT_USERDEV = "extractUserdev";
30+
}

0 commit comments

Comments
 (0)