Skip to content

Commit d0c2c94

Browse files
KaupenjoeKaupenjoe
authored andcommitted
throwable projectiles
1 parent 814c0c7 commit d0c2c94

13 files changed

Lines changed: 357 additions & 5 deletions

File tree

src/main/java/net/kaupenjoe/tutorialmod/TutorialMod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.kaupenjoe.tutorialmod.enchantment.ModEnchantmentEffects;
77
import net.kaupenjoe.tutorialmod.entity.ModEntities;
88
import net.kaupenjoe.tutorialmod.entity.client.GeckoRenderer;
9+
import net.kaupenjoe.tutorialmod.entity.client.TomahawkProjectileRenderer;
910
import net.kaupenjoe.tutorialmod.item.ModCreativeModeTabs;
1011
import net.kaupenjoe.tutorialmod.item.ModItems;
1112
import net.kaupenjoe.tutorialmod.potion.ModPotions;
@@ -98,6 +99,7 @@ public static void onClientSetup(FMLClientSetupEvent event) {
9899
ModItemProperties.addCustomItemProperties();
99100

100101
EntityRenderers.register(ModEntities.GECKO.get(), GeckoRenderer::new);
102+
EntityRenderers.register(ModEntities.TOMAHAWK.get(), TomahawkProjectileRenderer::new);
101103
}
102104
}
103105
}

src/main/java/net/kaupenjoe/tutorialmod/entity/ModEntities.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

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

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

2227
public static void register(IEventBus eventBus) {
2328
ENTITY_TYPES.register(eventBus);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package net.kaupenjoe.tutorialmod.entity.client;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import net.kaupenjoe.tutorialmod.TutorialMod;
6+
import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
7+
import net.minecraft.client.model.EntityModel;
8+
import net.minecraft.client.model.geom.ModelLayerLocation;
9+
import net.minecraft.client.model.geom.ModelPart;
10+
import net.minecraft.client.model.geom.PartPose;
11+
import net.minecraft.client.model.geom.builders.*;
12+
import net.minecraft.resources.ResourceLocation;
13+
14+
public class TomahawkProjectileModel extends EntityModel<TomahawkProjectileEntity> {
15+
public static final ModelLayerLocation LAYER_LOCATION =
16+
new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "tomahawk"), "main");
17+
private final ModelPart tomahawk;
18+
19+
public TomahawkProjectileModel(ModelPart root) {
20+
this.tomahawk = root.getChild("tomahawk");
21+
}
22+
23+
public static LayerDefinition createBodyLayer() {
24+
MeshDefinition meshdefinition = new MeshDefinition();
25+
PartDefinition partdefinition = meshdefinition.getRoot();
26+
27+
PartDefinition tomahawk = partdefinition.addOrReplaceChild("tomahawk", CubeListBuilder.create(), PartPose.offset(0.0F, 16.5F, 0.0F));
28+
29+
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));
30+
31+
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));
32+
33+
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));
34+
35+
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));
36+
37+
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));
38+
39+
return LayerDefinition.create(meshdefinition, 32, 32);
40+
}
41+
42+
@Override
43+
public void setupAnim(TomahawkProjectileEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
44+
45+
}
46+
47+
@Override
48+
public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) {
49+
tomahawk.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
50+
}
51+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package net.kaupenjoe.tutorialmod.entity.client;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import com.mojang.math.Axis;
6+
import net.kaupenjoe.tutorialmod.TutorialMod;
7+
import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
8+
import net.minecraft.client.renderer.MultiBufferSource;
9+
import net.minecraft.client.renderer.entity.EntityRenderer;
10+
import net.minecraft.client.renderer.entity.EntityRendererProvider;
11+
import net.minecraft.client.renderer.entity.ItemRenderer;
12+
import net.minecraft.client.renderer.texture.OverlayTexture;
13+
import net.minecraft.resources.ResourceLocation;
14+
import net.minecraft.util.Mth;
15+
16+
public class TomahawkProjectileRenderer extends EntityRenderer<TomahawkProjectileEntity> {
17+
private TomahawkProjectileModel model;
18+
19+
public TomahawkProjectileRenderer(EntityRendererProvider.Context context) {
20+
super(context);
21+
this.model = new TomahawkProjectileModel(context.bakeLayer(TomahawkProjectileModel.LAYER_LOCATION));
22+
}
23+
24+
@Override
25+
public void render(TomahawkProjectileEntity pEntity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
26+
poseStack.pushPose();
27+
28+
if(!pEntity.isGrounded()) {
29+
poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, pEntity.yRotO, pEntity.getYRot())));
30+
poseStack.mulPose(Axis.XP.rotationDegrees(pEntity.getRenderingRotation() * 5f));
31+
poseStack.translate(0, -1.0f, 0);
32+
} else {
33+
poseStack.mulPose(Axis.YP.rotationDegrees(pEntity.groundedOffset.y));
34+
poseStack.mulPose(Axis.XP.rotationDegrees(pEntity.groundedOffset.x));
35+
poseStack.translate(0, -1.0f, 0);
36+
}
37+
38+
VertexConsumer vertexconsumer = ItemRenderer.getFoilBufferDirect(
39+
buffer, this.model.renderType(this.getTextureLocation(pEntity)),false, false);
40+
this.model.renderToBuffer(poseStack, vertexconsumer, packedLight, OverlayTexture.NO_OVERLAY);
41+
poseStack.popPose();
42+
super.render(pEntity, entityYaw, partialTicks, poseStack, buffer, packedLight);
43+
}
44+
45+
@Override
46+
public ResourceLocation getTextureLocation(TomahawkProjectileEntity entity) {
47+
return ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "textures/entity/tomahawk/tomahawk.png");
48+
}
49+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package net.kaupenjoe.tutorialmod.entity.custom;
2+
3+
import net.kaupenjoe.tutorialmod.entity.ModEntities;
4+
import net.kaupenjoe.tutorialmod.item.ModItems;
5+
import net.minecraft.core.Direction;
6+
import net.minecraft.world.entity.Entity;
7+
import net.minecraft.world.entity.EntityType;
8+
import net.minecraft.world.entity.LivingEntity;
9+
import net.minecraft.world.entity.projectile.AbstractArrow;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.level.Level;
12+
import net.minecraft.world.phys.BlockHitResult;
13+
import net.minecraft.world.phys.EntityHitResult;
14+
import net.minecraft.world.phys.Vec2;
15+
16+
public class TomahawkProjectileEntity extends AbstractArrow {
17+
private float rotation;
18+
public Vec2 groundedOffset;
19+
20+
public TomahawkProjectileEntity(EntityType<? extends AbstractArrow> entityType, Level level) {
21+
super(entityType, level);
22+
}
23+
24+
public TomahawkProjectileEntity(LivingEntity shooter, Level level) {
25+
super(ModEntities.TOMAHAWK.get(), shooter, level, new ItemStack(ModItems.TOMAHAWK.get()), null);
26+
}
27+
28+
@Override
29+
protected ItemStack getDefaultPickupItem() {
30+
return new ItemStack(ModItems.TOMAHAWK.get());
31+
}
32+
33+
public float getRenderingRotation() {
34+
rotation += 0.5f;
35+
if(rotation >= 360) {
36+
rotation = 0;
37+
}
38+
return rotation;
39+
}
40+
41+
public boolean isGrounded() {
42+
return inGround;
43+
}
44+
45+
@Override
46+
protected void onHitEntity(EntityHitResult result) {
47+
super.onHitEntity(result);
48+
Entity entity = result.getEntity();
49+
entity.hurt(this.damageSources().thrown(this, this.getOwner()), 4);
50+
51+
if (!this.level().isClientSide) {
52+
this.level().broadcastEntityEvent(this, (byte)3);
53+
this.discard();
54+
}
55+
}
56+
57+
@Override
58+
protected void onHitBlock(BlockHitResult result) {
59+
super.onHitBlock(result);
60+
61+
if(result.getDirection() == Direction.SOUTH) {
62+
groundedOffset = new Vec2(215f,180f);
63+
}
64+
if(result.getDirection() == Direction.NORTH) {
65+
groundedOffset = new Vec2(215f, 0f);
66+
}
67+
if(result.getDirection() == Direction.EAST) {
68+
groundedOffset = new Vec2(215f,-90f);
69+
}
70+
if(result.getDirection() == Direction.WEST) {
71+
groundedOffset = new Vec2(215f,90f);
72+
}
73+
74+
if(result.getDirection() == Direction.DOWN) {
75+
groundedOffset = new Vec2(115f,180f);
76+
}
77+
if(result.getDirection() == Direction.UP) {
78+
groundedOffset = new Vec2(285f,180f);
79+
}
80+
}
81+
}

src/main/java/net/kaupenjoe/tutorialmod/event/ModEventBusEvents.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.kaupenjoe.tutorialmod.TutorialMod;
44
import net.kaupenjoe.tutorialmod.entity.ModEntities;
55
import net.kaupenjoe.tutorialmod.entity.client.GeckoModel;
6+
import net.kaupenjoe.tutorialmod.entity.client.TomahawkProjectileModel;
67
import net.kaupenjoe.tutorialmod.entity.custom.GeckoEntity;
78
import net.minecraft.world.entity.SpawnPlacementTypes;
89
import net.minecraft.world.entity.animal.Animal;
@@ -18,6 +19,7 @@ public class ModEventBusEvents {
1819
@SubscribeEvent
1920
public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions event) {
2021
event.registerLayerDefinition(GeckoModel.LAYER_LOCATION, GeckoModel::createBodyLayer);
22+
event.registerLayerDefinition(TomahawkProjectileModel.LAYER_LOCATION, TomahawkProjectileModel::createBodyLayer);
2123
}
2224

2325
@SubscribeEvent

src/main/java/net/kaupenjoe/tutorialmod/item/ModCreativeModeTabs.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public class ModCreativeModeTabs {
5151
output.accept(ModItems.RADISH_SEEDS);
5252

5353
output.accept(ModItems.GOJI_BERRIES);
54+
output.accept(ModItems.TOMAHAWK);
5455

5556
output.accept(ModItems.GECKO_SPAWN_EGG);
5657

src/main/java/net/kaupenjoe/tutorialmod/item/ModItems.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import net.kaupenjoe.tutorialmod.TutorialMod;
44
import net.kaupenjoe.tutorialmod.block.ModBlocks;
55
import net.kaupenjoe.tutorialmod.entity.ModEntities;
6-
import net.kaupenjoe.tutorialmod.item.custom.ChiselItem;
7-
import net.kaupenjoe.tutorialmod.item.custom.FuelItem;
8-
import net.kaupenjoe.tutorialmod.item.custom.HammerItem;
9-
import net.kaupenjoe.tutorialmod.item.custom.ModArmorItem;
6+
import net.kaupenjoe.tutorialmod.item.custom.*;
107
import net.kaupenjoe.tutorialmod.sound.ModSounds;
118
import net.minecraft.network.chat.Component;
129
import net.minecraft.resources.ResourceLocation;
@@ -99,6 +96,9 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List<Compon
9996
() -> new DeferredSpawnEggItem(ModEntities.GECKO, 0x31afaf, 0xffac00,
10097
new Item.Properties()));
10198

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

103103
public static void register(IEventBus eventBus) {
104104
ITEMS.register(eventBus);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package net.kaupenjoe.tutorialmod.item.custom;
2+
3+
import net.kaupenjoe.tutorialmod.entity.custom.TomahawkProjectileEntity;
4+
import net.minecraft.sounds.SoundEvents;
5+
import net.minecraft.sounds.SoundSource;
6+
import net.minecraft.stats.Stats;
7+
import net.minecraft.world.InteractionHand;
8+
import net.minecraft.world.InteractionResultHolder;
9+
import net.minecraft.world.entity.player.Player;
10+
import net.minecraft.world.item.Item;
11+
import net.minecraft.world.item.ItemStack;
12+
import net.minecraft.world.level.Level;
13+
14+
public class TomahawkItem extends Item {
15+
public TomahawkItem(Properties properties) {
16+
super(properties);
17+
}
18+
19+
@Override
20+
public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) {
21+
ItemStack itemstack = pPlayer.getItemInHand(pUsedHand);
22+
pLevel.playSound(null, pPlayer.getX(), pPlayer.getY(), pPlayer.getZ(),
23+
SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (pLevel.getRandom().nextFloat() * 0.4F + 0.8F));
24+
if (!pLevel.isClientSide) {
25+
TomahawkProjectileEntity tomahawkProjectile = new TomahawkProjectileEntity(pPlayer, pLevel);
26+
tomahawkProjectile.shootFromRotation(pPlayer, pPlayer.getXRot(), pPlayer.getYRot(), 0.0F, 1.5F, 0F);
27+
pLevel.addFreshEntity(tomahawkProjectile);
28+
}
29+
30+
pPlayer.awardStat(Stats.ITEM_USED.get(this));
31+
if (!pPlayer.getAbilities().instabuild) {
32+
itemstack.shrink(1);
33+
}
34+
35+
return InteractionResultHolder.sidedSuccess(itemstack, pLevel.isClientSide());
36+
}
37+
}

src/main/resources/assets/tutorialmod/lang/en_us.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

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

40+
"item.tutorialmod.tomahawk": "Tomahawk",
41+
4042

4143
"block.tutorialmod.bismuth_block": "Block of Bismuth",
4244
"block.tutorialmod.bismuth_ore": "Bismuth Ore",
@@ -100,5 +102,6 @@
100102
"trim_pattern.tutorialmod.kaupen": "Kaupen Armor Trim",
101103
"trim_material.tutorialmod.bismuth": "Bismuth Material",
102104

103-
"entity.mccourse.gecko": "Gecko"
105+
"entity.mccourse.gecko": "Gecko",
106+
"entity.mccourse.tomahawk": "Tomahawk"
104107
}

0 commit comments

Comments
 (0)