Hi
I wanted to my custom mob to hold any sword item, but didn’t rendered properly.
In entity class, make entity hold items as below:
@Override
public InteractionResult mobInteract(Player pPlayer, InteractionHand pHand) {
//…
ItemStack itemstack = pPlayer.getItemInHand(pHand);
if (this.isTame()) {
if ( (itemstack.is(Items.MELON_SLICE) || itemstack.is(Items.HONEY_BOTTLE)) && this.getHealth() < this.getMaxHealth() ) {
//…
} /* Handle holding sword */ else if (itemstack.getItem() instanceof SwordItem) {
pPlayer.displayClientMessage(Component.literal("Clicked with item: " + itemstack.getDisplayName().getString()).withStyle(ChatFormatting.GOLD), true);
//Return sword
//pPlayer.getInventory().add(this.getItemInHand(InteractionHand.MAIN_HAND));
pPlayer.getInventory().add(this.getItemBySlot(EquipmentSlot.MAINHAND));
//The entity holds item
//this.setItemInHand(InteractionHand.MAIN_HAND, itemstack);
this.setItemSlot(EquipmentSlot.MAINHAND, itemstack.copy()); //Give copy of itemstack
//If player is not in creative mode. From mobInteract() in wolf.
if (!pPlayer.getAbilities().instabuild) {
//Decrement sword count in hand
pPlayer.getItemInHand(pHand).shrink(1);
}
return InteractionResult.SUCCESS;
} else {
//If player is sneaking
pPlayer.displayClientMessage(getItemInHand(InteractionHand.MAIN_HAND).getDisplayName(), false);
if (pPlayer.isShiftKeyDown()) {
//Return sword
//pPlayer.getInventory().add(this.getItemInHand(InteractionHand.MAIN_HAND));
pPlayer.getInventory().add(this.getItemBySlot(EquipmentSlot.MAINHAND));
//The entity holds nothing
this.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY);
return InteractionResult.SUCCESS;
} else {
//…
}
} else {
return interactionresult;
}
}
And in render class, render the item as below:
@Override
public void render(RanaEntity pEntity, float pEntityYaw, float pPartialTicks, PoseStack pMatrixStack, MultiBufferSource pBuffer, int pPackedLight) {
if(pEntity.isBaby()) {
pMatrixStack.scale(0.5f, 0.5f, 0.5f);
}
model.setupAnim(pEntity, 0, 0, 0, pEntityYaw, 0); //
//Get location and rotation of arm bone
ModelPart rightArm = model.rightArm(); //Get right arm
//Get location and rotation of item according to arm bone
pMatrixStack.pushPose();
pMatrixStack.translate(rightArm.x, rightArm.y, rightArm.z); //Move to bone location
pMatrixStack.mulPose(Axis.XP.rotationDegrees(rightArm.xRot)); //Rotate X
pMatrixStack.mulPose(Axis.YP.rotationDegrees(rightArm.yRot)); //Rotate Y
pMatrixStack.mulPose(Axis.ZP.rotationDegrees(rightArm.zRot)); //Rotate Z
//Draw item
//ItemStack itemStack = pEntity.getItemInHand(InteractionHand.MAIN_HAND);
ItemStack itemStack = pEntity.getItemBySlot(EquipmentSlot.MAINHAND);
if (!itemStack.isEmpty()) {
//Offset
pMatrixStack.translate(0.0, 0.0, 0.1);
// Render the item
//Minecraft.getInstance().getItemRenderer().renderStatic(itemStack, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, pPackedLight, OverlayTexture.NO_OVERLAY, pMatrixStack, pBuffer, pEntity.level(), pEntity.getId());
//itemRenderer.renderStatic(itemStack, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, pPackedLight, OverlayTexture.NO_OVERLAY, pMatrixStack, pBuffer, pEntity.level(), pEntity.getId());
itemInHandRenderer.renderItem(pEntity, itemStack, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND, false, pMatrixStack, pBuffer, pEntity.getId());
}
pMatrixStack.popPose();
super.render(pEntity, pEntityYaw, pPartialTicks, pMatrixStack, pBuffer, pPackedLight);
}
I confirmed the entity can properly hold item(logically) but the item which the entity holds is not rendered at all.
Full code: https://github.com/sakiiiiika/ranamod
Thanks.