diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java new file mode 100644 index 000000000..eb22aee04 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -0,0 +1,110 @@ +package com.simibubi.create; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.simibubi.create.foundation.utility.data.ICanGenerateJson; +import net.minecraft.data.DirectoryCache; +import net.minecraft.data.IDataProvider; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.SoundEvents; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.registries.IForgeRegistry; + +import java.io.IOException; +import java.nio.file.Path; + + +public enum AllSoundEvents implements ICanGenerateJson { + + CUCKOO_PIG("creeperclock"), + CUCKOO_CREEPER("pigclock"), + + SCHEMATICANNON_LAUNCH_BLOCK(SoundEvents.ENTITY_GENERIC_EXPLODE), + SCHEMATICANNON_FINISH(SoundEvents.BLOCK_NOTE_BLOCK_BELL), + SLIME_ADDED(SoundEvents.BLOCK_SLIME_BLOCK_PLACE), + MECHANICAL_PRESS_ACTIVATION(SoundEvents.BLOCK_ANVIL_LAND), + MECHANICAL_PRESS_ITEM_BREAK(SoundEvents.ENTITY_ITEM_BREAK), + BLOCKZAPPER_PLACE(SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM), + BLOCKZAPPER_CONFIRM(SoundEvents.BLOCK_NOTE_BLOCK_BELL), + BLOCKZAPPER_DENY(SoundEvents.BLOCK_NOTE_BLOCK_BASS), + BLOCK_FUNNEL_EAT(SoundEvents.ENTITY_GENERIC_EAT), + + + ; + + String id; + SoundEvent event, child; + + //For adding our own sounds at assets/create/sounds/name.ogg + AllSoundEvents(){ + id = name().toLowerCase(); + } + + AllSoundEvents(String name){ + id = name; + } + + //For wrapping a existing sound with new subtitle + AllSoundEvents(SoundEvent child){ + id = name().toLowerCase(); + this.child = child; + } + + //subtitles are taken from the lang file (create.subtitle.sound_event_name) + + public SoundEvent get(){ + return event; + } + + private String getName(){ + return id; + } + + public static void register(RegistryEvent.Register event) { + IForgeRegistry registry = event.getRegistry(); + + for (AllSoundEvents entry : + values()) { + + ResourceLocation rec = new ResourceLocation(Create.ID, entry.getName()); + SoundEvent sound = new SoundEvent(rec).setRegistryName(rec); + registry.register(sound); + entry.event = sound; + } + } + + public void generate(Path path, DirectoryCache cache){ + Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create(); + path = path.resolve("assets/create"); + + try { + JsonObject json = new JsonObject(); + for (AllSoundEvents soundEvent : + values()) { + JsonObject entry = new JsonObject(); + JsonArray arr = new JsonArray(); + if (soundEvent.child != null){ + //wrapper + JsonObject s = new JsonObject(); + s.addProperty("name", soundEvent.child.getName().toString()); + s.addProperty("type", "event"); + arr.add(s); + } else{ + //own sound + arr.add(Create.ID + ":" + soundEvent.getName()); + } + entry.add("sounds", arr); + entry.addProperty("subtitle", Create.ID + ".subtitle." + soundEvent.getName()); + json.add(soundEvent.getName(), entry); + } + IDataProvider.save(GSON, cache, json, path.resolve("sounds.json")); + + } catch (IOException e) { + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index a5a1bd046..1a2b2a2d2 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -1,6 +1,7 @@ package com.simibubi.create; import com.simibubi.create.foundation.advancement.AllCriterionTriggers; +import net.minecraft.util.SoundEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -55,6 +56,7 @@ public class Create { modEventBus.addGenericListener(ContainerType.class, AllContainers::register); modEventBus.addGenericListener(EntityType.class, AllEntities::register); modEventBus.addGenericListener(ParticleType.class, AllParticles::register); + modEventBus.addGenericListener(SoundEvent.class, AllSoundEvents::register); AllConfigs.registerAll(); modEventBus.addListener(AllConfigs::onLoad); diff --git a/src/main/java/com/simibubi/create/foundation/utility/data/Generator.java b/src/main/java/com/simibubi/create/foundation/utility/data/Generator.java new file mode 100644 index 000000000..401efaa82 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/data/Generator.java @@ -0,0 +1,35 @@ +package com.simibubi.create.foundation.utility.data; + +import com.simibubi.create.AllSoundEvents; +import net.minecraft.data.DirectoryCache; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class Generator { + + /* + * this can probably be called by some gradle task or so but im not know how, so for now i just added a main below and execute from there when we need to generate jsons + **/ + public static void generateJsonFiles(){ + Path base = Paths.get("src/main/resources"); + DirectoryCache cache; + try { + + cache = new DirectoryCache(base, "cache"); + + for (ICanGenerateJson gen: + new ICanGenerateJson[]{AllSoundEvents.CUCKOO_CREEPER}) { + gen.generate(base, cache); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + generateJsonFiles(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/data/ICanGenerateJson.java b/src/main/java/com/simibubi/create/foundation/utility/data/ICanGenerateJson.java new file mode 100644 index 000000000..730ed0865 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/data/ICanGenerateJson.java @@ -0,0 +1,11 @@ +package com.simibubi.create.foundation.utility.data; + +import net.minecraft.data.DirectoryCache; + +import java.nio.file.Path; + +public interface ICanGenerateJson { + + //path points to the resource1s base folder + void generate(Path path, DirectoryCache cache); +} diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/chassis/AbstractChassisBlock.java index 88b8058b4..dd5aa1c3d 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/chassis/AbstractChassisBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.chassis import java.util.List; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.foundation.block.IHaveScrollableValue; import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.utility.Lang; @@ -18,7 +19,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; @@ -69,7 +69,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock return true; } - worldIn.playSound(null, pos, SoundEvents.BLOCK_SLIME_BLOCK_PLACE, SoundCategory.BLOCKS, .5f, 1); + worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); if (isSlimeBall && !player.isCreative()) heldItem.shrink(1); if (!isSlimeBall && !player.isCreative()) diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java index 34ab16bd0..075b5a9c7 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/contraptions/piston/MechanicalPistonBlock.java @@ -1,6 +1,7 @@ package com.simibubi.create.modules.contraptions.components.contraptions.piston; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.config.AllConfigs; import com.simibubi.create.foundation.utility.AllShapes; import com.simibubi.create.foundation.utility.Lang; @@ -21,7 +22,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.Hand; import net.minecraft.util.IStringSerializable; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; @@ -68,7 +68,7 @@ public class MechanicalPistonBlock extends DirectionalAxisKineticBlock { worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); return true; } - worldIn.playSound(null, pos, SoundEvents.BLOCK_SLIME_BLOCK_PLACE, SoundCategory.BLOCKS, .5f, 1); + worldIn.playSound(null, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, .5f, 1); if (!player.isCreative()) player.getHeldItem(handIn).shrink(1); worldIn.setBlockState(pos, AllBlocks.STICKY_MECHANICAL_PISTON.get().getDefaultState().with(FACING, direction) diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/motor/MotorBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/components/motor/MotorBlock.java index 97b6e2e1c..8af12a905 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/motor/MotorBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/motor/MotorBlock.java @@ -78,6 +78,12 @@ public class MotorBlock extends HorizontalKineticBlock boolean forward = delta > 0; int step = forward ? 1 : -1; int currentSpeed = te.newGeneratedSpeed; + + if (world.getClosestPlayer(pos.getX(), pos.getY(), pos.getZ()).isSneaking()){ + te.setSpeedValueLazily(currentSpeed + step); + return; + } + int magnitude = Math.abs(currentSpeed) - (forward == currentSpeed > 0 ? 0 : 1); if (magnitude >= 4) diff --git a/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressTileEntity.java index 0e4242788..d0ef8f9b3 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/components/press/MechanicalPressTileEntity.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; import com.simibubi.create.AllRecipes; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -25,7 +26,6 @@ import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.NonNullList; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -190,8 +190,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { } if (!world.isRemote) { - world.playSound(null, getPos(), SoundEvents.ENTITY_ITEM_BREAK, SoundCategory.BLOCKS, .5f, 1f); - world.playSound(null, getPos(), SoundEvents.BLOCK_ANVIL_LAND, SoundCategory.BLOCKS, .125f, 1f); + world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ITEM_BREAK.get(), SoundCategory.BLOCKS, .5f, 1f); + world.playSound(null, getPos(), AllSoundEvents.MECHANICAL_PRESS_ACTIVATION.get(), SoundCategory.BLOCKS, .125f, 1f); } } diff --git a/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java b/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java index 9fc69581c..e589d6238 100644 --- a/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java +++ b/src/main/java/com/simibubi/create/modules/contraptions/redstone/AnalogLeverBlock.java @@ -57,7 +57,7 @@ public class AnalogLeverBlock extends HorizontalFaceBlock implements IWithTileEn te.changeState(sneak); float f = .25f + ((te.state + 5) / 15f) * .5f; - worldIn.playSound((PlayerEntity) null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); + worldIn.playSound(null, pos, SoundEvents.BLOCK_LEVER_CLICK, SoundCategory.BLOCKS, 0.2F, f); return true; } diff --git a/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperHandler.java b/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperHandler.java index 1c54a4e42..8b314931b 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperHandler.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperHandler.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import java.util.function.Supplier; +import com.simibubi.create.AllSoundEvents; import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.platform.GlStateManager; @@ -26,8 +27,6 @@ import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Hand; import net.minecraft.util.HandSide; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -149,8 +148,7 @@ public class BlockzapperHandler { public static void playSound(Hand hand, BlockPos position) { float pitch = hand == Hand.MAIN_HAND ? 2f : 0.9f; - SoundEvent sound = SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM; - Minecraft.getInstance().world.playSound(position, sound, SoundCategory.BLOCKS, 0.8f, pitch, false); + Minecraft.getInstance().world.playSound(position, AllSoundEvents.BLOCKZAPPER_PLACE.get(), SoundCategory.BLOCKS, 0.8f, pitch, false); } public static void addBeam(LaserBeam beam) { diff --git a/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperItem.java index 7223bc822..187953b75 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperItem.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/blockzapper/BlockzapperItem.java @@ -10,6 +10,7 @@ import java.util.function.Predicate; import com.google.common.base.Predicates; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; import com.simibubi.create.foundation.gui.ScreenOpener; @@ -50,7 +51,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.HandSide; import net.minecraft.util.NonNullList; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceContext; @@ -196,7 +196,7 @@ public class BlockzapperItem extends Item implements IHaveCustomItemModel { if (nbt.contains("BlockUsed")) stateToUse = NBTUtil.readBlockState(nbt.getCompound("BlockUsed")); else { - world.playSound(player, player.getPosition(), SoundEvents.BLOCK_NOTE_BLOCK_BASS, SoundCategory.BLOCKS, 1f, + world.playSound(player, player.getPosition(), AllSoundEvents.BLOCKZAPPER_DENY.get(), SoundCategory.BLOCKS, 1f, 0.5f); player.sendStatusMessage( new StringTextComponent(TextFormatting.RED + Lang.translate("blockzapper.leftClickToSet")), true); @@ -333,7 +333,7 @@ public class BlockzapperItem extends Item implements IHaveCustomItemModel { return true; stack.getTag().put("BlockUsed", NBTUtil.writeBlockState(newState)); - entity.world.playSound((PlayerEntity) entity, entity.getPosition(), SoundEvents.BLOCK_NOTE_BLOCK_BELL, + entity.world.playSound((PlayerEntity) entity, entity.getPosition(), AllSoundEvents.BLOCKZAPPER_CONFIRM.get(), SoundCategory.BLOCKS, 0.5f, 0.8f); return true; diff --git a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java b/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java index 04d9fb949..640e54271 100644 --- a/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/logistics/block/belts/FunnelTileEntity.java @@ -3,6 +3,7 @@ package com.simibubi.create.modules.logistics.block.belts; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.behaviour.base.SmartTileEntity; import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour; @@ -24,7 +25,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; @@ -96,7 +96,7 @@ public class FunnelTileEntity extends SmartTileEntity { if (remainder.isEmpty()) { if (!world.isRemote) - world.playSound(null, pos, SoundEvents.ENTITY_GENERIC_EAT, SoundCategory.BLOCKS, .125f, 1f); + world.playSound(null, pos, AllSoundEvents.BLOCK_FUNNEL_EAT.get(), SoundCategory.BLOCKS, .125f, 1f); justEaten = stack.copy(); } diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java index 1a47bd94c..ad3fbc63d 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java @@ -6,6 +6,7 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTileEntities; import com.simibubi.create.config.AllConfigs; import com.simibubi.create.config.CSchematics; @@ -39,7 +40,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.SoundCategory; -import net.minecraft.util.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; @@ -556,7 +556,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC statusMsg = "finished"; resetPrinter(); target = getPos().add(1, 0, 0); - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_NOTE_BLOCK_BELL, + world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), AllSoundEvents.SCHEMATICANNON_FINISH.get(), SoundCategory.BLOCKS, 1, .7f); sendUpdate = true; return; @@ -702,7 +702,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (state.getBlock() != Blocks.AIR) blocksPlaced++; flyingBlocks.add(new LaunchedBlock(this, target, state)); - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ENTITY_GENERIC_EXPLODE, + world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), AllSoundEvents.SCHEMATICANNON_LAUNCH_BLOCK.get(), SoundCategory.BLOCKS, .1f, 1.1f); } diff --git a/src/main/resources/assets/create/lang/en_us.json b/src/main/resources/assets/create/lang/en_us.json index 746143f91..1f2ec52fe 100644 --- a/src/main/resources/assets/create/lang/en_us.json +++ b/src/main/resources/assets/create/lang/en_us.json @@ -608,6 +608,16 @@ "advancement.create:speed_secret": "Hella fast", "advancement.create:speed_secret.desc": "Watch a Speedometer reach exactly 666 speed", + "create.subtitle.schematicannon_launch_block": "Schematicannon shoots", + "create.subtitle.schematicannon_finish": "Schematicannon finishes", + "create.subtitle.slime_added": "Slime squishes", + "create.subtitle.mechanical_press_activation": "Mechanical Press activates", + "create.subtitle.mechanical_press_item_break": "Metal clanks", + "create.subtitle.blockzapper_place": "Blocks zap into place", + "create.subtitle.blockzapper_confirm": "Affirmative Ding", + "create.subtitle.blockzapper_deny": "Declining Boop", + "create.subtitle.block_funnel_eat": "Funnel eats", + "_comment": "-------------------------] ITEM DESCRIPTIONS [------------------------------------------------", "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", diff --git a/src/main/resources/assets/create/sounds.json b/src/main/resources/assets/create/sounds.json new file mode 100644 index 000000000..11453a388 --- /dev/null +++ b/src/main/resources/assets/create/sounds.json @@ -0,0 +1,95 @@ +{ + "creeperclock": { + "sounds": [ + "create:creeperclock" + ], + "subtitle": "create.subtitle.creeperclock" + }, + "pigclock": { + "sounds": [ + "create:pigclock" + ], + "subtitle": "create.subtitle.pigclock" + }, + "schematicannon_launch_block": { + "sounds": [ + { + "name": "minecraft:entity.generic.explode", + "type": "event" + } + ], + "subtitle": "create.subtitle.schematicannon_launch_block" + }, + "schematicannon_finish": { + "sounds": [ + { + "name": "minecraft:block.note_block.bell", + "type": "event" + } + ], + "subtitle": "create.subtitle.schematicannon_finish" + }, + "slime_added": { + "sounds": [ + { + "name": "minecraft:block.slime_block.place", + "type": "event" + } + ], + "subtitle": "create.subtitle.slime_added" + }, + "mechanical_press_activation": { + "sounds": [ + { + "name": "minecraft:block.anvil.land", + "type": "event" + } + ], + "subtitle": "create.subtitle.mechanical_press_activation" + }, + "mechanical_press_item_break": { + "sounds": [ + { + "name": "minecraft:entity.item.break", + "type": "event" + } + ], + "subtitle": "create.subtitle.mechanical_press_item_break" + }, + "blockzapper_place": { + "sounds": [ + { + "name": "minecraft:block.note_block.basedrum", + "type": "event" + } + ], + "subtitle": "create.subtitle.blockzapper_place" + }, + "blockzapper_confirm": { + "sounds": [ + { + "name": "minecraft:block.note_block.bell", + "type": "event" + } + ], + "subtitle": "create.subtitle.blockzapper_confirm" + }, + "blockzapper_deny": { + "sounds": [ + { + "name": "minecraft:block.note_block.bass", + "type": "event" + } + ], + "subtitle": "create.subtitle.blockzapper_deny" + }, + "block_funnel_eat": { + "sounds": [ + { + "name": "minecraft:entity.generic.eat", + "type": "event" + } + ], + "subtitle": "create.subtitle.block_funnel_eat" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/sounds/creeperclock.ogg b/src/main/resources/assets/create/sounds/creeperclock.ogg new file mode 100644 index 000000000..fbcb1cf3f Binary files /dev/null and b/src/main/resources/assets/create/sounds/creeperclock.ogg differ diff --git a/src/main/resources/assets/create/sounds/pigclock.ogg b/src/main/resources/assets/create/sounds/pigclock.ogg new file mode 100644 index 000000000..daa7c7f64 Binary files /dev/null and b/src/main/resources/assets/create/sounds/pigclock.ogg differ