package com.thebrokenrail.slightlyvanilla; import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity; import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; import me.sargunvohra.mcmods.autoconfig1u.serializer.GsonConfigSerializer; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.entity.FabricEntityTypeBuilder; import net.minecraft.block.DispenserBlock; import net.minecraft.block.dispenser.ItemDispenserBehavior; import net.minecraft.block.dispenser.ProjectileDispenserBehavior; import net.minecraft.entity.EntityCategory; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnType; import net.minecraft.entity.projectile.Projectile; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.SpawnEggItem; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPointer; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Position; import net.minecraft.util.registry.Registry; import net.minecraft.world.World; import java.util.Random; public class SlightlyVanilla implements ModInitializer { public static final String NAMESPACE = "slightlyvanilla"; public static EntityType SLIMEBALL_ENTITY; public static EntityType SPAWN_EGG_ENTITY; public static ModConfig getConfig() { return AutoConfig.getConfigHolder(ModConfig.class).getConfig(); } @Override public void onInitialize() { AutoConfig.register(ModConfig.class, GsonConfigSerializer::new); SLIMEBALL_ENTITY = FabricEntityTypeBuilder.create(EntityCategory.MISC, (EntityType.EntityFactory) SlimeballEntity::new).size(EntityDimensions.fixed(0.25f, 0.25f)).build(); SPAWN_EGG_ENTITY = FabricEntityTypeBuilder.create(EntityCategory.MISC, (EntityType.EntityFactory) SpawnEggEntity::new).size(EntityDimensions.fixed(0.25f, 0.25f)).build(); Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "slimeball"), SLIMEBALL_ENTITY); Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "spawn_egg"), SPAWN_EGG_ENTITY); DispenserBlock.registerBehavior(Items.SLIME_BALL, (pointer, stack) -> { if (getConfig().throwableSlimeballs.dispenser) { return new ProjectileDispenserBehavior() { @Override protected Projectile createProjectile(World position, Position stack, ItemStack itemStack) { SlimeballEntity entity = new SlimeballEntity(position, stack.getX(), stack.getY(), stack.getZ()); entity.setItem(itemStack); return entity; } }.dispense(pointer, stack); } else { return new ItemDispenserBehavior().dispense(pointer, stack); } }); for (SpawnEggItem spawnEgg : SpawnEggItem.getAll()) { DispenserBlock.registerBehavior(spawnEgg, (pointer, stack) -> { if (getConfig().throwableSpawnEggs.dispenser) { return new ProjectileDispenserBehavior() { @Override protected Projectile createProjectile(World position, Position stack, ItemStack itemStack) { SpawnEggEntity entity = new SpawnEggEntity(position, stack.getX(), stack.getY(), stack.getZ()); entity.setItem(itemStack); return entity; } }.dispense(pointer, stack); } else { return new ItemDispenserBehavior() { @Override protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); EntityType entityType = ((SpawnEggItem)stack.getItem()).getEntityType(stack.getTag()); entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnType.DISPENSER, direction != Direction.UP, false); stack.decrement(1); return stack; } }.dispense(pointer, stack); } }); } } public static void playThrowSound(PlayerEntity user) { user.getEntityWorld().playSound(null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (new Random().nextFloat() * 0.4F + 0.8F)); } }