Skip to content

Commit

Permalink
Christmas Hats, Snow blocks, misc. tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
crispytwig committed Dec 7, 2024
1 parent b10f057 commit cf89e0b
Show file tree
Hide file tree
Showing 53 changed files with 952 additions and 78 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ public static ResourceLocation id(String name) {
return ResourceLocation.fromNamespaceAndPath(MOD_ID, name);
}


public static int getColor(int rgb) {
return (255 << 24) | rgb;
}

public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.serialization.MapCodec;
import com.starfish_studios.seasons_greetings.registry.*;
import net.fabricmc.fabric.api.block.BlockPickInteractionAware;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.cauldron.CauldronInteraction;
Expand All @@ -15,6 +16,7 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.AbstractCauldronBlock;
import net.minecraft.world.level.block.Block;
Expand All @@ -23,9 +25,10 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import org.jetbrains.annotations.NotNull;

public class HotCocoaCauldronBlock extends AbstractCauldronBlock {
public class HotCocoaCauldronBlock extends AbstractCauldronBlock implements BlockPickInteractionAware {

@Override
protected MapCodec<? extends AbstractCauldronBlock> codec() {
Expand All @@ -41,6 +44,10 @@ public HotCocoaCauldronBlock(Properties properties, CauldronInteraction.Interact
return InteractionResult.PASS;
}

@Override
public ItemStack getPickedStack(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, Player player, HitResult hitResult) {
return new ItemStack((Items.CAULDRON));
}

@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> stateDefinition) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.serialization.MapCodec;
import com.starfish_studios.seasons_greetings.registry.*;
import net.fabricmc.fabric.api.block.BlockPickInteractionAware;
import net.minecraft.core.BlockPos;
import net.minecraft.core.cauldron.CauldronInteraction;
import net.minecraft.sounds.SoundEvents;
Expand All @@ -13,6 +14,7 @@
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.AbstractCauldronBlock;
import net.minecraft.world.level.block.Block;
Expand All @@ -21,9 +23,12 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import org.jetbrains.annotations.NotNull;

public class MilkCauldronBlock extends AbstractCauldronBlock {
import javax.swing.text.html.BlockView;

public class MilkCauldronBlock extends AbstractCauldronBlock implements BlockPickInteractionAware {

@Override
protected MapCodec<? extends AbstractCauldronBlock> codec() {
Expand All @@ -44,6 +49,11 @@ protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockSt
stateDefinition.add(LayeredCauldronBlock.LEVEL);
}

@Override
public ItemStack getPickedStack(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, Player player, HitResult hitResult) {
return new ItemStack((Items.CAULDRON));
}

public void animateTick(BlockState blockState, Level level, BlockPos blockPos, RandomSource randomSource) {
if (blockState.is(SGBlocks.MILK_CAULDRON) && level.getBlockState(blockPos.below()).is(SGTags.SGBlockTags.HEAT_SOURCES)) {
if (blockState.getValue(LayeredCauldronBlock.LEVEL) == 3) {
Expand Down Expand Up @@ -120,4 +130,5 @@ else if (itemStack.is(Items.GLASS_BOTTLE)) {
public boolean isFull(BlockState blockState) {
return true;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,19 @@
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.minecraft.client.gui.screens.MenuScreens;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.component.CustomData;
import net.minecraft.world.item.component.DyedItemColor;
import net.minecraft.world.level.block.Blocks;
import software.bernie.geckolib.util.Color;

import static com.starfish_studios.seasons_greetings.SeasonsGreetings.getColor;

@Environment(EnvType.CLIENT)
public class SeasonsGreetingsClient implements ClientModInitializer {
Expand All @@ -28,6 +33,12 @@ public void onInitializeClient() {
registerParticles();
registerEntityModelLayers();

ColorProviderRegistry.ITEM.register((stack, tintIndex) ->
tintIndex > 0 ? -1 : DyedItemColor.getOrDefault(stack, getColor(Color.WHITE.argbInt())),
SGItems.CHRISTMAS_HAT
);


ItemProperties.register(SGItems.RED_GIFT_BOX, SeasonsGreetings.id("bow_color"), (stack, world, entity, num) -> {
CustomData customData = stack.get(DataComponents.BLOCK_ENTITY_DATA);
String variantString = "bow";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.starfish_studios.seasons_greetings.client.model;

import com.starfish_studios.seasons_greetings.SeasonsGreetings;
import com.starfish_studios.seasons_greetings.item.ChristmasHatItem;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import software.bernie.geckolib.animation.AnimationState;
import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.constant.DataTickets;
import software.bernie.geckolib.model.GeoModel;

public class ChristmasHatModel extends GeoModel<ChristmasHatItem> {

@Override
public ResourceLocation getModelResource(ChristmasHatItem enchantmentRobeItem) {
return SeasonsGreetings.id("geo/armor/christmas_hat.geo.json");
}

@Override
public ResourceLocation getTextureResource(ChristmasHatItem enchantmentRobeItem) {
return SeasonsGreetings.id("textures/models/armor/christmas_hat.png");
}

@Override
public ResourceLocation getAnimationResource(ChristmasHatItem enchantmentRobeItem) {
return SeasonsGreetings.id("animations/christmas_hat.animation.json");
}

@Override
public void setCustomAnimations(ChristmasHatItem animatable, long instanceId, AnimationState<ChristmasHatItem> animationState) {

super.setCustomAnimations(animatable, instanceId, animationState);
if (animationState == null) return;

GeoBone hatTip = this.getAnimationProcessor().getBone("poof");
GeoBone hatBase = this.getAnimationProcessor().getBone("root");

Entity entity = animationState.getData(DataTickets.ENTITY);

if (entity instanceof Player playerEntity) {
hatBase.setRotX(Mth.lerp(animationState.getPartialTick(), playerEntity.oBob, playerEntity.bob) * -0.25F);

hatTip.setRotX((Mth.lerp(animationState.getPartialTick(), playerEntity.oBob, playerEntity.bob) * -2F)
+ (float) (Mth.lerp(animationState.getPartialTick(), playerEntity.yCloakO, playerEntity.yCloak)
- Mth.lerp(animationState.getPartialTick(), playerEntity.yo, playerEntity.getY())) / -4);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.starfish_studios.seasons_greetings.client.renderer;

import com.starfish_studios.seasons_greetings.client.model.ChristmasHatModel;
import com.starfish_studios.seasons_greetings.client.renderer.layers.ChristmasHatOverlay;
import com.starfish_studios.seasons_greetings.item.ChristmasHatItem;
import net.minecraft.world.entity.Entity;
import org.jetbrains.annotations.NotNull;
import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.renderer.specialty.DyeableGeoArmorRenderer;
import software.bernie.geckolib.util.Color;

public class ChristmasHatRenderer extends DyeableGeoArmorRenderer<ChristmasHatItem> {

public ChristmasHatRenderer() {
super(new ChristmasHatModel());
this.addRenderLayer(new ChristmasHatOverlay(this));
}

@Override
protected boolean isBoneDyeable(GeoBone geoBone) {
return true;
}

@Override
protected @NotNull Color getColorForBone(GeoBone bone) {
return Color.WHITE;
}

@Override
public void setupAnim(Entity entity, float f, float g, float h, float i, float j) {


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,11 @@ protected ItemDisplayContext getTransformTypeForStack(GeoBone bone, ItemStack st
@Override
protected void renderStackForBone(PoseStack poseStack, GeoBone bone, ItemStack stack, GingerbreadMan animatable, MultiBufferSource bufferSource, float partialTick, int packedLight, int packedOverlay) {

poseStack.mulPose(Axis.XP.rotationDegrees(-75));
poseStack.mulPose(Axis.XP.rotationDegrees(-60));
poseStack.mulPose(Axis.YP.rotationDegrees(0));
poseStack.mulPose(Axis.ZP.rotationDegrees(0));
poseStack.scale(0.8F, 0.8F, 0.8F);
poseStack.translate(0.0D, -0.1D, -0.125D);
poseStack.scale(0.7F, 0.7F, 0.7F);
poseStack.translate(0.0D, 0.1D, -0.15D);

super.renderStackForBone(poseStack, bone, stack, animatable, bufferSource, partialTick, packedLight,
packedOverlay);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.starfish_studios.seasons_greetings.client.renderer.layers;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.starfish_studios.seasons_greetings.SeasonsGreetings;
import com.starfish_studios.seasons_greetings.item.ChristmasHatItem;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import software.bernie.geckolib.cache.object.BakedGeoModel;
import software.bernie.geckolib.renderer.GeoRenderer;
import software.bernie.geckolib.renderer.layer.GeoRenderLayer;
import software.bernie.geckolib.util.Color;

public class ChristmasHatOverlay extends GeoRenderLayer<ChristmasHatItem> {
private static final ResourceLocation TEXTURE = SeasonsGreetings.id("textures/models/armor/christmas_hat_overlay.png");

public ChristmasHatOverlay(GeoRenderer<ChristmasHatItem> entityRenderer) {
super(entityRenderer);
}

@Override
public void render(PoseStack poseStack, ChristmasHatItem animatable, BakedGeoModel bakedModel, @Nullable RenderType renderType, MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) {
RenderType armorRenderType = RenderType.armorCutoutNoCull(TEXTURE);
getRenderer().reRender(bakedModel, poseStack, bufferSource, animatable, armorRenderType,
bufferSource.getBuffer(armorRenderType), partialTick, packedLight, packedOverlay, Color.WHITE.argbInt());
}
}
Loading

0 comments on commit cf89e0b

Please sign in to comment.