Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package net.ornithemc.osl.core.api.util.sort;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public final class TopoSort {

public static <T> List<T> sort(Collection<T> unsortedNodes, Map<T, Set<T>> incomingEdges) {
Map<T, Node<T>> nodes = unsortedNodes.stream()
.collect(Collectors.toMap(Function.identity(), Node::new));

nodes.forEach((value, node) -> {
Set<T> nodesIn = incomingEdges.get(value);

if (nodesIn != null && !nodesIn.isEmpty()) {
for (T prev : nodesIn) {
Node<T> pred = nodes.get(prev);

if (pred != null) {
node.addPredecessor(pred);
}
}
}
});

return sort(nodes.values());
}

public static <T> List<T> sort(Collection<Node<T>> unsortedNodes) {
List<T> sortedNodes = new ArrayList<>();

while (!unsortedNodes.isEmpty()) {
Iterator<Node<T>> it = unsortedNodes.iterator();

while (it.hasNext()) {
Node<T> node = it.next();

if (node.precedingNodes.isEmpty()) {
it.remove();

sortedNodes.add(node.value);
node.removeSuccessors();
}
}
}

return sortedNodes;
}

private static final class Node<T> {

private final T value;
private final Set<Node<T>> precedingNodes;
private final Set<Node<T>> succedingNodes;

public Node(T value) {
this.value = value;
this.precedingNodes = new HashSet<>();
this.succedingNodes = new HashSet<>();
}

public void addPredecessor(Node<T> node) {
this.precedingNodes.add(node);
node.succedingNodes.add(this);
}

public void removeSuccessors() {
Iterator<Node<T>> it = this.succedingNodes.iterator();

while (it.hasNext()) {
Node<T> node = it.next();

it.remove();
node.precedingNodes.remove(this);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package net.ornithemc.osl.localization.impl;

import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents;
import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders;
import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager;
import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener;

public class LanguageReloader implements ResourceReloadListener {

public static void init() {
ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> {
resourceManager.addReloader(new LanguageReloader());
resourceManager.registerReloader(AssetsReloaders.LANGUAGE_MANAGER, new LanguageReloader());
});
ClientResourceLoaderEvents.START_RESOURCE_RELOAD.register((resourceManager, context) -> {
Localization.getLanguageManager().reload(context.resourcePacks());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package net.ornithemc.osl.localization.impl;

import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents;
import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders;
import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager;
import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener;

public class LanguageReloader implements ResourceReloadListener {

public static void init() {
ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> {
resourceManager.addReloader(new LanguageReloader());
resourceManager.registerReloader(AssetsReloaders.LANGUAGE_MANAGER, new LanguageReloader());
});
ClientResourceLoaderEvents.START_RESOURCE_RELOAD.register((resourceManager, context) -> {
Localization.getLanguageManager().reload(context.resourcePacks());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package net.ornithemc.osl.localization.impl;

import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents;
import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders;
import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager;
import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener;

public class LanguageReloader implements ResourceReloadListener {

public static void init() {
ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> {
resourceManager.addReloader(new LanguageReloader());
resourceManager.registerReloader(AssetsReloaders.LANGUAGE_MANAGER, new LanguageReloader());
});
ClientResourceLoaderEvents.START_RESOURCE_RELOAD.register((resourceManager, context) -> {
Localization.getLanguageManager().reload(context.resourcePacks());
Expand Down
12 changes: 10 additions & 2 deletions libraries/resource-loader/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,8 @@ public class ExampleInitializer implements ClientModInitializer {
@Override
public void initClient() {
ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> {
resourceManager.addReloader(new CookiesManager());
resourceManager.addReloader(new ExampleReloadListener());
resourceManager.registerReloader(CookiesManager.IDENTIFIER, new CookiesManager());
resourceManager.registerReloader(ExampleReloadListener.IDENTIFIER, new ExampleReloadListener());
});
}
}
Expand All @@ -161,11 +161,15 @@ public class ExampleInitializer implements ClientModInitializer {
```java
package com.example;

import net.ornithemc.osl.core.api.util.NamespacedIdentifier;
import net.ornithemc.osl.core.api.util.NamespacedIdentifiers;
import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager;
import net.ornithemc.osl.resource.loader.api.resource.reload.SimpleResourceReloader;

public class CookiesManager implements SimpleResourceReloader<Cookies> {

public static final NamespacedIdentifier IDENTIFIER = NamespacedIdentifiers.from("example", "cookies");

private Cookies cookies;

@Override
Expand All @@ -190,11 +194,15 @@ public class CookiesManager implements SimpleResourceReloader<Cookies> {
```java
package com.example;

import net.ornithemc.osl.core.api.util.NamespacedIdentifier;
import net.ornithemc.osl.core.api.util.NamespacedIdentifiers;
import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager;
import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener;

public class ExampleReloadListener implements ResourceReloadListener {

public static final NamespacedIdentifier IDENTIFIER = NamespacedIdentifiers.from("example", "example");

@Override
public void resourcesReloaded(ResourceManager manager) {
//
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package net.ornithemc.osl.resource.loader.api.client.resource.reload;

import net.ornithemc.osl.core.api.util.NamespacedIdentifier;
import net.ornithemc.osl.resource.loader.api.resource.ResourceType;
import net.ornithemc.osl.resource.loader.impl.resource.reload.ResourceReloaders;

public final class AssetsReloaders {

public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages");
public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures");
public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds");
public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts");
public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts");
public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors");
public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors");
public static final NamespacedIdentifier MODEL_MANAGER = vanilla("models");
public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer");
public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer");
public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer");
public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer");
public static final NamespacedIdentifier SEARCH_REGISTRY = vanilla("search_registry");

public static final NamespacedIdentifier BEFORE_VANILLA = ResourceReloaders.BEFORE_VANILLA;
public static final NamespacedIdentifier AFTER_VANILLA = ResourceReloaders.AFTER_VANILLA;

private static NamespacedIdentifier vanilla(String identifier) {
return ResourceReloaders.vanilla(ResourceType.CLIENT_ASSETS, identifier);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,20 @@
import net.ornithemc.osl.resource.loader.api.resource.Resource;
import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager;
import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack;
import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader;
import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener;
import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager;

public class ResourceManagerAdapter implements net.minecraft.client.resource.manager.ReloadableResourceManager {

private final ResourceMetadataSerializerRegistry metadataSerializers;
private final SimpleReloadableResourceManager resourceManager;
private final ResourceReloaderIdentifier reloaderIdentifier;

public ResourceManagerAdapter(ResourceMetadataSerializerRegistry metadataSerializers, SimpleReloadableResourceManager resourceManager) {
public ResourceManagerAdapter(ResourceMetadataSerializerRegistry metadataSerializers, SimpleReloadableResourceManager resourceManager, ResourceReloaderIdentifier reloaderIdentifier) {
this.metadataSerializers = metadataSerializers;
this.resourceManager = resourceManager;
this.reloaderIdentifier = reloaderIdentifier;
}

@Override
Expand All @@ -46,7 +49,14 @@ public List<net.minecraft.client.resource.Resource> getResources(Identifier loca

@Override
public void addListener(net.minecraft.client.resource.manager.ResourceReloadListener listener) {
this.resourceManager.addReloadedReloader(new WrappedResourceReloadListener(listener));
NamespacedIdentifier identifier = this.reloaderIdentifier.identify(listener);
ResourceReloader reloader = new WrappedResourceReloadListener(listener);

if (identifier == null) {
this.resourceManager.addReloadedReloader(reloader);
} else {
this.resourceManager.registerReloadedReloader(identifier, reloader);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package net.ornithemc.osl.resource.loader.impl.adapter;

import net.minecraft.client.resource.manager.ResourceReloadListener;

import net.ornithemc.osl.core.api.util.NamespacedIdentifier;

public interface ResourceReloaderIdentifier {

NamespacedIdentifier identify(ResourceReloadListener reloader);

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,40 @@
import com.llamalad7.mixinextras.sugar.Local;

import net.minecraft.client.Minecraft;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.TextRenderer;
import net.minecraft.client.render.block.BlockRenderDispatcher;
import net.minecraft.client.render.entity.ItemRenderer;
import net.minecraft.client.render.texture.TextureManager;
import net.minecraft.client.render.world.WorldRenderer;
import net.minecraft.client.resource.language.LanguageManager;
import net.minecraft.client.resource.manager.ReloadableResourceManager;
import net.minecraft.client.resource.manager.ResourceReloadListener;
import net.minecraft.client.resource.metadata.ResourceMetadataSerializerRegistry;
import net.minecraft.client.resource.model.ModelManager;
import net.minecraft.client.resource.pack.BuiltInResourcePack;
import net.minecraft.client.resource.pack.ResourcePack;
import net.minecraft.client.search.SearchRegistry;
import net.minecraft.client.sound.system.SoundManager;
import net.minecraft.client.world.color.FoliageColorReloader;
import net.minecraft.client.world.color.GrassColorReloader;

import net.ornithemc.conditionalmixin.annotations.Conditional;
import net.ornithemc.conditionalmixin.annotations.Version;

import net.ornithemc.osl.core.api.util.NamespacedIdentifier;
import net.ornithemc.osl.core.impl.util.MinecraftVersion;
import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders;
import net.ornithemc.osl.resource.loader.impl.ResourceLoader;
import net.ornithemc.osl.resource.loader.impl.adapter.ResourceManagerAdapter;
import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackLists;
import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager;

@Mixin(Minecraft.class)
public class MinecraftMixin {

private static final boolean SEARCH_REGISTRY_EXISTS = MinecraftVersion.resolve().compareTo("1.12-pre6") >= 0;

@Shadow @Final
private ResourceMetadataSerializerRegistry resourceMetadataSerializerRegistry;
@Shadow @Final
Expand All @@ -35,6 +57,30 @@ public class MinecraftMixin {
@Shadow
private ReloadableResourceManager resourceManager;

@Shadow
private LanguageManager languageManager;
@Shadow
private TextureManager textureManager;
@Shadow
private SoundManager soundManager;
@Shadow
private TextRenderer textRenderer;
@Shadow
private TextRenderer enchantingPhraseRenderer;
@Shadow
private ModelManager modelManager;
@Shadow
private ItemRenderer itemRenderer;
@Shadow
private GameRenderer gameRenderer;
@Shadow
private BlockRenderDispatcher blockRenderer;
@Shadow
private WorldRenderer worldRenderer;
@Conditional(minecraftVersion = @Version(">=1.12-pre6"))
@Shadow
private SearchRegistry searchRegistry;

@Unique
private SimpleReloadableResourceManager actualResourceManager;

Expand All @@ -49,7 +95,7 @@ public class MinecraftMixin {
)
private void osl$resource_loader$setResourceManager(CallbackInfo ci) {
this.actualResourceManager = SimpleReloadableResourceManager.client();
this.resourceManager = new ResourceManagerAdapter(this.resourceMetadataSerializerRegistry, this.actualResourceManager);
this.resourceManager = new ResourceManagerAdapter(this.resourceMetadataSerializerRegistry, this.actualResourceManager, this::identifyReloadListener);

this.actualResourceManager.reset();
// this.actualResourceManager.addAll(this.packRepository.openSelectedPacks()); // handled by Vanilla
Expand Down Expand Up @@ -83,4 +129,38 @@ public class MinecraftMixin {

ResourcePackLists.fixSelection(selection, false);
}

private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) {
if (listener == this.languageManager) {
return AssetsReloaders.LANGUAGE_MANAGER;
} else if (listener == this.textureManager) {
return AssetsReloaders.TEXTURE_MANAGER;
} else if (listener == this.soundManager) {
return AssetsReloaders.SOUND_MANAGER;
} else if (listener == this.textRenderer) {
return AssetsReloaders.FONT_MANAGER;
} else if (listener == this.enchantingPhraseRenderer) {
return AssetsReloaders.ENCHANTING_PHRASE_FONT_MANAGER;
} else if (listener instanceof GrassColorReloader) {
return AssetsReloaders.GRASS_COLORS;
} else if (listener instanceof FoliageColorReloader) {
return AssetsReloaders.FOLIAGE_COLORS;
} else if (listener == this.modelManager) {
return AssetsReloaders.MODEL_MANAGER;
} else if (listener == this.itemRenderer) {
return AssetsReloaders.ITEM_RENDERER;
} else if (listener == this.gameRenderer) {
return AssetsReloaders.GAME_RENDERER;
} else if (listener == this.blockRenderer) {
return AssetsReloaders.BLOCK_RENDERER;
} else if (listener == this.worldRenderer) {
return AssetsReloaders.WORLD_RENDERER;
} else if (SEARCH_REGISTRY_EXISTS && listener == this.searchRegistry) {
return AssetsReloaders.SEARCH_REGISTRY;
} else {
ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener);
}

return null;
}
}
Loading
Loading