94 lines
4.7 KiB
Java
94 lines
4.7 KiB
Java
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.fabricmc.fabric.api.tag.TagRegistry;
|
|
import net.minecraft.block.Block;
|
|
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.ProjectileEntity;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.item.Items;
|
|
import net.minecraft.item.SpawnEggItem;
|
|
import net.minecraft.tag.Tag;
|
|
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;
|
|
|
|
public class SlightlyVanilla implements ModInitializer {
|
|
public static final String NAMESPACE = "slightlyvanilla";
|
|
|
|
public static EntityType<SlimeballEntity> SLIMEBALL_ENTITY;
|
|
public static EntityType<SpawnEggEntity> SPAWN_EGG_ENTITY;
|
|
|
|
public static final Tag<Block> EXTRA_PORTAL_BLOCKS_TAG = TagRegistry.block(new Identifier(NAMESPACE, "extra_portal_blocks"));
|
|
|
|
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>) SlimeballEntity::new).size(EntityDimensions.fixed(0.25f, 0.25f)).build();
|
|
SPAWN_EGG_ENTITY = FabricEntityTypeBuilder.create(EntityCategory.MISC, (EntityType.EntityFactory<SpawnEggEntity>) 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 ProjectileEntity 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 ProjectileEntity 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);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|