TheWildBackport/common/src/main/java/com/cursedcauldron/wildbackport/client/ClientSetup.java

151 lines
6.3 KiB
Java

package com.cursedcauldron.wildbackport.client;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import com.cursedcauldron.wildbackport.client.particle.SculkChargeParticle;
import com.cursedcauldron.wildbackport.client.particle.SculkChargePopParticle;
import com.cursedcauldron.wildbackport.client.particle.SculkSoulParticle;
import com.cursedcauldron.wildbackport.client.particle.ShriekParticle;
import com.cursedcauldron.wildbackport.client.particle.SonicBoomParticle;
import com.cursedcauldron.wildbackport.client.registry.WBParticleTypes;
import com.cursedcauldron.wildbackport.client.render.AllayRenderer;
import com.cursedcauldron.wildbackport.client.render.ChestBoatRenderer;
import com.cursedcauldron.wildbackport.client.render.FrogRenderer;
import com.cursedcauldron.wildbackport.client.render.TadpoleRenderer;
import com.cursedcauldron.wildbackport.client.render.WardenRenderer;
import com.cursedcauldron.wildbackport.client.render.model.AllayModel;
import com.cursedcauldron.wildbackport.client.render.model.ChestBoatModel;
import com.cursedcauldron.wildbackport.client.render.model.FrogModel;
import com.cursedcauldron.wildbackport.client.render.model.TadpoleModel;
import com.cursedcauldron.wildbackport.client.render.model.WardenModel;
import com.cursedcauldron.wildbackport.common.items.CompassItemPropertyFunction;
import com.cursedcauldron.wildbackport.common.items.RecoveryCompassTarget;
import com.cursedcauldron.wildbackport.common.registry.WBBlocks;
import com.cursedcauldron.wildbackport.common.registry.WBItems;
import com.cursedcauldron.wildbackport.common.registry.entity.WBEntityTypes;
import com.cursedcauldron.wildbackport.core.api.ColorRegistry;
import com.cursedcauldron.wildbackport.core.api.ParticleRegistry;
import com.cursedcauldron.wildbackport.core.api.RenderRegistry;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.BiomeColors;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.item.ClampedItemPropertyFunction;
import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.client.renderer.item.ItemPropertyFunction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.FoliageColor;
@Environment(EnvType.CLIENT)
public class ClientSetup {
/**
* Runs features at initializing
*/
public static void onClient() {
// Colors
ColorRegistry.register(
(state, getter, pos, tint)
-> (getter == null || pos == null)
? FoliageColor.getDefaultColor()
: BiomeColors.getAverageFoliageColor(getter, pos),
WBBlocks.MANGROVE_LEAVES
);
ColorRegistry.register((stack, tint) -> 9619016, WBBlocks.MANGROVE_LEAVES);
// Entity Renderers
RenderRegistry.setLayerDefinition(
AllayRenderer.MODEL_LAYER, AllayModel::createBodyLayer
);
RenderRegistry.setEntityRender(WBEntityTypes.ALLAY, AllayRenderer::new);
RenderRegistry.setLayerDefinition(
WardenRenderer.MODEL_LAYER, WardenModel::createBodyLayer
);
RenderRegistry.setEntityRender(WBEntityTypes.WARDEN, WardenRenderer::new);
RenderRegistry.setLayerDefinition(
FrogRenderer.MODEL_LAYER, FrogModel::createBodyLayer
);
RenderRegistry.setEntityRender(WBEntityTypes.FROG, FrogRenderer::new);
RenderRegistry.setLayerDefinition(
TadpoleRenderer.MODEL_LAYER, TadpoleModel::createBodyLayer
);
RenderRegistry.setEntityRender(WBEntityTypes.TADPOLE, TadpoleRenderer::new);
for (Boat.Type type : Boat.Type.values())
RenderRegistry.setLayerDefinition(
ChestBoatModel.createChestBoat(type),
() -> ChestBoatModel.createBodyModel(true)
);
RenderRegistry.setEntityRender(
WBEntityTypes.MANGROVE_BOAT, context -> new ChestBoatRenderer(context, false)
);
RenderRegistry.setEntityRender(
WBEntityTypes.CHEST_BOAT, context -> new ChestBoatRenderer(context, true)
);
// Particle Renderers
ParticleRegistry.create(
WBParticleTypes.SCULK_SOUL, SculkSoulParticle.Provider::new
);
ParticleRegistry.create(
WBParticleTypes.SCULK_CHARGE, SculkChargeParticle.Provider::new
);
ParticleRegistry.create(
WBParticleTypes.SCULK_CHARGE_POP, SculkChargePopParticle.Provider::new
);
ParticleRegistry.create(WBParticleTypes.SHRIEK, ShriekParticle.Provider::new);
ParticleRegistry.create(
WBParticleTypes.SONIC_BOOM, SonicBoomParticle.Provider::new
);
}
/**
* Runs features post bootstrap
*/
public static void onPostClient() {
// Block Render Types
RenderRegistry.setBlockRenderType(
RenderType.cutout(),
WBBlocks.SCULK_VEIN.get(),
WBBlocks.SCULK_SHRIEKER.get(),
WBBlocks.FROGSPAWN.get(),
WBBlocks.MANGROVE_ROOTS.get(),
WBBlocks.MANGROVE_TRAPDOOR.get(),
WBBlocks.MANGROVE_PROPAGULE.get(),
WBBlocks.POTTED_MANGROVE_PROPAGULE.get()
);
var isForge = false;
try {
// TODO: wonk
Class.forName("net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext");
isForge = true;
} catch (ClassNotFoundException alec) {}
try {
var registerItemPropertyFunc = ItemProperties.class.getDeclaredMethod(
isForge ? "register" : "method_27879",
Item.class,
ResourceLocation.class,
// Thanks for patching, forge!
isForge ? ItemPropertyFunction.class : ClampedItemPropertyFunction.class
);
registerItemPropertyFunc.setAccessible(true);
registerItemPropertyFunc.invoke(
null,
WBItems.RECOVERY_COMPASS.get(),
new ResourceLocation("angle"),
new CompassItemPropertyFunction(RecoveryCompassTarget.INSTANCE)
);
} catch (
InvocationTargetException | IllegalAccessException | NoSuchMethodException e
) {
throw new RuntimeException(e);
}
}
}