/* * Ex Deorum * Copyright (c) 2024 thedarkcolour * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package thedarkcolour.exdeorum.item; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.Cow; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.state.BlockState; import thedarkcolour.exdeorum.registry.EItems; import java.util.function.Supplier; public class GrassSpreaderItem extends Item { private final Supplier grassState; public GrassSpreaderItem(Properties properties, Supplier grassState) { super(properties); this.grassState = grassState; } @Override public InteractionResult useOn(UseOnContext ctx) { var level = ctx.getLevel(); var pos = ctx.getClickedPos(); var player = ctx.getPlayer(); var state = level.getBlockState(pos); var grass = this.grassState.get(); if (canSpread(state) && grass != state) { if (!level.isClientSide) { level.setBlock(pos, grass, 3); level.playSound(null, pos, SoundEvents.ROOTED_DIRT_PLACE, SoundSource.BLOCKS); if (player == null || !player.getAbilities().instabuild) { ctx.getItemInHand().shrink(1); } return InteractionResult.CONSUME; } else { level.addDestroyBlockEffect(pos, grass); } return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity target, InteractionHand pUsedHand) { if (stack.getItem() == EItems.MYCELIUM_SPORES.get() && target instanceof Cow cow) { var mushroomCow = EntityType.MOOSHROOM.create(cow.level()); if (mushroomCow != null) { if (!player.getAbilities().instabuild) { stack.shrink(1); } cow.discard(); mushroomCow.moveTo(cow.getX(), cow.getY(), cow.getZ()); mushroomCow.setHealth(cow.getHealth()); mushroomCow.yBodyRot = cow.yBodyRot; if (cow.hasCustomName()) { mushroomCow.setCustomName(cow.getCustomName()); mushroomCow.setCustomNameVisible(cow.isCustomNameVisible()); } if (cow.isPersistenceRequired()) { mushroomCow.setPersistenceRequired(); } mushroomCow.setInvulnerable(cow.isInvulnerable()); cow.level().addFreshEntity(mushroomCow); if (!cow.level().isClientSide) ((ServerLevel)cow.level()).sendParticles(ParticleTypes.EXPLOSION, cow.getX(), cow.getY(0.5D), cow.getZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D); cow.playSound(SoundEvents.MOOSHROOM_CONVERT, 2.0F, 1.0F); } } return InteractionResult.PASS; } public boolean canSpread(BlockState state) { return state.is(BlockTags.DIRT); } }