From 50ba34e779c4190952e49a913a047ee1f8c47c7e Mon Sep 17 00:00:00 2001 From: Zelophed Date: Sat, 15 Feb 2020 01:57:16 +0100 Subject: [PATCH] added foundation for SoundEvents added a few soundevents for custom subtitles sounds.json can be generated by launching the main in foundation/utility/data/Generator.java (this should be done before starting the client when new sound events were added) --- .../com/simibubi/create/AllSoundEvents.java | 110 ++++++++++++++++++ src/main/java/com/simibubi/create/Create.java | 2 + .../foundation/utility/data/Generator.java | 35 ++++++ .../utility/data/ICanGenerateJson.java | 11 ++ .../chassis/AbstractChassisBlock.java | 4 +- .../piston/MechanicalPistonBlock.java | 4 +- .../components/motor/MotorBlock.java | 6 + .../press/MechanicalPressTileEntity.java | 6 +- .../redstone/AnalogLeverBlock.java | 2 +- .../blockzapper/BlockzapperHandler.java | 6 +- .../blockzapper/BlockzapperItem.java | 6 +- .../block/belts/FunnelTileEntity.java | 4 +- .../block/SchematicannonTileEntity.java | 6 +- .../resources/assets/create/lang/en_us.json | 10 ++ src/main/resources/assets/create/sounds.json | 95 +++++++++++++++ .../assets/create/sounds/creeperclock.ogg | Bin 0 -> 17248 bytes .../assets/create/sounds/pigclock.ogg | Bin 0 -> 17404 bytes 17 files changed, 287 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/simibubi/create/AllSoundEvents.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/data/Generator.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/data/ICanGenerateJson.java create mode 100644 src/main/resources/assets/create/sounds.json create mode 100644 src/main/resources/assets/create/sounds/creeperclock.ogg create mode 100644 src/main/resources/assets/create/sounds/pigclock.ogg 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 0000000000000000000000000000000000000000..fbcb1cf3fe349cfac997be78f4a7f3c7dfc2768a GIT binary patch literal 17248 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..daa7c7f64beb1de2d31bacfbc569d31d832a53c3 GIT binary patch literal 17404 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 i5x{O6C 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 literal 0 HcmV?d00001