2019-09-03 08:34:02 +02:00
|
|
|
package com.simibubi.create;
|
|
|
|
|
2021-04-08 19:22:11 +02:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.function.Function;
|
|
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
2020-05-23 14:02:38 +02:00
|
|
|
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
|
2021-02-18 19:43:22 +01:00
|
|
|
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
|
2020-12-02 21:49:57 +01:00
|
|
|
import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity;
|
2021-05-04 03:50:17 +02:00
|
|
|
import com.simibubi.create.content.curiosities.armor.CopperBacktankArmorLayer;
|
2020-05-23 14:02:38 +02:00
|
|
|
import com.simibubi.create.content.schematics.ClientSchematicLoader;
|
|
|
|
import com.simibubi.create.content.schematics.client.SchematicAndQuillHandler;
|
|
|
|
import com.simibubi.create.content.schematics.client.SchematicHandler;
|
2021-04-06 00:05:29 +02:00
|
|
|
import com.simibubi.create.events.ClientEvents;
|
2020-05-23 14:02:38 +02:00
|
|
|
import com.simibubi.create.foundation.ResourceReloadHandler;
|
2020-05-13 21:56:46 +02:00
|
|
|
import com.simibubi.create.foundation.block.render.CustomBlockModels;
|
2020-05-15 01:23:27 +02:00
|
|
|
import com.simibubi.create.foundation.block.render.SpriteShifter;
|
2021-03-25 02:27:10 +01:00
|
|
|
import com.simibubi.create.foundation.config.AllConfigs;
|
2021-03-04 12:53:24 +01:00
|
|
|
import com.simibubi.create.foundation.gui.UIRenderHelper;
|
2020-05-28 01:29:26 +02:00
|
|
|
import com.simibubi.create.foundation.item.CustomItemModels;
|
|
|
|
import com.simibubi.create.foundation.item.CustomRenderedItems;
|
2021-02-16 19:35:26 +01:00
|
|
|
import com.simibubi.create.foundation.ponder.content.PonderIndex;
|
|
|
|
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
|
2021-03-15 23:58:41 +01:00
|
|
|
import com.simibubi.create.foundation.render.AllProgramSpecs;
|
2021-02-04 08:21:10 +01:00
|
|
|
import com.simibubi.create.foundation.render.KineticRenderer;
|
2021-01-13 21:14:01 +01:00
|
|
|
import com.simibubi.create.foundation.render.SuperByteBufferCache;
|
2021-02-12 08:36:05 +01:00
|
|
|
import com.simibubi.create.foundation.render.backend.Backend;
|
2021-02-18 19:43:22 +01:00
|
|
|
import com.simibubi.create.foundation.render.backend.OptifineHandler;
|
2021-04-29 23:03:52 +02:00
|
|
|
import com.simibubi.create.foundation.render.backend.core.PartialModel;
|
2021-03-15 23:58:41 +01:00
|
|
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
|
|
|
import com.simibubi.create.foundation.utility.WorldAttached;
|
2021-02-16 00:48:13 +01:00
|
|
|
import com.simibubi.create.foundation.utility.ghost.GhostBlocks;
|
2020-05-15 17:13:38 +02:00
|
|
|
import com.simibubi.create.foundation.utility.outliner.Outliner;
|
2021-04-08 19:22:11 +02:00
|
|
|
|
2019-12-05 23:42:01 +01:00
|
|
|
import net.minecraft.block.Block;
|
2019-09-22 20:23:26 +02:00
|
|
|
import net.minecraft.client.Minecraft;
|
2019-09-24 14:40:01 +02:00
|
|
|
import net.minecraft.client.renderer.BlockModelShapes;
|
|
|
|
import net.minecraft.client.renderer.model.IBakedModel;
|
|
|
|
import net.minecraft.client.renderer.model.ModelResourceLocation;
|
2021-03-25 02:27:10 +01:00
|
|
|
import net.minecraft.client.settings.GraphicsFanciness;
|
2020-05-13 01:11:07 +02:00
|
|
|
import net.minecraft.inventory.container.PlayerContainer;
|
2020-05-28 01:29:26 +02:00
|
|
|
import net.minecraft.item.Item;
|
2019-09-22 20:23:26 +02:00
|
|
|
import net.minecraft.resources.IReloadableResourceManager;
|
|
|
|
import net.minecraft.resources.IResourceManager;
|
2019-09-24 14:40:01 +02:00
|
|
|
import net.minecraft.util.ResourceLocation;
|
2021-03-25 02:27:10 +01:00
|
|
|
import net.minecraft.util.text.ChatType;
|
|
|
|
import net.minecraft.util.text.IFormattableTextComponent;
|
|
|
|
import net.minecraft.util.text.StringTextComponent;
|
|
|
|
import net.minecraft.util.text.TextComponentUtils;
|
|
|
|
import net.minecraft.util.text.TextFormatting;
|
|
|
|
import net.minecraft.util.text.event.ClickEvent;
|
|
|
|
import net.minecraft.util.text.event.HoverEvent;
|
2021-03-15 23:58:41 +01:00
|
|
|
import net.minecraft.world.IWorld;
|
2019-09-24 14:40:01 +02:00
|
|
|
import net.minecraftforge.client.event.ModelBakeEvent;
|
2019-10-21 23:45:16 +02:00
|
|
|
import net.minecraftforge.client.event.ModelRegistryEvent;
|
2019-11-17 21:25:59 +01:00
|
|
|
import net.minecraftforge.client.event.TextureStitchEvent;
|
2019-10-21 23:45:16 +02:00
|
|
|
import net.minecraftforge.client.model.ModelLoader;
|
2019-10-15 22:22:19 +02:00
|
|
|
import net.minecraftforge.eventbus.api.IEventBus;
|
2019-09-03 08:34:02 +02:00
|
|
|
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
|
|
|
|
|
|
|
public class CreateClient {
|
|
|
|
|
|
|
|
public static ClientSchematicLoader schematicSender;
|
|
|
|
public static SchematicHandler schematicHandler;
|
|
|
|
public static SchematicAndQuillHandler schematicAndQuillHandler;
|
2019-11-23 22:17:37 +01:00
|
|
|
public static SuperByteBufferCache bufferCache;
|
2021-03-15 23:58:41 +01:00
|
|
|
public static WorldAttached<KineticRenderer> kineticRenderer;
|
2020-12-11 10:00:36 +01:00
|
|
|
public static final Outliner outliner = new Outliner();
|
2021-02-16 00:48:13 +01:00
|
|
|
public static GhostBlocks ghostBlocks;
|
2020-05-28 01:29:26 +02:00
|
|
|
|
2020-05-13 21:56:46 +02:00
|
|
|
private static CustomBlockModels customBlockModels;
|
2020-05-28 01:29:26 +02:00
|
|
|
private static CustomItemModels customItemModels;
|
|
|
|
private static CustomRenderedItems customRenderedItems;
|
2020-05-24 12:31:05 +02:00
|
|
|
private static AllColorHandlers colorHandlers;
|
2020-12-02 21:49:57 +01:00
|
|
|
private static CasingConnectivity casingConnectivity;
|
2019-11-17 21:25:59 +01:00
|
|
|
|
2020-06-05 13:02:11 +02:00
|
|
|
public static void addClientListeners(IEventBus modEventBus) {
|
2020-08-05 22:10:05 +02:00
|
|
|
modEventBus.addListener(CreateClient::clientInit);
|
|
|
|
modEventBus.addListener(CreateClient::onModelBake);
|
|
|
|
modEventBus.addListener(CreateClient::onModelRegistry);
|
|
|
|
modEventBus.addListener(CreateClient::onTextureStitch);
|
|
|
|
modEventBus.addListener(AllParticleTypes::registerFactories);
|
2021-04-06 00:05:29 +02:00
|
|
|
modEventBus.addListener(ClientEvents::loadCompleted);
|
2021-01-04 23:37:44 +01:00
|
|
|
|
2021-02-07 23:15:52 +01:00
|
|
|
Backend.init();
|
|
|
|
OptifineHandler.init();
|
2019-10-15 22:22:19 +02:00
|
|
|
}
|
2019-10-21 23:45:16 +02:00
|
|
|
|
2019-09-03 08:34:02 +02:00
|
|
|
public static void clientInit(FMLClientSetupEvent event) {
|
2021-03-15 23:58:41 +01:00
|
|
|
AllProgramSpecs.init();
|
|
|
|
kineticRenderer = new WorldAttached<>(KineticRenderer::new);
|
2021-02-07 23:15:52 +01:00
|
|
|
|
2019-09-03 08:34:02 +02:00
|
|
|
schematicSender = new ClientSchematicLoader();
|
|
|
|
schematicHandler = new SchematicHandler();
|
2019-09-03 23:03:52 +02:00
|
|
|
schematicAndQuillHandler = new SchematicAndQuillHandler();
|
2019-09-22 20:23:26 +02:00
|
|
|
|
2019-11-23 22:17:37 +01:00
|
|
|
bufferCache = new SuperByteBufferCache();
|
|
|
|
bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE);
|
2021-02-13 22:10:14 +01:00
|
|
|
bufferCache.registerCompartment(ContraptionRenderDispatcher.CONTRAPTION, 20);
|
2021-02-09 22:34:14 +01:00
|
|
|
bufferCache.registerCompartment(WorldSectionElement.DOC_WORLD_SECTION, 20);
|
2019-11-23 22:17:37 +01:00
|
|
|
|
2021-02-16 00:48:13 +01:00
|
|
|
ghostBlocks = new GhostBlocks();
|
|
|
|
|
2019-09-03 08:34:02 +02:00
|
|
|
AllKeys.register();
|
2020-05-23 14:02:38 +02:00
|
|
|
AllContainerTypes.registerScreenFactories();
|
2021-04-08 19:22:11 +02:00
|
|
|
// AllTileEntities.registerRenderers();
|
2020-05-23 14:02:38 +02:00
|
|
|
AllEntityTypes.registerRenderers();
|
2020-05-24 12:31:05 +02:00
|
|
|
getColorHandler().init();
|
2020-12-03 20:41:55 +01:00
|
|
|
AllFluids.assignRenderLayers();
|
2021-02-16 19:35:26 +01:00
|
|
|
PonderIndex.register();
|
2021-03-04 12:53:24 +01:00
|
|
|
PonderIndex.registerTags();
|
|
|
|
|
|
|
|
UIRenderHelper.init();
|
2021-04-07 02:17:55 +02:00
|
|
|
UIRenderHelper.enableStencil();
|
2019-09-22 20:23:26 +02:00
|
|
|
|
2020-05-13 01:11:07 +02:00
|
|
|
IResourceManager resourceManager = Minecraft.getInstance()
|
2020-05-13 21:56:46 +02:00
|
|
|
.getResourceManager();
|
2019-09-22 20:23:26 +02:00
|
|
|
if (resourceManager instanceof IReloadableResourceManager)
|
2019-11-23 22:17:37 +01:00
|
|
|
((IReloadableResourceManager) resourceManager).addReloadListener(new ResourceReloadHandler());
|
2021-04-06 00:05:29 +02:00
|
|
|
|
2021-04-29 23:03:52 +02:00
|
|
|
AllBlockPartials.clientInit();
|
2021-05-04 03:50:17 +02:00
|
|
|
|
|
|
|
event.enqueueWork(() -> {
|
|
|
|
CopperBacktankArmorLayer.register();
|
|
|
|
});
|
2019-09-03 08:34:02 +02:00
|
|
|
}
|
2020-05-28 01:29:26 +02:00
|
|
|
|
2019-11-17 21:25:59 +01:00
|
|
|
public static void onTextureStitch(TextureStitchEvent.Pre event) {
|
2020-05-13 21:56:46 +02:00
|
|
|
if (!event.getMap()
|
|
|
|
.getId()
|
|
|
|
.equals(PlayerContainer.BLOCK_ATLAS_TEXTURE))
|
2019-11-17 21:25:59 +01:00
|
|
|
return;
|
2020-05-15 01:23:27 +02:00
|
|
|
SpriteShifter.getAllTargetSprites()
|
|
|
|
.forEach(event::addSprite);
|
2019-11-17 21:25:59 +01:00
|
|
|
}
|
|
|
|
|
2019-09-24 14:40:01 +02:00
|
|
|
public static void onModelBake(ModelBakeEvent event) {
|
|
|
|
Map<ResourceLocation, IBakedModel> modelRegistry = event.getModelRegistry();
|
2021-04-29 23:03:52 +02:00
|
|
|
PartialModel.onModelBake(event);
|
2019-09-24 14:40:01 +02:00
|
|
|
|
2020-05-13 21:56:46 +02:00
|
|
|
getCustomBlockModels()
|
|
|
|
.foreach((block, modelFunc) -> swapModels(modelRegistry, getAllBlockStateModelLocations(block), modelFunc));
|
2020-05-28 01:29:26 +02:00
|
|
|
getCustomItemModels()
|
|
|
|
.foreach((item, modelFunc) -> swapModels(modelRegistry, getItemModelLocation(item), modelFunc));
|
|
|
|
getCustomRenderedItems().foreach((item, modelFunc) -> {
|
|
|
|
swapModels(modelRegistry, getItemModelLocation(item), m -> modelFunc.apply(m)
|
|
|
|
.loadPartials(event));
|
|
|
|
});
|
2019-10-21 23:45:16 +02:00
|
|
|
}
|
2019-09-24 14:40:01 +02:00
|
|
|
|
2019-10-21 23:45:16 +02:00
|
|
|
public static void onModelRegistry(ModelRegistryEvent event) {
|
2021-04-29 23:03:52 +02:00
|
|
|
PartialModel.onModelRegistry(event);
|
2020-02-04 14:48:21 +01:00
|
|
|
|
2020-05-28 01:29:26 +02:00
|
|
|
getCustomRenderedItems().foreach((item, modelFunc) -> modelFunc.apply(null)
|
|
|
|
.getModelLocations()
|
|
|
|
.forEach(ModelLoader::addSpecialModel));
|
2019-09-24 14:40:01 +02:00
|
|
|
}
|
|
|
|
|
2020-05-28 01:29:26 +02:00
|
|
|
protected static ModelResourceLocation getItemModelLocation(Item item) {
|
|
|
|
return new ModelResourceLocation(item.getRegistryName(), "inventory");
|
2019-09-24 14:40:01 +02:00
|
|
|
}
|
|
|
|
|
2020-05-13 21:56:46 +02:00
|
|
|
protected static List<ModelResourceLocation> getAllBlockStateModelLocations(Block block) {
|
2019-12-05 23:42:01 +01:00
|
|
|
List<ModelResourceLocation> models = new ArrayList<>();
|
2020-05-13 21:56:46 +02:00
|
|
|
block.getStateContainer()
|
|
|
|
.getValidStates()
|
|
|
|
.forEach(state -> {
|
|
|
|
models.add(getBlockModelLocation(block, BlockModelShapes.getPropertyMapString(state.getValues())));
|
|
|
|
});
|
2019-12-05 23:42:01 +01:00
|
|
|
return models;
|
|
|
|
}
|
|
|
|
|
2020-05-13 21:56:46 +02:00
|
|
|
protected static ModelResourceLocation getBlockModelLocation(Block block, String suffix) {
|
|
|
|
return new ModelResourceLocation(block.getRegistryName(), suffix);
|
2019-09-24 14:40:01 +02:00
|
|
|
}
|
|
|
|
|
2019-12-05 23:42:01 +01:00
|
|
|
protected static <T extends IBakedModel> void swapModels(Map<ResourceLocation, IBakedModel> modelRegistry,
|
2020-05-13 21:56:46 +02:00
|
|
|
List<ModelResourceLocation> locations, Function<IBakedModel, T> factory) {
|
2019-12-05 23:42:01 +01:00
|
|
|
locations.forEach(location -> {
|
|
|
|
swapModels(modelRegistry, location, factory);
|
|
|
|
});
|
|
|
|
}
|
2021-04-08 19:22:11 +02:00
|
|
|
|
2020-05-28 01:29:26 +02:00
|
|
|
protected static <T extends IBakedModel> void swapModels(Map<ResourceLocation, IBakedModel> modelRegistry,
|
|
|
|
ModelResourceLocation location, Function<IBakedModel, T> factory) {
|
|
|
|
modelRegistry.put(location, factory.apply(modelRegistry.get(location)));
|
|
|
|
}
|
|
|
|
|
|
|
|
public static CustomItemModels getCustomItemModels() {
|
|
|
|
if (customItemModels == null)
|
|
|
|
customItemModels = new CustomItemModels();
|
|
|
|
return customItemModels;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static CustomRenderedItems getCustomRenderedItems() {
|
|
|
|
if (customRenderedItems == null)
|
|
|
|
customRenderedItems = new CustomRenderedItems();
|
|
|
|
return customRenderedItems;
|
|
|
|
}
|
|
|
|
|
2020-05-13 21:56:46 +02:00
|
|
|
public static CustomBlockModels getCustomBlockModels() {
|
|
|
|
if (customBlockModels == null)
|
|
|
|
customBlockModels = new CustomBlockModels();
|
|
|
|
return customBlockModels;
|
|
|
|
}
|
2020-05-28 01:29:26 +02:00
|
|
|
|
2020-05-24 12:31:05 +02:00
|
|
|
public static AllColorHandlers getColorHandler() {
|
|
|
|
if (colorHandlers == null)
|
|
|
|
colorHandlers = new AllColorHandlers();
|
|
|
|
return colorHandlers;
|
|
|
|
}
|
2021-04-08 19:22:11 +02:00
|
|
|
|
2020-12-02 21:49:57 +01:00
|
|
|
public static CasingConnectivity getCasingConnectivity() {
|
|
|
|
if (casingConnectivity == null)
|
|
|
|
casingConnectivity = new CasingConnectivity();
|
|
|
|
return casingConnectivity;
|
|
|
|
}
|
2020-05-13 21:56:46 +02:00
|
|
|
|
2021-01-11 09:29:02 +01:00
|
|
|
public static void invalidateRenderers() {
|
2021-03-15 23:58:41 +01:00
|
|
|
invalidateRenderers(null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void invalidateRenderers(@Nullable IWorld world) {
|
|
|
|
bufferCache.invalidate();
|
|
|
|
|
|
|
|
if (world != null) {
|
2021-04-08 19:22:11 +02:00
|
|
|
kineticRenderer.get(world)
|
|
|
|
.invalidate();
|
2021-03-15 23:58:41 +01:00
|
|
|
} else {
|
|
|
|
kineticRenderer.forEach(InstancedTileRenderer::invalidate);
|
|
|
|
}
|
|
|
|
|
2021-01-18 07:18:31 +01:00
|
|
|
ContraptionRenderDispatcher.invalidateAll();
|
2021-01-11 09:29:02 +01:00
|
|
|
}
|
2021-03-25 02:27:10 +01:00
|
|
|
|
|
|
|
public static void checkGraphicsFanciness() {
|
|
|
|
Minecraft mc = Minecraft.getInstance();
|
|
|
|
if (mc.player == null)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (mc.gameSettings.graphicsMode != GraphicsFanciness.FABULOUS)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (AllConfigs.CLIENT.ignoreFabulousWarning.get())
|
|
|
|
return;
|
|
|
|
|
2021-04-08 19:22:11 +02:00
|
|
|
IFormattableTextComponent text = TextComponentUtils.bracketed(new StringTextComponent("WARN"))
|
|
|
|
.formatted(TextFormatting.GOLD)
|
|
|
|
.append(new StringTextComponent(
|
|
|
|
" Some of Create's visual features will not be available while Fabulous graphics are enabled!"))
|
|
|
|
.styled(style -> style
|
|
|
|
.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/create dismissFabulousWarning"))
|
|
|
|
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
|
|
|
|
new StringTextComponent("Click here to disable this warning"))));
|
2021-03-25 02:27:10 +01:00
|
|
|
|
|
|
|
mc.ingameGUI.addChatMessage(ChatType.CHAT, text, mc.player.getUniqueID());
|
|
|
|
}
|
2019-09-03 08:34:02 +02:00
|
|
|
}
|