Improve Dispenser Behavior
All checks were successful
SlightlyVanilla/pipeline/head This commit looks good
All checks were successful
SlightlyVanilla/pipeline/head This commit looks good
This commit is contained in:
parent
c82406bb47
commit
cabf4162ca
@ -1,5 +1,7 @@
|
||||
package com.thebrokenrail.slightlyvanilla;
|
||||
|
||||
import com.thebrokenrail.slightlyvanilla.dispenser.SlimeballDispenserBehavior;
|
||||
import com.thebrokenrail.slightlyvanilla.dispenser.SpawnEggDispenserBehavior;
|
||||
import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity;
|
||||
import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity;
|
||||
import me.sargunvohra.mcmods.autoconfig1u.AutoConfig;
|
||||
@ -9,26 +11,17 @@ 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.player.PlayerEntity;
|
||||
import net.minecraft.entity.projectile.ProjectileEntity;
|
||||
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.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;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
@ -54,45 +47,10 @@ public class SlightlyVanilla implements ModInitializer {
|
||||
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);
|
||||
}
|
||||
});
|
||||
DispenserBlock.registerBehavior(Items.SLIME_BALL, new SlimeballDispenserBehavior());
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
DispenserBlock.registerBehavior(spawnEgg, new SpawnEggDispenserBehavior());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,35 @@
|
||||
package com.thebrokenrail.slightlyvanilla.dispenser;
|
||||
|
||||
import com.thebrokenrail.slightlyvanilla.SlightlyVanilla;
|
||||
import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity;
|
||||
import net.minecraft.block.dispenser.DispenserBehavior;
|
||||
import net.minecraft.block.dispenser.ItemDispenserBehavior;
|
||||
import net.minecraft.block.dispenser.ProjectileDispenserBehavior;
|
||||
import net.minecraft.entity.projectile.ProjectileEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.math.BlockPointer;
|
||||
import net.minecraft.util.math.Position;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class SlimeballDispenserBehavior implements DispenserBehavior {
|
||||
private static class Default extends ItemDispenserBehavior {
|
||||
}
|
||||
|
||||
private static class Modified extends 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;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack dispense(BlockPointer pointer, ItemStack stack) {
|
||||
if (SlightlyVanilla.getConfig().throwableSlimeballs.dispenser) {
|
||||
return new Modified().dispense(pointer, stack);
|
||||
} else {
|
||||
return new Default().dispense(pointer, stack);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.thebrokenrail.slightlyvanilla.dispenser;
|
||||
|
||||
import com.thebrokenrail.slightlyvanilla.SlightlyVanilla;
|
||||
import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity;
|
||||
import net.minecraft.block.DispenserBlock;
|
||||
import net.minecraft.block.dispenser.DispenserBehavior;
|
||||
import net.minecraft.block.dispenser.ItemDispenserBehavior;
|
||||
import net.minecraft.block.dispenser.ProjectileDispenserBehavior;
|
||||
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.SpawnEggItem;
|
||||
import net.minecraft.util.math.BlockPointer;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Position;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class SpawnEggDispenserBehavior implements DispenserBehavior {
|
||||
private static class Default extends 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;
|
||||
}
|
||||
}
|
||||
|
||||
private static class Modified extends 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;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack dispense(BlockPointer pointer, ItemStack stack) {
|
||||
if (SlightlyVanilla.getConfig().throwableSpawnEggs.dispenser) {
|
||||
return new Modified().dispense(pointer, stack);
|
||||
} else {
|
||||
return new Default().dispense(pointer, stack);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user