-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WIP: Automatically generate fake item asset entries for skyblock items
- Loading branch information
Showing
5 changed files
with
121 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<!-- | ||
SPDX-FileCopyrightText: 2023 Linnea Gräf <[email protected]> | ||
SPDX-License-Identifier: CC0-1.0 | ||
--> | ||
|
||
# Technical Notes for the texture pack implementation | ||
|
||
Relevant classes: | ||
|
||
`ItemModelManager` can be used to select an `ItemModel`. This is done from the `ITEM_MODEL` component which is defaulted by the `Item` class. | ||
|
||
The list of available `ItemModel`s (as in `Identifier` -> `ItemModel` maps) is loaded by `BakedModelManager`. To this end, item models in particular are loaded from `ItemAssetsLoader#load`. Those `ItemAssets` are found in `assets/<ns>/items/` directly (not in the model folder) and can be used to select other models, similar to how predicates used to work |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
79 changes: 79 additions & 0 deletions
79
src/texturePacks/java/moe/nea/firmament/mixins/custommodels/SupplyFakeModelPatch.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
package moe.nea.firmament.mixins.custommodels; | ||
|
||
import com.llamalad7.mixinextras.injector.ModifyReturnValue; | ||
import com.llamalad7.mixinextras.sugar.Local; | ||
import net.minecraft.client.item.ItemAsset; | ||
import net.minecraft.client.item.ItemAssetsLoader; | ||
import net.minecraft.client.render.item.model.BasicItemModel; | ||
import net.minecraft.resource.Resource; | ||
import net.minecraft.resource.ResourceManager; | ||
import net.minecraft.resource.ResourcePack; | ||
import net.minecraft.util.Identifier; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.injection.At; | ||
|
||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Optional; | ||
import java.util.concurrent.CompletableFuture; | ||
import java.util.concurrent.Executor; | ||
import java.util.stream.Collector; | ||
import java.util.stream.Collectors; | ||
|
||
@Mixin(ItemAssetsLoader.class) | ||
public class SupplyFakeModelPatch { | ||
|
||
@ModifyReturnValue( | ||
method = "load", | ||
at = @At("RETURN") | ||
) | ||
private static CompletableFuture<ItemAssetsLoader.Result> injectFakeGeneratedModels( | ||
CompletableFuture<ItemAssetsLoader.Result> original, | ||
@Local(argsOnly = true) ResourceManager resourceManager, | ||
@Local(argsOnly = true) Executor executor | ||
) { | ||
return original.thenCompose(oldModels -> CompletableFuture.supplyAsync(() -> supplyExtraModels(resourceManager, oldModels), executor)); | ||
} | ||
|
||
private static ItemAssetsLoader.Result supplyExtraModels(ResourceManager resourceManager, ItemAssetsLoader.Result oldModels) { | ||
Map<Identifier, ItemAsset> newModels = new HashMap<>(oldModels.contents()); | ||
var resources = resourceManager.findResources( | ||
"models/item", | ||
id -> id.getNamespace().equals("firmskyblock") | ||
&& id.getPath().endsWith(".json") | ||
&& !id.getPath().substring("models/item/".length()).contains("/")); | ||
for (Map.Entry<Identifier, Resource> model : resources.entrySet()) { | ||
var resource = model.getValue(); | ||
var itemModelId = model.getKey().withPath(it -> it.substring("models/item/".length(), it.length() - ".json".length())); | ||
// TODO: parse json file here and make use of it in order to generate predicate files. | ||
var genericModelId = itemModelId.withPrefixedPath("item/"); | ||
if (resourceManager.getResource(itemModelId) | ||
.map(Resource::getPack) | ||
.map(it -> isResourcePackNewer(resourceManager, it, resource.getPack())) | ||
.orElse(true)) { | ||
newModels.put(itemModelId, new ItemAsset( | ||
new BasicItemModel.Unbaked(genericModelId, List.of()), | ||
new ItemAsset.Properties(true) | ||
)); | ||
} | ||
} | ||
return new ItemAssetsLoader.Result(newModels); | ||
} | ||
|
||
private static boolean isResourcePackNewer( | ||
ResourceManager manager, | ||
ResourcePack null_, ResourcePack proposal) { | ||
var pack = manager.streamResourcePacks() | ||
.filter(it -> it == null_ || it == proposal) | ||
.collect(findLast()); | ||
return pack.orElse(null) == proposal; | ||
} | ||
|
||
private static <T> Collector<T, ?, Optional<T>> findLast() { | ||
return Collectors.reducing(Optional.empty(), Optional::of, | ||
(left, right) -> right.isPresent() ? right : left); | ||
|
||
} | ||
|
||
} |