Fixed Bogey registry loading flywheel classes

This commit is contained in:
simibubi 2023-05-13 15:16:51 +02:00
parent e83fd736da
commit 49166f8dab
2 changed files with 54 additions and 32 deletions

View file

@ -23,6 +23,8 @@ import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
public class AllBogeyStyles { public class AllBogeyStyles {
public static final Map<ResourceLocation, BogeyStyle> BOGEY_STYLES = new HashMap<>(); public static final Map<ResourceLocation, BogeyStyle> BOGEY_STYLES = new HashMap<>();
@ -36,10 +38,10 @@ public class AllBogeyStyles {
public static final String STANDARD_CYCLE_GROUP = "standard"; public static final String STANDARD_CYCLE_GROUP = "standard";
public static final BogeyStyle STANDARD = public static final BogeyStyle STANDARD =
create("standard", STANDARD_CYCLE_GROUP).commonRenderer(CommonStandardBogeyRenderer::new) create("standard", STANDARD_CYCLE_GROUP).commonRenderer(() -> CommonStandardBogeyRenderer::new)
.displayName(Components.translatable("create.bogey.style.standard")) .displayName(Components.translatable("create.bogey.style.standard"))
.size(BogeySizes.SMALL, SmallStandardBogeyRenderer::new, AllBlocks.SMALL_BOGEY) .size(BogeySizes.SMALL, () -> SmallStandardBogeyRenderer::new, AllBlocks.SMALL_BOGEY)
.size(BogeySizes.LARGE, LargeStandardBogeyRenderer::new, AllBlocks.LARGE_BOGEY) .size(BogeySizes.LARGE, () -> LargeStandardBogeyRenderer::new, AllBlocks.LARGE_BOGEY)
.build(); .build();
private static BogeyStyleBuilder create(String name, String cycleGroup) { private static BogeyStyleBuilder create(String name, String cycleGroup) {
@ -53,7 +55,7 @@ public class AllBogeyStyles {
public static void register() {} public static void register() {}
public static class BogeyStyleBuilder { public static class BogeyStyleBuilder {
protected final Map<BogeySizes.BogeySize, BogeyStyle.SizeData> sizes = new HashMap<>(); protected final Map<BogeySizes.BogeySize, Supplier<BogeyStyle.SizeData>> sizes = new HashMap<>();
protected final ResourceLocation name; protected final ResourceLocation name;
protected final ResourceLocation cycleGroup; protected final ResourceLocation cycleGroup;
@ -84,15 +86,18 @@ public class AllBogeyStyles {
return this; return this;
} }
public BogeyStyleBuilder size(BogeySizes.BogeySize size, Supplier<? extends BogeyRenderer> renderer, public BogeyStyleBuilder size(BogeySizes.BogeySize size, Supplier<Supplier<? extends BogeyRenderer>> renderer,
BlockEntry<? extends AbstractBogeyBlock<?>> blockEntry) { BlockEntry<? extends AbstractBogeyBlock<?>> blockEntry) {
this.size(size, renderer, blockEntry.getId()); this.size(size, renderer, blockEntry.getId());
return this; return this;
} }
public BogeyStyleBuilder size(BogeySizes.BogeySize size, Supplier<? extends BogeyRenderer> renderer, public BogeyStyleBuilder size(BogeySizes.BogeySize size, Supplier<Supplier<? extends BogeyRenderer>> renderer,
ResourceLocation location) { ResourceLocation location) {
this.sizes.put(size, new BogeyStyle.SizeData(location, renderer, renderer.get())); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
this.sizes.put(size, () -> new BogeyStyle.SizeData(location, renderer.get(), renderer.get()
.get()));
});
return this; return this;
} }
@ -106,16 +111,19 @@ public class AllBogeyStyles {
return this; return this;
} }
public BogeyStyleBuilder commonRenderer(Supplier<? extends CommonRenderer> commonRenderer) { public BogeyStyleBuilder commonRenderer(Supplier<Supplier<? extends CommonRenderer>> commonRenderer) {
this.commonRenderer = Optional.of(commonRenderer); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
this.commonRenderer = Optional.of(commonRenderer.get());
});
return this; return this;
} }
public BogeyStyle build() { public BogeyStyle build() {
BogeyStyle entry = BogeyStyle entry = new BogeyStyle(name, cycleGroup, displayName, soundType, contactParticle, smokeParticle,
new BogeyStyle(name, cycleGroup, displayName, soundType, contactParticle, smokeParticle, defaultData, sizes, commonRenderer); defaultData, sizes, commonRenderer);
BOGEY_STYLES.put(name, entry); BOGEY_STYLES.put(name, entry);
CYCLE_GROUPS.computeIfAbsent(cycleGroup, l -> new HashMap<>()).put(name, entry); CYCLE_GROUPS.computeIfAbsent(cycleGroup, l -> new HashMap<>())
.put(name, entry);
return entry; return entry;
} }
} }

View file

@ -1,10 +1,18 @@
package com.simibubi.create.content.logistics.trains.entity; package com.simibubi.create.content.logistics.trains.entity;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Stream;
import org.jetbrains.annotations.NotNull;
import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.api.MaterialManager;
import com.simibubi.create.AllBogeyStyles; import com.simibubi.create.AllBogeyStyles;
import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents;
import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer;
import com.simibubi.create.content.logistics.trains.BogeyRenderer.CommonRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer.CommonRenderer;
import com.simibubi.create.content.logistics.trains.BogeySizes; import com.simibubi.create.content.logistics.trains.BogeySizes;
@ -14,32 +22,32 @@ import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class BogeyStyle { public class BogeyStyle {
private final Optional<Supplier<? extends CommonRenderer>> commonRendererFactory;
public final ResourceLocation name; public final ResourceLocation name;
public final ResourceLocation cycleGroup; public final ResourceLocation cycleGroup;
private final Optional<CommonRenderer> commonRenderer;
private final Map<BogeySizes.BogeySize, SizeData> sizes;
public final Component displayName; public final Component displayName;
public final ResourceLocation soundType; public final ResourceLocation soundType;
public final ParticleOptions contactParticle; public final ParticleOptions contactParticle;
public final ParticleOptions smokeParticle; public final ParticleOptions smokeParticle;
public final CompoundTag defaultData; public final CompoundTag defaultData;
private Optional<Supplier<? extends CommonRenderer>> commonRendererFactory;
@OnlyIn(Dist.CLIENT)
private Map<BogeySizes.BogeySize, SizeData> sizes;
@OnlyIn(Dist.CLIENT)
private Optional<CommonRenderer> commonRenderer;
public BogeyStyle(ResourceLocation name, ResourceLocation cycleGroup, Component displayName, ResourceLocation soundType, ParticleOptions contactParticle, ParticleOptions smokeParticle, public BogeyStyle(ResourceLocation name, ResourceLocation cycleGroup, Component displayName, ResourceLocation soundType, ParticleOptions contactParticle, ParticleOptions smokeParticle,
CompoundTag defaultData, Map<BogeySizes.BogeySize, SizeData> sizes, Optional<Supplier<? extends CommonRenderer>> commonRenderer) { CompoundTag defaultData, Map<BogeySizes.BogeySize, Supplier<SizeData>> sizes, Optional<Supplier<? extends CommonRenderer>> commonRenderer) {
this.name = name; this.name = name;
this.cycleGroup = cycleGroup; this.cycleGroup = cycleGroup;
this.displayName = displayName; this.displayName = displayName;
@ -48,10 +56,13 @@ public class BogeyStyle {
this.smokeParticle = smokeParticle; this.smokeParticle = smokeParticle;
this.defaultData = defaultData; this.defaultData = defaultData;
this.sizes = sizes; DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {
this.sizes = new HashMap<>();
this.commonRendererFactory = commonRenderer; sizes.forEach((k, v) -> this.sizes.put(k, v.get()));
this.commonRenderer = commonRenderer.map(Supplier::get);
this.commonRendererFactory = commonRenderer;
this.commonRenderer = commonRenderer.map(Supplier::get);
});
} }
public Map<ResourceLocation, BogeyStyle> getCycleGroup() { public Map<ResourceLocation, BogeyStyle> getCycleGroup() {
@ -81,10 +92,12 @@ public class BogeyStyle {
return entry.getMainEvent(); return entry.getMainEvent();
} }
@OnlyIn(Dist.CLIENT)
public BogeyRenderer createRendererInstance(BogeySizes.BogeySize size) { public BogeyRenderer createRendererInstance(BogeySizes.BogeySize size) {
return this.sizes.get(size).createRenderInstance(); return this.sizes.get(size).createRenderInstance();
} }
@OnlyIn(Dist.CLIENT)
public BogeyRenderer getInWorldRenderInstance(BogeySizes.BogeySize size) { public BogeyRenderer getInWorldRenderInstance(BogeySizes.BogeySize size) {
SizeData sizeData = this.sizes.get(size); SizeData sizeData = this.sizes.get(size);
return sizeData != null ? sizeData.getInWorldInstance() : BackupBogeyRenderer.INSTANCE; return sizeData != null ? sizeData.getInWorldInstance() : BackupBogeyRenderer.INSTANCE;
@ -102,6 +115,7 @@ public class BogeyStyle {
return new BogeyInstance(bogey, this, size, materialManager); return new BogeyInstance(bogey, this, size, materialManager);
} }
@OnlyIn(Dist.CLIENT)
public record SizeData(ResourceLocation block, Supplier<? extends BogeyRenderer> rendererFactory, BogeyRenderer instance) { public record SizeData(ResourceLocation block, Supplier<? extends BogeyRenderer> rendererFactory, BogeyRenderer instance) {
public BogeyRenderer createRenderInstance() { public BogeyRenderer createRenderInstance() {
return rendererFactory.get(); return rendererFactory.get();