Skip to content

Commit

Permalink
feat: add new afrit model - thanks @feellian
Browse files Browse the repository at this point in the history
  • Loading branch information
klikli-dev committed Jan 13, 2024
1 parent 4bac8fc commit a0f3915
Show file tree
Hide file tree
Showing 11 changed files with 760 additions and 242 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,110 +22,26 @@

package com.klikli_dev.occultism.client.model.entity;

import com.klikli_dev.occultism.Occultism;
import com.klikli_dev.occultism.common.entity.spirit.AfritEntity;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.DefaultedGeoModel;


public class AfritModel extends HumanoidModel<AfritEntity> {
public class AfritModel extends DefaultedGeoModel<AfritEntity> {

public static final String NOSE = "nose";
public static final String EAR_LEFT = "earLeft";
public static final String EAR_RIGHT = "earRight";
public static final String WINGED_WINGS = "wingedWings";
public static final String WINGED_WINGS_LEFT = "wingedWingsLeft";
public static final String WINGED_WINGS_RIGHT = "wingedWingsRight";

public ModelPart nose;
public ModelPart earLeft;
public ModelPart earRight;
public ModelPart wingedWings;
public ModelPart wingedWingsLeft;
public ModelPart wingedWingsRight;

public AfritModel(ModelPart modelPart) {
super(modelPart); //modelsize 1.0 was used here
this.leftArmPose = ArmPose.EMPTY;
this.rightArmPose = ArmPose.EMPTY;

this.nose = this.head.getChild(NOSE);
this.earLeft = this.head.getChild(EAR_LEFT);
this.earRight = this.head.getChild(EAR_RIGHT);
this.wingedWings = this.body.getChild(WINGED_WINGS);
this.wingedWingsLeft = this.wingedWings.getChild(WINGED_WINGS_LEFT);
this.wingedWingsRight = this.wingedWings.getChild(WINGED_WINGS_RIGHT);
public AfritModel() {
super(new ResourceLocation(Occultism.MODID, "afrit"));
}

public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = HumanoidModel.createMesh(CubeDeformation.NONE, 0);
PartDefinition mesh = meshdefinition.getRoot();

PartDefinition head = mesh.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -10.0F, -4.0F, 8.0F, 10.0F, 8.0F, CubeDeformation.NONE), PartPose.ZERO);
mesh.addOrReplaceChild("hat", CubeListBuilder.create().texOffs(1, 45).addBox(-4.0F, -10.0F, -4.0F, 8.0F, 10.0F, 8.0F, new CubeDeformation(0.5f)), PartPose.offset(0, -3, 0));

head.addOrReplaceChild(NOSE, CubeListBuilder.create().texOffs(24, 0)
.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 2,
CubeDeformation.NONE),
PartPose.offsetAndRotation(0.0F, -5.0F, -4.4F, -0.4553564018453205F, 0.0F, 0.0F));

head.addOrReplaceChild(EAR_LEFT, CubeListBuilder.create().texOffs(0, 0)
.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 1,
CubeDeformation.NONE),
PartPose.offsetAndRotation(4.0F, -11.3F, 3.5F, -0.5009094953223726F, 0.0F, 0.0F));

head.addOrReplaceChild(EAR_RIGHT, CubeListBuilder.create().texOffs(0, 0)
.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 1,
CubeDeformation.NONE),
PartPose.offsetAndRotation(-4.0F, -11.3F, 3.5F, -0.5009094953223726F, 0.0F, 0.0F));

mesh.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(44, 22)
.addBox(-1.0F, -2.0F, -2.0F, 4, 11, 4,
CubeDeformation.NONE),
PartPose.offsetAndRotation(5.0F, 3.0F, -1.0F, -0.7499679795819634F, 0.0F, 0.0F));

mesh.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(44, 22)
.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4,
CubeDeformation.NONE),
PartPose.offsetAndRotation(-5.0F, 3.0F, -1.0F, -0.7499679795819634F, 0.0F, 0.0F));

PartDefinition body = mesh.addOrReplaceChild("body", CubeListBuilder.create().texOffs(16, 20)
.addBox(-4.0F, 0.0F, -3.0F, 8, 12, 6,
CubeDeformation.NONE),
PartPose.offset(0.0F, 0.0F, 0.0F));

mesh.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(0, 22)
.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4,
CubeDeformation.NONE).mirror(),
PartPose.offset(2.0F, 12.0F, 0.0F));

mesh.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(0, 22)
.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4,
CubeDeformation.NONE),
PartPose.offset(-2.0F, 12.0F, 0.0F));

PartDefinition wingedWings = body.addOrReplaceChild(WINGED_WINGS, CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F));

wingedWings.addOrReplaceChild(WINGED_WINGS_LEFT, CubeListBuilder.create()
.texOffs(40, 38)
.addBox(-1.0F, -1.0F, 0.0F, 1, 1, 11,
CubeDeformation.NONE)
.texOffs(32, 0)
.addBox(-0.1F, 0.0F, -0.4226F, 0, 9, 11,
CubeDeformation.NONE),
PartPose.offsetAndRotation(1.5F, -21.5F, 3.0F, 0.4363F, 0.8727F, 0.0F));

wingedWings.addOrReplaceChild(WINGED_WINGS_RIGHT, CubeListBuilder.create()
.texOffs(40, 38)
.addBox(-1.0F, -1.0F, 0.0F, 1, 1, 11,
CubeDeformation.NONE)
.texOffs(32, 0)
.addBox(-0.1F, 0.0F, -0.4226F, 0, 9, 11,
CubeDeformation.NONE),
PartPose.offsetAndRotation(-0.5F, -21.5F, 3.0F, 0.4363F, -0.8727F, 0.0F));

return LayerDefinition.create(meshdefinition, 64, 64);
@Override
protected String subtype() {
return "entity";
}

@Override
public RenderType getRenderType(AfritEntity animatable, ResourceLocation texture) {
return RenderType.entityTranslucent(this.getTextureResource(animatable));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,110 +22,26 @@

package com.klikli_dev.occultism.client.model.entity;

import com.klikli_dev.occultism.Occultism;
import com.klikli_dev.occultism.common.entity.spirit.AfritWildEntity;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.model.DefaultedGeoModel;

public class AfritWildModel extends DefaultedGeoModel<AfritWildEntity> {

public class AfritWildModel extends HumanoidModel<AfritWildEntity> {

public static final String NOSE = "nose";
public static final String EAR_LEFT = "earLeft";
public static final String EAR_RIGHT = "earRight";
public static final String WINGED_WINGS = "wingedWings";
public static final String WINGED_WINGS_LEFT = "wingedWingsLeft";
public static final String WINGED_WINGS_RIGHT = "wingedWingsRight";

public ModelPart nose;
public ModelPart earLeft;
public ModelPart earRight;
public ModelPart wingedWings;
public ModelPart wingedWingsLeft;
public ModelPart wingedWingsRight;

public AfritWildModel(ModelPart modelPart) {
super(modelPart); //modelsize 1.0 was used here
this.leftArmPose = ArmPose.EMPTY;
this.rightArmPose = ArmPose.EMPTY;

this.nose = this.head.getChild(NOSE);
this.earLeft = this.head.getChild(EAR_LEFT);
this.earRight = this.head.getChild(EAR_RIGHT);
this.wingedWings = this.body.getChild(WINGED_WINGS);
this.wingedWingsLeft = this.wingedWings.getChild(WINGED_WINGS_LEFT);
this.wingedWingsRight = this.wingedWings.getChild(WINGED_WINGS_RIGHT);
public AfritWildModel() {
super(new ResourceLocation(Occultism.MODID, "afrit"));
}

public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = HumanoidModel.createMesh(CubeDeformation.NONE, 0);
PartDefinition mesh = meshdefinition.getRoot();

PartDefinition head = mesh.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -10.0F, -4.0F, 8.0F, 10.0F, 8.0F, CubeDeformation.NONE), PartPose.ZERO);
mesh.addOrReplaceChild("hat", CubeListBuilder.create().texOffs(1, 45).addBox(-4.0F, -10.0F, -4.0F, 8.0F, 10.0F, 8.0F, new CubeDeformation(0.5f)), PartPose.offset(0, -3, 0));

head.addOrReplaceChild(NOSE, CubeListBuilder.create().texOffs(24, 0)
.addBox(-1.0F, 0.0F, 0.0F, 2, 4, 2,
CubeDeformation.NONE),
PartPose.offsetAndRotation(0.0F, -5.0F, -4.4F, -0.4553564018453205F, 0.0F, 0.0F));

head.addOrReplaceChild(EAR_LEFT, CubeListBuilder.create().texOffs(0, 0)
.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 1,
CubeDeformation.NONE),
PartPose.offsetAndRotation(4.0F, -11.3F, 3.5F, -0.5009094953223726F, 0.0F, 0.0F));

head.addOrReplaceChild(EAR_RIGHT, CubeListBuilder.create().texOffs(0, 0)
.addBox(-0.5F, 0.0F, 0.0F, 1, 3, 1,
CubeDeformation.NONE),
PartPose.offsetAndRotation(-4.0F, -11.3F, 3.5F, -0.5009094953223726F, 0.0F, 0.0F));

mesh.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(44, 22)
.addBox(-1.0F, -2.0F, -2.0F, 4, 11, 4,
CubeDeformation.NONE),
PartPose.offsetAndRotation(5.0F, 3.0F, -1.0F, -0.7499679795819634F, 0.0F, 0.0F));

mesh.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(44, 22)
.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4,
CubeDeformation.NONE),
PartPose.offsetAndRotation(-5.0F, 3.0F, -1.0F, -0.7499679795819634F, 0.0F, 0.0F));

PartDefinition body = mesh.addOrReplaceChild("body", CubeListBuilder.create().texOffs(16, 20)
.addBox(-4.0F, 0.0F, -3.0F, 8, 12, 6,
CubeDeformation.NONE),
PartPose.offset(0.0F, 0.0F, 0.0F));

mesh.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(0, 22)
.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4,
CubeDeformation.NONE).mirror(),
PartPose.offset(2.0F, 12.0F, 0.0F));

mesh.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(0, 22)
.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4,
CubeDeformation.NONE),
PartPose.offset(-2.0F, 12.0F, 0.0F));

PartDefinition wingedWings = body.addOrReplaceChild(WINGED_WINGS, CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F));

wingedWings.addOrReplaceChild(WINGED_WINGS_LEFT, CubeListBuilder.create()
.texOffs(40, 38)
.addBox(-1.0F, -1.0F, 0.0F, 1, 1, 11,
CubeDeformation.NONE)
.texOffs(32, 0)
.addBox(-0.1F, 0.0F, -0.4226F, 0, 9, 11,
CubeDeformation.NONE),
PartPose.offsetAndRotation(1.5F, -21.5F, 3.0F, 0.4363F, 0.8727F, 0.0F));

wingedWings.addOrReplaceChild(WINGED_WINGS_RIGHT, CubeListBuilder.create()
.texOffs(40, 38)
.addBox(-1.0F, -1.0F, 0.0F, 1, 1, 11,
CubeDeformation.NONE)
.texOffs(32, 0)
.addBox(-0.1F, 0.0F, -0.4226F, 0, 9, 11,
CubeDeformation.NONE),
PartPose.offsetAndRotation(-0.5F, -21.5F, 3.0F, 0.4363F, -0.8727F, 0.0F));

return LayerDefinition.create(meshdefinition, 64, 64);
@Override
protected String subtype() {
return "entity";
}

@Override
public RenderType getRenderType(AfritWildEntity animatable, ResourceLocation texture) {
return RenderType.entityTranslucent(this.getTextureResource(animatable));
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -22,32 +22,17 @@

package com.klikli_dev.occultism.client.render.entity;

import com.klikli_dev.occultism.Occultism;
import com.klikli_dev.occultism.client.model.entity.AfritModel;
import com.klikli_dev.occultism.common.entity.spirit.AfritEntity;
import com.klikli_dev.occultism.registry.OccultismModelLayers;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.renderer.GeoEntityRenderer;
import software.bernie.geckolib.renderer.layer.AutoGlowingGeoLayer;

public class AfritRenderer extends BipedSpiritRenderer<AfritEntity, AfritModel> {
public class AfritRenderer extends GeoEntityRenderer<AfritEntity> {

private static final ResourceLocation[] TEXTURES = {new ResourceLocation(Occultism.MODID,
"textures/entity/afrit.png")};
public AfritRenderer(EntityRendererProvider.Context renderManager) {
super(renderManager, new AfritModel());

public AfritRenderer(EntityRendererProvider.Context context) {
super(context, new AfritModel(context.bakeLayer(OccultismModelLayers.AFRIT)), 0.5f);
this.addRenderLayer(new AutoGlowingGeoLayer<>(this));
}

@Override
public ResourceLocation getTextureLocation(AfritEntity entity) {
return TEXTURES[entity.getEntityData().get(entity.getDataParameterSkin())];
}

@Override
protected void scale(AfritEntity entity, PoseStack matrixStackIn, float partialTickTime) {
super.scale(entity, matrixStackIn, partialTickTime);
matrixStackIn.scale(1.2f, 1.2f, 1.2f);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,17 @@

package com.klikli_dev.occultism.client.render.entity;

import com.klikli_dev.occultism.Occultism;
import com.klikli_dev.occultism.client.model.entity.AfritWildModel;
import com.klikli_dev.occultism.common.entity.spirit.AfritWildEntity;
import com.klikli_dev.occultism.registry.OccultismModelLayers;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.HumanoidMobRenderer;
import net.minecraft.resources.ResourceLocation;
import software.bernie.geckolib.renderer.GeoEntityRenderer;
import software.bernie.geckolib.renderer.layer.AutoGlowingGeoLayer;

public class AfritWildRenderer extends HumanoidMobRenderer<AfritWildEntity, AfritWildModel> {
private static final ResourceLocation TEXTURE = new ResourceLocation(Occultism.MODID,
"textures/entity/afrit.png");
public class AfritWildRenderer extends GeoEntityRenderer<AfritWildEntity> {

public AfritWildRenderer(EntityRendererProvider.Context context) {
super(context, new AfritWildModel(context.bakeLayer(OccultismModelLayers.AFRIT_WILD)), 0.5f);
}

@Override
public ResourceLocation getTextureLocation(AfritWildEntity entity) {
return TEXTURE;
}
public AfritWildRenderer(EntityRendererProvider.Context renderManager) {
super(renderManager, new AfritWildModel());

@Override
protected void scale(AfritWildEntity entity, PoseStack matrixStackIn, float partialTickTime) {
super.scale(entity, matrixStackIn, partialTickTime);
matrixStackIn.scale(1.2f, 1.2f, 1.2f);
this.addRenderLayer(new AutoGlowingGeoLayer<>(this));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,25 @@

package com.klikli_dev.occultism.common.entity.spirit;

import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.items.ItemStackHandler;
import software.bernie.geckolib.animatable.GeoEntity;
import software.bernie.geckolib.core.animatable.GeoAnimatable;
import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.core.animation.AnimatableManager;
import software.bernie.geckolib.core.animation.AnimationController;
import software.bernie.geckolib.core.animation.AnimationState;
import software.bernie.geckolib.core.animation.RawAnimation;
import software.bernie.geckolib.core.object.PlayState;
import software.bernie.geckolib.util.GeckoLibUtil;

public class AfritEntity extends SpiritEntity {
public class AfritEntity extends SpiritEntity implements GeoEntity {
AnimatableInstanceCache animatableInstanceCache = GeckoLibUtil.createInstanceCache(this);

public AfritEntity(EntityType<? extends AfritEntity> type, Level level) {
super(type, level);
Expand All @@ -48,4 +60,33 @@ public static AttributeSupplier.Builder createAttributes() {
.add(Attributes.ARMOR, 8.0)
.add(Attributes.ARMOR_TOUGHNESS, 50.0);
}

@Override
protected void playStepSound(BlockPos pPos, BlockState pBlock) {
}

@Override
public int getCurrentSwingDuration() {
return 11; //to match our attack animation speed + 1 tick
}

@Override
public void registerControllers(AnimatableManager.ControllerRegistrar controllers) {
var mainController = new AnimationController<>(this, "mainController", 0, this::animPredicate);
controllers.add(mainController);
}

private <T extends GeoAnimatable> PlayState animPredicate(AnimationState<T> tAnimationState) {

if (this.swinging) {
return tAnimationState.setAndContinue(RawAnimation.begin().thenPlay("attack"));
}

return tAnimationState.setAndContinue(tAnimationState.isMoving() ? RawAnimation.begin().thenPlay("walk") : RawAnimation.begin().thenPlay("idle"));
}

@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.animatableInstanceCache;
}
}
Loading

0 comments on commit a0f3915

Please sign in to comment.