Skip to content

Commit debcb7a

Browse files
committed
Initial work on script resources
1 parent 1ac55b4 commit debcb7a

File tree

13 files changed

+166
-0
lines changed

13 files changed

+166
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.groovymc.cgl.api.resources
2+
3+
import com.mojang.datafixers.util.Pair
4+
import groovy.transform.CompileStatic
5+
import groovy.transform.TupleConstructor
6+
import groovy.transform.VisibilityOptions
7+
import groovy.transform.options.Visibility
8+
import groovy.transform.stc.ClosureParams
9+
import groovy.transform.stc.FromAbstractTypeMethods
10+
import net.minecraft.resources.ResourceLocation
11+
import org.groovymc.cgl.impl.resources.ScriptResourceListener
12+
13+
@CompileStatic
14+
@TupleConstructor(visibilityId = 'private')
15+
@VisibilityOptions(id = 'private', value = Visibility.PRIVATE)
16+
final class ScriptResourceProvider<T> {
17+
final ResourceLocation prefix
18+
final Class<? super T> clazz
19+
20+
Closure getResource(ResourceLocation id) {
21+
return ScriptResourceListener.SCRIPTS.getOrDefault(prefix, new LinkedHashMap<ResourceLocation, Closure>()).get(id)
22+
}
23+
24+
void getResources(@ClosureParams(value = FromAbstractTypeMethods, options = ['org.groovymc.cgl.impl.resources.ResourceConsumer']) Closure resourceConsumer) {
25+
ScriptResourceListener.SCRIPTS.getOrDefault(prefix, new LinkedHashMap<ResourceLocation, Closure>()).each { id, closure ->
26+
if (resourceConsumer.getMaximumNumberOfParameters() == 2) {
27+
resourceConsumer.call(id, closure)
28+
} else {
29+
resourceConsumer.call(new Pair<>(id, closure))
30+
}
31+
}
32+
}
33+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.groovymc.cgl.impl.resources
2+
3+
import org.codehaus.groovy.control.CompilerConfiguration
4+
5+
interface ResourceCompilerCustomizer {
6+
void customize(CompilerConfiguration compilerConfiguration)
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.groovymc.cgl.impl.resources
2+
3+
import com.mojang.datafixers.util.Pair
4+
import net.minecraft.resources.ResourceLocation
5+
6+
abstract class ResourceConsumer {
7+
abstract void accept(ResourceLocation id, Closure resource)
8+
abstract void accept(Pair<ResourceLocation, Closure> resource)
9+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.groovymc.cgl.impl.resources
2+
3+
import groovy.transform.CompileStatic
4+
import net.minecraft.resources.FileToIdConverter
5+
import net.minecraft.resources.ResourceLocation
6+
import net.minecraft.server.packs.resources.ResourceManager
7+
import net.minecraft.server.packs.resources.SimplePreparableReloadListener
8+
import net.minecraft.util.profiling.ProfilerFiller
9+
import org.codehaus.groovy.control.CompilerConfiguration
10+
11+
@CompileStatic
12+
class ScriptResourceListener extends SimplePreparableReloadListener<Map<ResourceLocation, Map<ResourceLocation, Closure>>> {
13+
public static final Map<ResourceLocation, Map<ResourceLocation, Closure>> SCRIPTS = [:]
14+
public static final Map<ResourceLocation, Class<?>> PREFIXES = [:]
15+
16+
public static final ResourceCompilerCustomizer CUSTOMIZER = ServiceLoader.load(ResourceCompilerCustomizer.class, ScriptResourceListener.classLoader)
17+
.findFirst().orElseThrow {
18+
new NullPointerException("Failed to load compiler customizer service for platform")
19+
}
20+
21+
public static final CompilerConfiguration COMPILER_CONFIGURATION = new CompilerConfiguration().tap {
22+
CUSTOMIZER.customize(it)
23+
}
24+
public static final GroovyShell SHELL = new GroovyShell(ScriptResourceListener.classLoader, COMPILER_CONFIGURATION)
25+
26+
@Override
27+
protected Map<ResourceLocation, Map<ResourceLocation, Closure>> prepare(ResourceManager resourceManager, ProfilerFiller profiler) {
28+
SCRIPTS.clear()
29+
PREFIXES.each { prefix, contextType ->
30+
FileToIdConverter fileToIdConverter = new FileToIdConverter("$prefix.namespace/$prefix.path", ".groovy")
31+
32+
fileToIdConverter.listMatchingResources(resourceManager).each { fileLocation, resource ->
33+
var idLocation = fileToIdConverter.fileToId(fileLocation)
34+
35+
try (Reader reader = resource.openAsReader()) {
36+
Closure closure = SHELL.evaluate("""
37+
{ context ->
38+
${reader.text}
39+
}
40+
""") as Closure
41+
SCRIPTS.computeIfAbsent(prefix, { [:] }).put(idLocation, closure)
42+
}
43+
}
44+
}
45+
46+
return SCRIPTS
47+
}
48+
49+
@Override
50+
protected void apply(Map<ResourceLocation, Map<ResourceLocation, Closure>> object, ResourceManager resourceManager, ProfilerFiller profiler) {
51+
// We've already provessed scripts
52+
}
53+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@ApiStatus.Internal package org.groovymc.cgl.impl.resources;
2+
3+
import org.jetbrains.annotations.ApiStatus;

Forge/src/main/groovy/org/groovymc/cgl/impl/forge/CGLForge.groovy

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ package org.groovymc.cgl.impl.forge
77

88
import groovy.transform.CompileStatic
99
import groovy.transform.stc.POJO
10+
import net.minecraftforge.event.AddReloadListenerEvent
1011
import org.groovymc.cgl.impl.CommonGroovyLibrary
12+
import org.groovymc.cgl.impl.resources.ScriptResourceListener
1113
import org.groovymc.gml.GMod
1214
import org.jetbrains.annotations.ApiStatus
1315

@@ -16,4 +18,9 @@ import org.jetbrains.annotations.ApiStatus
1618
@GMod(CommonGroovyLibrary.MOD_ID)
1719
@ApiStatus.Internal
1820
class CGLForge {
21+
CGLForge() {
22+
forgeBus.addListener(AddReloadListenerEvent) { event ->
23+
event.addListener(new ScriptResourceListener())
24+
}
25+
}
1926
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.groovymc.cgl.impl.forge.resources
2+
3+
import com.google.auto.service.AutoService
4+
import org.codehaus.groovy.control.CompilerConfiguration
5+
import org.groovymc.cgl.impl.resources.ResourceCompilerCustomizer
6+
7+
@AutoService(ResourceCompilerCustomizer.class)
8+
class ResourceCompilerCustomizerImpl implements ResourceCompilerCustomizer {
9+
@Override
10+
void customize(CompilerConfiguration compilerConfiguration) {
11+
// Nothing needs done on forge
12+
}
13+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@ApiStatus.Internal
2+
package org.groovymc.cgl.impl.forge.resources;
3+
4+
import org.jetbrains.annotations.ApiStatus;

Quilt/src/main/groovy/org/groovymc/cgl/impl/quilt/CGLQuilt.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ package org.groovymc.cgl.impl.quilt
88
import org.groovymc.cgl.impl.CommonGroovyLibrary
99

1010
CommonGroovyLibrary.LOGGER.info('CGL Quilt initialised')
11+
12+
// TODO: register listener
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@ApiStatus.Internal
2+
package org.groovymc.cgl.impl.quilt;
3+
4+
import org.jetbrains.annotations.ApiStatus;

0 commit comments

Comments
 (0)