Skip to content

Commit

Permalink
throwable projectiles
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaupenjoe committed Dec 20, 2024
1 parent 814c0c7 commit d0c2c94
Show file tree
Hide file tree
Showing 13 changed files with 357 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/main/java/net/kaupenjoe/tutorialmod/TutorialMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.kaupenjoe.tutorialmod.enchantment.ModEnchantmentEffects;
import net.kaupenjoe.tutorialmod.entity.ModEntities;
import net.kaupenjoe.tutorialmod.entity.client.GeckoRenderer;
import net.kaupenjoe.tutorialmod.entity.client.TomahawkProjectileRenderer;
import net.kaupenjoe.tutorialmod.item.ModCreativeModeTabs;
import net.kaupenjoe.tutorialmod.item.ModItems;
import net.kaupenjoe.tutorialmod.potion.ModPotions;
Expand Down Expand Up @@ -98,6 +99,7 @@ public static void onClientSetup(FMLClientSetupEvent event) {
ModItemProperties.addCustomItemProperties();

EntityRenderers.register(ModEntities.GECKO.get(), GeckoRenderer::new);
EntityRenderers.register(ModEntities.TOMAHAWK.get(), TomahawkProjectileRenderer::new);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.entity.custom.GeckoEntity;
import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
Expand All @@ -18,6 +19,10 @@ public class ModEntities {
ENTITY_TYPES.register("gecko", () -> EntityType.Builder.of(GeckoEntity::new, MobCategory.CREATURE)
.sized(0.75f, 0.35f).build("gecko"));

public static final Supplier<EntityType<TomahawkProjectileEntity>> TOMAHAWK =
ENTITY_TYPES.register("tomahawk", () -> EntityType.Builder.<TomahawkProjectileEntity>of(TomahawkProjectileEntity::new, MobCategory.MISC)
.sized(0.5f, 1.15f).build("tomahawk"));


public static void register(IEventBus eventBus) {
ENTITY_TYPES.register(eventBus);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package net.kaupenjoe.tutorialmod.entity.client;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.resources.ResourceLocation;

public class TomahawkProjectileModel extends EntityModel<TomahawkProjectileEntity> {
public static final ModelLayerLocation LAYER_LOCATION =
new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "tomahawk"), "main");
private final ModelPart tomahawk;

public TomahawkProjectileModel(ModelPart root) {
this.tomahawk = root.getChild("tomahawk");
}

public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = new MeshDefinition();
PartDefinition partdefinition = meshdefinition.getRoot();

PartDefinition tomahawk = partdefinition.addOrReplaceChild("tomahawk", CubeListBuilder.create(), PartPose.offset(0.0F, 16.5F, 0.0F));

PartDefinition cube_r1 = tomahawk.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(8, 7).addBox(1.5F, 2.5F, -0.5F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -7.0F, -4.0F, 0.0F, -1.5708F, 0.0F));

PartDefinition cube_r2 = tomahawk.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(7, 9).addBox(0.5F, -1.5F, -0.5F, 2.0F, 5.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -7.0F, -5.0F, 0.0F, -1.5708F, 0.0F));

PartDefinition cube_r3 = tomahawk.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(3, 10).addBox(-2.5F, -1.5F, -0.5F, 1.0F, 4.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -7.0F, 5.0F, 0.0F, -1.5708F, 0.0F));

PartDefinition cube_r4 = tomahawk.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(1, 4).addBox(-2.5F, -1.5F, 0.0F, 5.0F, 3.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -7.0F, 0.0F, 0.0F, -1.5708F, 0.0F));

PartDefinition cube_r5 = tomahawk.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(18, 1).addBox(-0.5F, -9.0F, -0.5F, 1.0F, 18.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -1.5F, 0.0F, 0.0F, -0.7854F, 0.0F));

return LayerDefinition.create(meshdefinition, 32, 32);
}

@Override
public void setupAnim(TomahawkProjectileEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {

}

@Override
public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) {
tomahawk.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package net.kaupenjoe.tutorialmod.entity.client;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;

public class TomahawkProjectileRenderer extends EntityRenderer<TomahawkProjectileEntity> {
private TomahawkProjectileModel model;

public TomahawkProjectileRenderer(EntityRendererProvider.Context context) {
super(context);
this.model = new TomahawkProjectileModel(context.bakeLayer(TomahawkProjectileModel.LAYER_LOCATION));
}

@Override
public void render(TomahawkProjectileEntity pEntity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
poseStack.pushPose();

if(!pEntity.isGrounded()) {
poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, pEntity.yRotO, pEntity.getYRot())));
poseStack.mulPose(Axis.XP.rotationDegrees(pEntity.getRenderingRotation() * 5f));
poseStack.translate(0, -1.0f, 0);
} else {
poseStack.mulPose(Axis.YP.rotationDegrees(pEntity.groundedOffset.y));
poseStack.mulPose(Axis.XP.rotationDegrees(pEntity.groundedOffset.x));
poseStack.translate(0, -1.0f, 0);
}

VertexConsumer vertexconsumer = ItemRenderer.getFoilBufferDirect(
buffer, this.model.renderType(this.getTextureLocation(pEntity)),false, false);
this.model.renderToBuffer(poseStack, vertexconsumer, packedLight, OverlayTexture.NO_OVERLAY);
poseStack.popPose();
super.render(pEntity, entityYaw, partialTicks, poseStack, buffer, packedLight);
}

@Override
public ResourceLocation getTextureLocation(TomahawkProjectileEntity entity) {
return ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "textures/entity/tomahawk/tomahawk.png");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package net.kaupenjoe.tutorialmod.entity.custom;

import net.kaupenjoe.tutorialmod.entity.ModEntities;
import net.kaupenjoe.tutorialmod.item.ModItems;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.Vec2;

public class TomahawkProjectileEntity extends AbstractArrow {
private float rotation;
public Vec2 groundedOffset;

public TomahawkProjectileEntity(EntityType<? extends AbstractArrow> entityType, Level level) {
super(entityType, level);
}

public TomahawkProjectileEntity(LivingEntity shooter, Level level) {
super(ModEntities.TOMAHAWK.get(), shooter, level, new ItemStack(ModItems.TOMAHAWK.get()), null);
}

@Override
protected ItemStack getDefaultPickupItem() {
return new ItemStack(ModItems.TOMAHAWK.get());
}

public float getRenderingRotation() {
rotation += 0.5f;
if(rotation >= 360) {
rotation = 0;
}
return rotation;
}

public boolean isGrounded() {
return inGround;
}

@Override
protected void onHitEntity(EntityHitResult result) {
super.onHitEntity(result);
Entity entity = result.getEntity();
entity.hurt(this.damageSources().thrown(this, this.getOwner()), 4);

if (!this.level().isClientSide) {
this.level().broadcastEntityEvent(this, (byte)3);
this.discard();
}
}

@Override
protected void onHitBlock(BlockHitResult result) {
super.onHitBlock(result);

if(result.getDirection() == Direction.SOUTH) {
groundedOffset = new Vec2(215f,180f);
}
if(result.getDirection() == Direction.NORTH) {
groundedOffset = new Vec2(215f, 0f);
}
if(result.getDirection() == Direction.EAST) {
groundedOffset = new Vec2(215f,-90f);
}
if(result.getDirection() == Direction.WEST) {
groundedOffset = new Vec2(215f,90f);
}

if(result.getDirection() == Direction.DOWN) {
groundedOffset = new Vec2(115f,180f);
}
if(result.getDirection() == Direction.UP) {
groundedOffset = new Vec2(285f,180f);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.entity.ModEntities;
import net.kaupenjoe.tutorialmod.entity.client.GeckoModel;
import net.kaupenjoe.tutorialmod.entity.client.TomahawkProjectileModel;
import net.kaupenjoe.tutorialmod.entity.custom.GeckoEntity;
import net.minecraft.world.entity.SpawnPlacementTypes;
import net.minecraft.world.entity.animal.Animal;
Expand All @@ -18,6 +19,7 @@ public class ModEventBusEvents {
@SubscribeEvent
public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions event) {
event.registerLayerDefinition(GeckoModel.LAYER_LOCATION, GeckoModel::createBodyLayer);
event.registerLayerDefinition(TomahawkProjectileModel.LAYER_LOCATION, TomahawkProjectileModel::createBodyLayer);
}

@SubscribeEvent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public class ModCreativeModeTabs {
output.accept(ModItems.RADISH_SEEDS);

output.accept(ModItems.GOJI_BERRIES);
output.accept(ModItems.TOMAHAWK);

output.accept(ModItems.GECKO_SPAWN_EGG);

Expand Down
8 changes: 4 additions & 4 deletions src/main/java/net/kaupenjoe/tutorialmod/item/ModItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.block.ModBlocks;
import net.kaupenjoe.tutorialmod.entity.ModEntities;
import net.kaupenjoe.tutorialmod.item.custom.ChiselItem;
import net.kaupenjoe.tutorialmod.item.custom.FuelItem;
import net.kaupenjoe.tutorialmod.item.custom.HammerItem;
import net.kaupenjoe.tutorialmod.item.custom.ModArmorItem;
import net.kaupenjoe.tutorialmod.item.custom.*;
import net.kaupenjoe.tutorialmod.sound.ModSounds;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
Expand Down Expand Up @@ -99,6 +96,9 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List<Compon
() -> new DeferredSpawnEggItem(ModEntities.GECKO, 0x31afaf, 0xffac00,
new Item.Properties()));

public static final DeferredItem<Item> TOMAHAWK = ITEMS.register("tomahawk",
() -> new TomahawkItem(new Item.Properties().stacksTo(16)));


public static void register(IEventBus eventBus) {
ITEMS.register(eventBus);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package net.kaupenjoe.tutorialmod.item.custom;

import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.stats.Stats;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;

public class TomahawkItem extends Item {
public TomahawkItem(Properties properties) {
super(properties);
}

@Override
public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) {
ItemStack itemstack = pPlayer.getItemInHand(pUsedHand);
pLevel.playSound(null, pPlayer.getX(), pPlayer.getY(), pPlayer.getZ(),
SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (pLevel.getRandom().nextFloat() * 0.4F + 0.8F));
if (!pLevel.isClientSide) {
TomahawkProjectileEntity tomahawkProjectile = new TomahawkProjectileEntity(pPlayer, pLevel);
tomahawkProjectile.shootFromRotation(pPlayer, pPlayer.getXRot(), pPlayer.getYRot(), 0.0F, 1.5F, 0F);
pLevel.addFreshEntity(tomahawkProjectile);
}

pPlayer.awardStat(Stats.ITEM_USED.get(this));
if (!pPlayer.getAbilities().instabuild) {
itemstack.shrink(1);
}

return InteractionResultHolder.sidedSuccess(itemstack, pLevel.isClientSide());
}
}
5 changes: 4 additions & 1 deletion src/main/resources/assets/tutorialmod/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@

"item.tutorialmod.gecko_spawn_egg": "Gecko Spawn Egg",

"item.tutorialmod.tomahawk": "Tomahawk",


"block.tutorialmod.bismuth_block": "Block of Bismuth",
"block.tutorialmod.bismuth_ore": "Bismuth Ore",
Expand Down Expand Up @@ -100,5 +102,6 @@
"trim_pattern.tutorialmod.kaupen": "Kaupen Armor Trim",
"trim_material.tutorialmod.bismuth": "Bismuth Material",

"entity.mccourse.gecko": "Gecko"
"entity.mccourse.gecko": "Gecko",
"entity.mccourse.tomahawk": "Tomahawk"
}
Loading

0 comments on commit d0c2c94

Please sign in to comment.