Skip to content

Commit

Permalink
block/item model queue system
Browse files Browse the repository at this point in the history
  • Loading branch information
UselessBullets committed May 7, 2024
1 parent aa2b1d3 commit de4e1e7
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 5 deletions.
20 changes: 20 additions & 0 deletions src/main/java/turniplabs/halplibe/helper/BlockBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,37 @@
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import turniplabs.halplibe.HalpLibe;
import turniplabs.halplibe.mixin.mixins.models.BlockModelDispatcherMixin;
import turniplabs.halplibe.util.registry.IdSupplier;
import turniplabs.halplibe.util.registry.RunLengthConfig;
import turniplabs.halplibe.util.registry.RunReserves;
import turniplabs.halplibe.util.toml.Toml;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

public class BlockBuilder implements Cloneable {
/**
* Used in {@link BlockModelDispatcherMixin#addQueuedModels(CallbackInfo)}
*/
private static boolean blockDispatcherInitialized = false;
private static final Map<Block, Function<Block, BlockModel<?>>> queuedBlockModels = new HashMap<>();
public static void queueBlockModel(@NotNull Block block, @NotNull Function<Block, BlockModel<?>> blockModelSupplier){
if (!HalpLibe.isClient) return;
if (blockDispatcherInitialized){
BlockModelDispatcher.getInstance().addDispatch(blockModelSupplier.apply(block));
return;
}
queuedBlockModels.put(block, blockModelSupplier);
}
private final String MOD_ID;
private Float hardness = null;
private Float resistance = null;
Expand Down Expand Up @@ -376,7 +393,10 @@ public <T extends Block> T build(T block) {
block.withTags(tags);
}

queueBlockModel(block, blockModelSupplier);
ItemHelper.queueItemModel(itemBlock, customItemModelSupplier);
if (HalpLibe.isClient){

BlockModelDispatcher.getInstance().addDispatch(blockModelSupplier.apply(block));
ItemModelDispatcher.getInstance().addDispatch(customItemModelSupplier.apply(itemBlock));
}
Expand Down
23 changes: 18 additions & 5 deletions src/main/java/turniplabs/halplibe/helper/ItemHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,37 @@
import net.minecraft.core.item.Item;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import turniplabs.halplibe.HalpLibe;
import turniplabs.halplibe.mixin.mixins.models.ItemModelDispatcherMixin;
import turniplabs.halplibe.util.registry.IdSupplier;
import turniplabs.halplibe.util.registry.RunLengthConfig;
import turniplabs.halplibe.util.registry.RunReserves;
import turniplabs.halplibe.util.toml.Toml;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

abstract public class ItemHelper {
/**
* Used in {@link ItemModelDispatcherMixin#addQueuedModels(CallbackInfo)}
*/
private static boolean itemDispatcherInitialized = false;
private static final Map<Item, Function<? extends Item, ItemModel>> queuedItemModels = new HashMap<>();
public static <T extends Item> void queueItemModel(@NotNull T item, @NotNull Function<T, ItemModel> itemModelSupplier){
if (!HalpLibe.isClient) return;
if (itemDispatcherInitialized){
ItemModelDispatcher.getInstance().addDispatch(itemModelSupplier.apply(item));
return;
}
queuedItemModels.put(item, itemModelSupplier);
}

public static <T extends Item> T createItem(@NotNull String modId, @NotNull T item){
return createItem(modId, item, (i) -> new ItemModelStandard(i, modId));
Expand All @@ -34,9 +49,7 @@ public static <T extends Item> T createItem(@NotNull String modId, @NotNull T it
newTokens.add(modId);
newTokens.addAll(tokens.subList(1, tokens.size()));

if (HalpLibe.isClient){
ItemModelDispatcher.getInstance().addDispatch(itemModelSupplier.apply(item));
}
queueItemModel(item, itemModelSupplier);

return (T) item.setKey(StringUtils.join(newTokens, "."));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package turniplabs.halplibe.mixin.mixins.models;

import net.minecraft.client.render.block.model.BlockModel;
import net.minecraft.client.render.block.model.BlockModelDispatcher;
import net.minecraft.core.block.Block;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import turniplabs.halplibe.helper.BlockBuilder;

import java.util.Map;
import java.util.Set;
import java.util.function.Function;

@Mixin(value = BlockModelDispatcher.class, remap = false)
public abstract class BlockModelDispatcherMixin {
@Shadow public abstract void addDispatch(BlockModel dispatchable);

@Inject(method = "<init>()V", at = @At("TAIL"))
private void addQueuedModels(CallbackInfo ci){
try {
Set<Map.Entry<Block, Function<Block, BlockModel<?>>>>entries = ((Map<Block, Function<Block, BlockModel<?>>>) BlockBuilder.class.getField("queuedBlockModels").get(null)).entrySet();
for (Map.Entry<Block, Function<Block, BlockModel<?>>> entry : entries){
addDispatch(entry.getValue().apply(entry.getKey()));
}
BlockBuilder.class.getField("blockDispatcherInitialized").set(null, true);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package turniplabs.halplibe.mixin.mixins.models;

import net.minecraft.client.render.item.model.ItemModel;
import net.minecraft.client.render.item.model.ItemModelDispatcher;
import net.minecraft.core.item.Item;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import turniplabs.halplibe.helper.ItemHelper;

import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@Mixin(value = ItemModelDispatcher.class, remap = false)
public abstract class ItemModelDispatcherMixin {
@Shadow public abstract void addDispatch(ItemModel dispatchable);

@Inject(method = "<init>()V", at = @At("TAIL"))
private void addQueuedModels(CallbackInfo ci){
try {
Set<Map.Entry<Item, Function<Item, ItemModel>>> entries = ((Map<Item, Function<Item, ItemModel>>) ItemHelper.class.getField("queuedItemModels").get(null)).entrySet();
for (Map.Entry<Item, Function<Item, ItemModel>> entry : entries){
addDispatch(entry.getValue().apply(entry.getKey()));
}
ItemHelper.class.getField("itemDispatcherInitialized").set(null, true);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
2 changes: 2 additions & 0 deletions src/main/resources/halplibe.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
"mixins.I18nMixin",
"mixins.NetClientHandlerMixin",
"mixins.commands.CommandsCoreMixin",
"mixins.models.BlockModelDispatcherMixin",
"mixins.models.ItemModelDispatcherMixin",
"mixins.network.PacketMixin",
"mixins.registry.BlockMixin",
"mixins.registry.ItemMixin"
Expand Down

0 comments on commit de4e1e7

Please sign in to comment.