diff --git a/src/main/java/net/mcreator/superbwarfare/client/model/entity/ModelHandGrenade.java b/src/main/java/net/mcreator/superbwarfare/client/model/entity/ModelHandGrenade.java index 9e59adaac..647def3a5 100644 --- a/src/main/java/net/mcreator/superbwarfare/client/model/entity/ModelHandGrenade.java +++ b/src/main/java/net/mcreator/superbwarfare/client/model/entity/ModelHandGrenade.java @@ -25,29 +25,29 @@ public class ModelHandGrenade extends EntityModel { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); - PartDefinition group = partdefinition.addOrReplaceChild("group", CubeListBuilder.create().texOffs(6, 8).addBox(-0.4375F, -1.5976F, -0.5375F, 0.875F, 0.3F, 1.075F, new CubeDeformation(0.0F)) - .texOffs(11, 13).addBox(-0.45F, -2.45F, -0.6F, 0.9F, 0.85F, 1.35F, new CubeDeformation(0.0F)) - .texOffs(13, 14).addBox(-0.45F, -2.45F, 0.75F, 0.9F, 0.85F, 0.3F, new CubeDeformation(0.0F)) - .texOffs(12, 15).addBox(-0.45F, -1.95F, 1.05F, 0.9F, 0.35F, 0.3F, new CubeDeformation(0.0F)) - .texOffs(11, 14).addBox(-0.45F, -2.25F, 1.05F, 0.9F, 0.3F, 0.2F, new CubeDeformation(0.0F)) - .texOffs(9, 13).addBox(-0.5F, -2.65F, -1.1F, 1.0F, 0.2F, 2.2F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 16.0F, 0.0F)); + PartDefinition group = partdefinition.addOrReplaceChild("group", CubeListBuilder.create().texOffs(6, 8).addBox(-0.4375F, 0.424F, -1.0258F, 0.875F, 0.3F, 1.075F, new CubeDeformation(0.0F)) + .texOffs(11, 13).addBox(-0.45F, -0.4283F, -1.0883F, 0.9F, 0.85F, 1.35F, new CubeDeformation(0.0F)) + .texOffs(13, 14).addBox(-0.45F, -0.4283F, 0.2617F, 0.9F, 0.85F, 0.3F, new CubeDeformation(0.0F)) + .texOffs(12, 15).addBox(-0.45F, 0.0717F, 0.5617F, 0.9F, 0.35F, 0.3F, new CubeDeformation(0.0F)) + .texOffs(11, 14).addBox(-0.45F, -0.2283F, 0.5617F, 0.9F, 0.3F, 0.2F, new CubeDeformation(0.0F)) + .texOffs(9, 13).addBox(-0.5F, -0.6283F, -1.5883F, 1.0F, 0.2F, 2.2F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -0.0217F, 0.4883F)); - PartDefinition cube_r1 = group.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(11, 14).addBox(-1.5F, -0.2F, 1.5F, 1.0F, 1.0F, 0.2F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -1.8147F, -0.3941F, 0.3927F, 0.0F, 0.0F)); + PartDefinition cube_r1 = group.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(11, 14).addBox(-1.5F, -0.2F, 1.5F, 1.0F, 1.0F, 0.2F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, 0.207F, -0.8823F, 0.3927F, 0.0F, 0.0F)); - PartDefinition cube_r2 = group.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(12, 14).addBox(-1.45F, -1.3391F, 0.4F, 0.9F, 0.9391F, 0.3508F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, -1.0774F, -0.8165F, 0.3927F, 0.0F, 0.0F)); + PartDefinition cube_r2 = group.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(12, 14).addBox(-1.45F, -1.3391F, 0.4F, 0.9F, 0.9391F, 0.3508F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.0F, 0.9443F, -1.3048F, 0.3927F, 0.0F, 0.0F)); - PartDefinition bone2 = group.addOrReplaceChild("bone2", CubeListBuilder.create(), PartPose.offset(0.0F, 0.0078F, -25.7281F)); + PartDefinition bone2 = group.addOrReplaceChild("bone2", CubeListBuilder.create(), PartPose.offset(0.0F, 2.0295F, -26.2164F)); PartDefinition bone178_r1 = bone2.addOrReplaceChild("bone178_r1", CubeListBuilder.create().texOffs(0, 8).addBox(-1.2976F, -0.5375F, -0.5375F, 2.5953F, 1.075F, 1.075F, new CubeDeformation(0.0F)) .texOffs(10, 0).addBox(-0.5375F, -1.2976F, -0.5375F, 1.075F, 2.5953F, 1.075F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -0.0078F, 25.7281F, 0.0F, 0.0F, 0.7854F)); - PartDefinition bone3 = group.addOrReplaceChild("bone3", CubeListBuilder.create().texOffs(0, 10).addBox(-0.5375F, -1.3054F, 25.1906F, 1.075F, 2.5953F, 1.075F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0078F, -25.7281F)); + PartDefinition bone3 = group.addOrReplaceChild("bone3", CubeListBuilder.create().texOffs(0, 10).addBox(-0.5375F, -1.3054F, 25.1906F, 1.075F, 2.5953F, 1.075F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 2.0295F, -26.2164F)); PartDefinition bone179_r1 = bone3.addOrReplaceChild("bone179_r1", CubeListBuilder.create().texOffs(5, 1).addBox(-0.5375F, -0.5375F, -1.2976F, 1.075F, 1.075F, 2.5953F, new CubeDeformation(0.0F)) .texOffs(7, 9).addBox(-0.5375F, -1.2976F, -0.5375F, 1.075F, 2.5953F, 1.075F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -0.0078F, 25.7281F, 0.7854F, 0.0F, 0.0F)); PartDefinition bone175 = group.addOrReplaceChild("bone175", CubeListBuilder.create().texOffs(7, 7).addBox(-1.2976F, -0.5453F, 25.1906F, 2.5953F, 1.075F, 1.075F, new CubeDeformation(0.0F)) - .texOffs(0, 4).addBox(-0.5375F, -0.5453F, 24.4305F, 1.075F, 1.075F, 2.5953F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0078F, -25.7281F)); + .texOffs(0, 4).addBox(-0.5375F, -0.5453F, 24.4305F, 1.075F, 1.075F, 2.5953F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 2.0295F, -26.2164F)); PartDefinition bone180_r1 = bone175.addOrReplaceChild("bone180_r1", CubeListBuilder.create().texOffs(0, 0).addBox(-0.5375F, -0.5375F, -1.2976F, 1.075F, 1.075F, 2.5953F, new CubeDeformation(0.0F)) .texOffs(5, 5).addBox(-1.2976F, -0.5375F, -0.5375F, 2.5953F, 1.075F, 1.075F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -0.0078F, 25.7281F, 0.0F, 0.7854F, 0.0F)); diff --git a/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/HandGrenadeEntityRenderer.java b/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/HandGrenadeEntityRenderer.java new file mode 100644 index 000000000..7ff11d507 --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/client/renderer/entity/HandGrenadeEntityRenderer.java @@ -0,0 +1,40 @@ +package net.mcreator.superbwarfare.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.mcreator.superbwarfare.client.model.entity.ModelHandGrenade; +import net.mcreator.superbwarfare.entity.HandGrenadeEntity; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public class HandGrenadeEntityRenderer extends EntityRenderer { + private static final ResourceLocation texture = new ResourceLocation("superbwarfare:textures/entity/hand_grenade.png"); + private final ModelHandGrenade model; + + public HandGrenadeEntityRenderer(EntityRendererProvider.Context context) { + super(context); + model = new ModelHandGrenade<>(context.bakeLayer(ModelHandGrenade.LAYER_LOCATION)); + } + + @Override + public void render(HandGrenadeEntity entityIn, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferIn, int packedLightIn) { + VertexConsumer vb = bufferIn.getBuffer(RenderType.entityCutout(this.getTextureLocation(entityIn))); + poseStack.pushPose(); + poseStack.mulPose(Axis.YP.rotationDegrees(Mth.lerp(partialTicks, entityIn.yRotO, entityIn.getYRot()) - 90)); + poseStack.mulPose(Axis.ZP.rotationDegrees(90 + Mth.lerp(partialTicks, entityIn.xRotO, entityIn.getXRot()))); + model.renderToBuffer(poseStack, vb, packedLightIn, OverlayTexture.NO_OVERLAY, 1, 1, 1, 0.0625f); + poseStack.popPose(); + super.render(entityIn, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn); + } + + @Override + public ResourceLocation getTextureLocation(HandGrenadeEntity entity) { + return texture; + } +} diff --git a/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java b/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java new file mode 100644 index 000000000..8d7aa53f0 --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/entity/HandGrenadeEntity.java @@ -0,0 +1,149 @@ +package net.mcreator.superbwarfare.entity; + +import net.mcreator.superbwarfare.init.ModDamageTypes; +import net.mcreator.superbwarfare.init.ModEntities; +import net.mcreator.superbwarfare.init.ModItems; +import net.mcreator.superbwarfare.tools.CustomExplosion; +import net.mcreator.superbwarfare.tools.ParticleTool; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraftforge.network.NetworkHooks; +import net.minecraftforge.network.PlayMessages; + +public class HandGrenadeEntity extends ThrowableItemProjectile { + private int fuse = 100; + + public HandGrenadeEntity(EntityType type, Level world) { + super(type, world); + } + + public HandGrenadeEntity(EntityType type, LivingEntity entity, Level world) { + super(type, entity, world); + } + + public HandGrenadeEntity(LivingEntity entity, Level level, int fuse) { + super(ModEntities.HAND_GRENADE_ENTITY.get(), entity, level); + this.fuse = fuse; + } + + public HandGrenadeEntity(PlayMessages.SpawnEntity spawnEntity, Level level) { + this(ModEntities.HAND_GRENADE_ENTITY.get(), level); + } + + @Override + public Packet getAddEntityPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected Item getDefaultItem() { + return ModItems.HAND_GRENADE.get(); + } + + + @Override + protected void onHit(HitResult result) + { + switch(result.getType()) + { + case BLOCK: + BlockHitResult blockResult = (BlockHitResult) result; + BlockPos resultPos = blockResult.getBlockPos(); + BlockState state = this.level().getBlockState(resultPos); + SoundEvent event = state.getBlock().getSoundType(state, this.level(), resultPos, this).getStepSound(); + double speed = this.getDeltaMovement().length(); + if(speed > 0.1) + { + this.level().playSound(null, result.getLocation().x, result.getLocation().y, result.getLocation().z, event, SoundSource.AMBIENT, 1.0F, 1.0F); + } + this.bounce(blockResult.getDirection()); + break; + + case ENTITY: + EntityHitResult entityResult = (EntityHitResult) result; + Entity entity = entityResult.getEntity(); + + double speed_e = this.getDeltaMovement().length(); + if(speed_e > 0.1) + { + entity.hurt(entity.damageSources().thrown(this, this.getOwner()), 1.0F); + } + this.bounce(Direction.getNearest(this.getDeltaMovement().x(), this.getDeltaMovement().y(), this.getDeltaMovement().z()).getOpposite()); + this.setDeltaMovement(this.getDeltaMovement().multiply(0.25, 1.0, 0.25)); + break; + default: + break; + } + } + + private void bounce(Direction direction) + { + switch(direction.getAxis()) + { + case X: + this.setDeltaMovement(this.getDeltaMovement().multiply(-0.5, 0.75, 0.75)); + break; + case Y: + this.setDeltaMovement(this.getDeltaMovement().multiply(0.75, -0.25, 0.75)); + if(this.getDeltaMovement().y() < this.getGravity()) + { + this.setDeltaMovement(this.getDeltaMovement().multiply(1, 0, 1)); + } + break; + case Z: + this.setDeltaMovement(this.getDeltaMovement().multiply(0.75, 0.75, -0.5)); + break; + } + } + + @Override + public void tick() { + super.tick(); + --this.fuse; + + if (this.fuse <= 0) { + this.discard(); + if (!this.level().isClientSide) { + causeExplode(); + } + } + + if (!this.level().isClientSide() && this.level() instanceof ServerLevel serverLevel) { + ParticleTool.sendParticle(serverLevel, ParticleTypes.SMOKE, this.xo, this.yo, this.zo, + 1, 0, 0, 0, 0.01, true); + } + } + + private void causeExplode() { + CustomExplosion explosion = new CustomExplosion(this.level(), this, + ModDamageTypes.causeProjectileBoomDamage(this.level().registryAccess(), this, this.getOwner()), 90, + this.getX(), this.getY(), this.getZ(), 10f, Explosion.BlockInteraction.KEEP).setDamageMultiplier(2); + explosion.explode(); + net.minecraftforge.event.ForgeEventFactory.onExplosionStart(this.level(), explosion); + explosion.finalizeExplosion(false); + ParticleTool.spawnMediumExplosionParticles(this.level(), this.position()); + this.discard(); + } + + @Override + protected float getGravity() { + return 0.07F; + } +} diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModEntities.java b/src/main/java/net/mcreator/superbwarfare/init/ModEntities.java index 98dabbea9..8b61de377 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModEntities.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModEntities.java @@ -53,6 +53,8 @@ public class ModEntities { EntityType.Builder.of(ProjectileEntity::new, MobCategory.MISC).setCustomClientFactory(ProjectileEntity::new).setTrackingRange(512).sized(0.5f, 0.5f)); public static final RegistryObject> CANNON_SHELL = register("projectile_cannon_shell", EntityType.Builder.of(CannonShellEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(CannonShellEntity::new).sized(0.5f, 0.5f)); + public static final RegistryObject> HAND_GRENADE_ENTITY = register("projectile_hand_grenade_entity", + EntityType.Builder.of(HandGrenadeEntity::new, MobCategory.MISC).setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(1).setCustomClientFactory(HandGrenadeEntity::new).sized(0.3f, 0.3f)); private static RegistryObject> register(String registryname, EntityType.Builder entityTypeBuilder) { diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java b/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java index e364c7a71..afe50d215 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModEntityRenderers.java @@ -26,5 +26,6 @@ public class ModEntityRenderers { event.registerEntityRenderer(ModEntities.MK_42.get(), Mk42Renderer::new); event.registerEntityRenderer(ModEntities.DRONE.get(), DroneRenderer::new); event.registerEntityRenderer(ModEntities.DRONE_GRENADE.get(), DroneGrenadeRenderer::new); + event.registerEntityRenderer(ModEntities.HAND_GRENADE_ENTITY.get(), HandGrenadeEntityRenderer::new); } } diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModItems.java b/src/main/java/net/mcreator/superbwarfare/init/ModItems.java index 33a06515a..1204eff2c 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModItems.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModItems.java @@ -114,6 +114,7 @@ public class ModItems { public static final RegistryObject SCHEELITE = ITEMS.register("scheelite", () -> new Item(new Item.Properties())); public static final RegistryObject DOG_TAG = ITEMS.register("dog_tag", DogTag::new); public static final RegistryObject SHIELD_CELL = ITEMS.register("shield_cell", () -> new Item(new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject HAND_GRENADE = ITEMS.register("hand_grenade", HandGrenade::new); public static final RegistryObject IRON_BARREL = ITEMS.register("iron_barrel", () -> new Item(new Item.Properties())); public static final RegistryObject IRON_ACTION = ITEMS.register("iron_action", () -> new Item(new Item.Properties())); diff --git a/src/main/java/net/mcreator/superbwarfare/init/ModModels.java b/src/main/java/net/mcreator/superbwarfare/init/ModModels.java index 4b86bd46d..eba739db0 100644 --- a/src/main/java/net/mcreator/superbwarfare/init/ModModels.java +++ b/src/main/java/net/mcreator/superbwarfare/init/ModModels.java @@ -17,5 +17,6 @@ public class ModModels { event.registerLayerDefinition(ModelGrenade.LAYER_LOCATION, ModelGrenade::createBodyLayer); event.registerLayerDefinition(ModelBocekArrow.LAYER_LOCATION, ModelBocekArrow::createBodyLayer); event.registerLayerDefinition(ModelClaymore.LAYER_LOCATION, ModelClaymore::createBodyLayer); + event.registerLayerDefinition(ModelHandGrenade.LAYER_LOCATION, ModelHandGrenade::createBodyLayer); } } diff --git a/src/main/java/net/mcreator/superbwarfare/item/HandGrenade.java b/src/main/java/net/mcreator/superbwarfare/item/HandGrenade.java new file mode 100644 index 000000000..7b5f00eae --- /dev/null +++ b/src/main/java/net/mcreator/superbwarfare/item/HandGrenade.java @@ -0,0 +1,62 @@ +package net.mcreator.superbwarfare.item; + +import net.mcreator.superbwarfare.entity.HandGrenadeEntity; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +public class HandGrenade extends Item { + public HandGrenade() { + super(new Properties().rarity(Rarity.UNCOMMON)); + } + + @Override + public @NotNull InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + ItemStack stack = playerIn.getItemInHand(handIn); + playerIn.startUsingItem(handIn); + return InteractionResultHolder.consume(stack); + } + + @Override + public @NotNull UseAnim getUseAnimation(@NotNull ItemStack stack) { + return UseAnim.SPEAR; + } + + @Override + public void releaseUsing(ItemStack stack, Level worldIn, LivingEntity entityLiving, int timeLeft) { + if (!worldIn.isClientSide) { + if (entityLiving instanceof Player player) { + + + int usingTime = this.getUseDuration(stack) - timeLeft; + + float power = Math.min(usingTime / 10.0f, 1.5f); + + HandGrenadeEntity handGrenade = new HandGrenadeEntity(player, worldIn, 100 - usingTime); + handGrenade.shootFromRotation(player, player.getXRot(), player.getYRot(), 0.0f, power, 0.0f); + worldIn.addFreshEntity(handGrenade); + + if (!player.isCreative()) { + stack.shrink(1); + } + + player.getCooldowns().addCooldown(stack.getItem(), 25); + } + } + } + + + + @Override + public int getUseDuration(ItemStack stack) { + return 100; + } +} +