Skip to content

Commit

Permalink
Add an event to register custom sprite source types
Browse files Browse the repository at this point in the history
  • Loading branch information
Minecraftschurli committed Nov 1, 2023
1 parent 7357532 commit 3bc2c25
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/net/minecraft/client/renderer/texture/atlas/SpriteSources.java
+++ b/net/minecraft/client/renderer/texture/atlas/SpriteSources.java
@@ -16,7 +16,7 @@

@OnlyIn(Dist.CLIENT)
public class SpriteSources {
- private static final BiMap<ResourceLocation, SpriteSourceType> TYPES = HashBiMap.create();
+ private static final BiMap<ResourceLocation, SpriteSourceType> TYPES = net.neoforged.neoforge.client.ClientHooks.makeSpriteSourceTypesMap();
public static final SpriteSourceType SINGLE_FILE = register("single", SingleFile.CODEC);
public static final SpriteSourceType DIRECTORY = register("directory", DirectoryLister.CODEC);
public static final SpriteSourceType FILTER = register("filter", SourceFilter.CODEC);
15 changes: 15 additions & 0 deletions src/main/java/net/neoforged/neoforge/client/ClientHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

package net.neoforged.neoforge.client;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.platform.NativeImage;
import com.mojang.blaze3d.platform.Window;
Expand Down Expand Up @@ -75,6 +77,7 @@
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.atlas.SpriteSourceType;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.Material;
Expand Down Expand Up @@ -146,6 +149,7 @@
import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent;
import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent;
import net.neoforged.neoforge.client.event.RegisterShadersEvent;
import net.neoforged.neoforge.client.event.RegisterSpriteSourceTypesEvent;
import net.neoforged.neoforge.client.event.RenderArmEvent;
import net.neoforged.neoforge.client.event.RenderBlockScreenEffectEvent;
import net.neoforged.neoforge.client.event.RenderHandEvent;
Expand Down Expand Up @@ -1045,6 +1049,16 @@ public static void onCreativeModeTabBuildContents(CreativeModeTab tab, ResourceK
output.accept(entry.getKey(), entry.getValue());
}

private static final BiMap<ResourceLocation, SpriteSourceType> SPRITE_SOURCE_TYPES_MAP = HashBiMap.create();

public static BiMap<ResourceLocation, SpriteSourceType> makeSpriteSourceTypesMap() {
return SPRITE_SOURCE_TYPES_MAP;
}

public static void registerSpriteSourceTypes() {
ModLoader.get().postEvent(new RegisterSpriteSourceTypesEvent(SPRITE_SOURCE_TYPES_MAP));
}

// Make sure the below method is only ever called once (by forge).
private static boolean initializedClientHooks = false;

Expand All @@ -1057,6 +1071,7 @@ public static void initClientHooks(Minecraft mc, ReloadableResourceManager resou
initializedClientHooks = true;

GameTestHooks.registerGametests();
registerSpriteSourceTypes();
ModLoader.get().postEvent(new RegisterClientReloadListenersEvent(resourceManager));
ModLoader.get().postEvent(new EntityRenderersEvent.RegisterLayerDefinitions());
ModLoader.get().postEvent(new EntityRenderersEvent.RegisterRenderers());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright (c) NeoForged and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/

package net.neoforged.neoforge.client.event;

import com.google.common.collect.BiMap;
import com.mojang.serialization.Codec;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.atlas.SpriteSource;
import net.minecraft.client.renderer.texture.atlas.SpriteSourceType;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.bus.api.Event;
import net.neoforged.bus.api.ICancellableEvent;
import net.neoforged.fml.LogicalSide;
import net.neoforged.fml.event.IModBusEvent;
import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext;

/**
* Fired to allow mods to register their own {@linkplain SpriteSourceType}. This event is fired once during the construction of the {@link Minecraft} instance or before datagen when client datagen is enabled.
*
* <p>This event is not {@linkplain ICancellableEvent cancellable}, and does not {@linkplain HasResult have a result}.</p>
*
* <p>This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus},
* only on the {@linkplain LogicalSide#CLIENT logical client}.</p>
*/
public class RegisterSpriteSourceTypesEvent extends Event implements IModBusEvent {
private final BiMap<ResourceLocation, SpriteSourceType> types;

public RegisterSpriteSourceTypesEvent(BiMap<ResourceLocation, SpriteSourceType> types) {
this.types = types;
}

/**
* Registers the given {@link Codec} as SpriteSourceType under the given id.
*
* @param id The id to register the {@link SpriteSourceType} under
* @param codec The codec for the {@link SpriteSourceType} to register
*/
public SpriteSourceType register(ResourceLocation id, Codec<? extends SpriteSource> codec) {
if (this.types.containsKey(id)) {
throw new IllegalStateException("Duplicate sprite source type registration " + id);
}
SpriteSourceType sourceType = new SpriteSourceType(codec);
this.types.put(id, sourceType);
return sourceType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.minecraft.server.Bootstrap;
import net.neoforged.fml.ModLoader;
import net.neoforged.fml.ModWorkManager;
import net.neoforged.neoforge.client.ClientHooks;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import org.apache.logging.log4j.LogManager;
Expand Down Expand Up @@ -47,6 +48,9 @@ public static void begin(final Set<String> mods, final Path path, final Collecti
// If we aren't generating data for forge, automatically add forge as an existing so mods can access forge's data
existingMods.add("neoforge");
}
if (clientGenerators) {
ClientHooks.registerSpriteSourceTypes();
}
existingFileHelper = new ExistingFileHelper(existingPacks, existingMods, structureValidator, assetIndex, assetsDir);
ModLoader.get().runEventGenerator(mc -> new GatherDataEvent(mc, dataGeneratorConfig.makeGenerator(p -> dataGeneratorConfig.isFlat() ? p : p.resolve(mc.getModId()),
dataGeneratorConfig.getMods().contains(mc.getModId())), dataGeneratorConfig, existingFileHelper));
Expand Down
9 changes: 8 additions & 1 deletion src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -505,4 +505,11 @@ public net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType <
protected net.minecraft.world.level.portal.PortalForcer level # level
public net.minecraft.world.level.storage.LevelResource <init>(Ljava/lang/String;)V # constructor
private-f net.minecraft.world.level.storage.loot.LootPool rolls # rolls
private-f net.minecraft.world.level.storage.loot.LootPool bonusRolls # bonusRolls
private-f net.minecraft.world.level.storage.loot.LootPool bonusRolls # bonusRolls
public net.minecraft.client.renderer.texture.atlas.sources.PalettedPermutations <init>(Ljava/util/List;Lnet/minecraft/resources/ResourceLocation;Ljava/util/Map;)V # constructor
public net.minecraft.client.renderer.texture.atlas.sources.PalettedPermutations$PalettedSpriteSupplier
public net.minecraft.client.renderer.texture.atlas.sources.PalettedPermutations$PalettedSpriteSupplier <init>(Lnet/minecraft/client/renderer/texture/atlas/sources/LazyLoadedImage;Ljava/util/function/Supplier;Lnet/minecraft/resources/ResourceLocation;)V # constructor
public net.minecraft.client.renderer.texture.atlas.sources.Unstitcher$Region
public net.minecraft.client.renderer.texture.atlas.sources.Unstitcher$Region <init>(Lnet/minecraft/resources/ResourceLocation;DDDD)V # constructor
public net.minecraft.client.renderer.texture.atlas.sources.Unstitcher$RegionInstance
public net.minecraft.client.renderer.texture.atlas.sources.Unstitcher$RegionInstance <init>(Lnet/minecraft/client/renderer/texture/atlas/sources/LazyLoadedImage;Lnet/minecraft/client/renderer/texture/atlas/sources/Unstitcher$Region;DD)V # constructor

0 comments on commit 3bc2c25

Please sign in to comment.