diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java index 01f3ab547..acc7ee28e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -2,7 +2,6 @@ package net.momirealms.craftengine.bukkit.block; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import net.momirealms.craftengine.bukkit.block.behavior.UnsafeCompositeBlockBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; @@ -25,6 +24,7 @@ import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.sound.SoundData; +import net.momirealms.craftengine.core.sound.SoundSet; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.chunk.PalettedContainer; import org.bukkit.Bukkit; @@ -33,7 +33,6 @@ import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Field; import java.util.*; public final class BukkitBlockManager extends AbstractBlockManager { @@ -61,6 +60,7 @@ public final class BukkitBlockManager extends AbstractBlockManager { private Set missingBreakSounds = Set.of(); private Set missingHitSounds = Set.of(); private Set missingStepSounds = Set.of(); + private Set missingInteractSoundBlocks = Set.of(); public BukkitBlockManager(BukkitCraftEngine plugin) { super(plugin, RegistryUtils.currentBlockRegistrySize(), Config.serverSideBlocks()); @@ -433,6 +433,10 @@ public final class BukkitBlockManager extends AbstractBlockManager { return this.missingStepSounds.contains(sound); } + public boolean isInteractSoundMissing(Key blockType) { + return this.missingInteractSoundBlocks.contains(blockType); + } + private void unfreezeRegistry() { try { CoreReflections.field$MappedRegistry$frozen.set(MBuiltInRegistries.BLOCK, false); @@ -485,7 +489,7 @@ public final class BukkitBlockManager extends AbstractBlockManager { @Override protected void processSounds() { Set affectedBlockSoundTypes = new HashSet<>(); - for (BlockStateWrapper vanillaBlockState : super.tempVisualBlocksInUse) { + for (BlockStateWrapper vanillaBlockState : super.tempVisualBlockStatesInUse) { affectedBlockSoundTypes.add(FastNMS.INSTANCE.method$BlockBehaviour$BlockStateBase$getSoundType(vanillaBlockState.literalObject())); } @@ -523,6 +527,23 @@ public final class BukkitBlockManager extends AbstractBlockManager { this.missingBreakSounds = breakSounds; this.missingHitSounds = hitSounds; this.missingStepSounds = stepSounds; + + Set missingInteractSoundBlocks = new HashSet<>(); + + for (SoundSet soundSet : SoundSet.getAllSoundSets()) { + for (Key block : soundSet.blocks()) { + if (super.tempVisualBlocksInUse.contains(block)) { + Key openSound = soundSet.openSound(); + soundReplacementBuilder.put(openSound, Key.of(openSound.namespace(), "replaced." + openSound.value())); + Key closeSound = soundSet.closeSound(); + soundReplacementBuilder.put(closeSound, Key.of(closeSound.namespace(), "replaced." + closeSound.value())); + missingInteractSoundBlocks.addAll(soundSet.blocks()); + break; + } + } + } + + this.missingInteractSoundBlocks = missingInteractSoundBlocks; this.soundReplacements = soundReplacementBuilder.buildKeepingLast(); } @@ -533,12 +554,4 @@ public final class BukkitBlockManager extends AbstractBlockManager { @Nullable LootTable lootTable) { return new BukkitCustomBlock(holder, variantProvider, events, lootTable); } - - public boolean isOpenableBlockSoundRemoved(Object blockOwner) { - return false; - } - - public SoundData getRemovedOpenableBlockSound(Object blockOwner, boolean b) { - return null; - } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java index afa85f737..956830c86 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java @@ -134,26 +134,26 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { } private void checkPressed(Object thisBlock, Object state, Object level, Object pos) { - Object abstractArrow = this.canButtonBeActivatedByArrows ? FastNMS.INSTANCE.method$EntityGetter$getEntitiesOfClass( + Object arrow = this.canButtonBeActivatedByArrows ? FastNMS.INSTANCE.method$EntityGetter$getEntitiesOfClass( level, CoreReflections.clazz$AbstractArrow, FastNMS.INSTANCE.method$AABB$move( FastNMS.INSTANCE.method$VoxelShape$bounds(FastNMS.INSTANCE.method$BlockState$getShape( state, level, pos, CoreReflections.instance$CollisionContext$empty )), pos), MEntitySelectors.NO_SPECTATORS).stream().findFirst().orElse(null) : null; - boolean flag = abstractArrow != null; + boolean on = arrow != null; ImmutableBlockState blockState = BlockStateUtils.getOptionalCustomBlockState(state).orElse(null); if (blockState == null) return; boolean poweredValue = blockState.get(this.poweredProperty); - if (flag != poweredValue) { - FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.poweredProperty, flag).customBlockState().literalObject(), UpdateOption.UPDATE_ALL.flags()); + if (on != poweredValue) { + FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, blockState.with(this.poweredProperty, on).customBlockState().literalObject(), UpdateOption.UPDATE_ALL.flags()); updateNeighbours(thisBlock, blockState, level, pos); - playSound(null, level, pos, flag); + playSound(level, pos, on); Object gameEvent = VersionHelper.isOrAbove1_20_5() - ? FastNMS.INSTANCE.method$Holder$direct(flag ? MGameEvents.BLOCK_ACTIVATE : MGameEvents.BLOCK_DEACTIVATE) - : flag ? MGameEvents.BLOCK_ACTIVATE : MGameEvents.BLOCK_DEACTIVATE; - FastNMS.INSTANCE.method$LevelAccessor$gameEvent(level, abstractArrow, gameEvent, pos); + ? FastNMS.INSTANCE.method$Holder$direct(on ? MGameEvents.BLOCK_ACTIVATE : MGameEvents.BLOCK_DEACTIVATE) + : on ? MGameEvents.BLOCK_ACTIVATE : MGameEvents.BLOCK_DEACTIVATE; + FastNMS.INSTANCE.method$LevelAccessor$gameEvent(level, arrow, gameEvent, pos); } - if (flag) { + if (on) { FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, thisBlock, this.ticksToStayPressed); } } @@ -177,21 +177,21 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { FastNMS.INSTANCE.method$Level$updateNeighborsAt(level, FastNMS.INSTANCE.method$BlockPos$relative(pos, nmsDirection), thisBlock, orientation); } - private void playSound(@Nullable Object player, Object level, Object pos, boolean hitByArrow) { - SoundData soundData = getSound(hitByArrow); + private void playSound(Object level, Object pos, boolean on) { + SoundData soundData = getSound(on); if (soundData == null) return; Object sound = FastNMS.INSTANCE.constructor$SoundEvent(KeyUtils.toResourceLocation(soundData.id()), Optional.empty()); - FastNMS.INSTANCE.method$LevelAccessor$playSound(level, player, pos, sound, CoreReflections.instance$SoundSource$BLOCKS, soundData.volume().get(), soundData.pitch().get()); + FastNMS.INSTANCE.method$LevelAccessor$playSound(level, null, pos, sound, CoreReflections.instance$SoundSource$BLOCKS, soundData.volume().get(), soundData.pitch().get()); } - private SoundData getSound(boolean isOn) { - return isOn ? this.buttonClickOnSound : this.buttonClickOffSound; + private SoundData getSound(boolean on) { + return on ? this.buttonClickOnSound : this.buttonClickOffSound; } private void press(Object thisBlock, ImmutableBlockState state, Object level, Object pos, @Nullable Object player) { FastNMS.INSTANCE.method$LevelWriter$setBlock(level, pos, state.with(this.poweredProperty, true).customBlockState().literalObject(), UpdateOption.UPDATE_ALL.flags()); FastNMS.INSTANCE.method$ScheduledTickAccess$scheduleBlockTick(level, pos, thisBlock, this.ticksToStayPressed); - playSound(player, level, pos, true); + playSound(level, pos, true); Object gameEvent = VersionHelper.isOrAbove1_20_5() ? FastNMS.INSTANCE.method$Holder$direct(MGameEvents.BLOCK_ACTIVATE) : MGameEvents.BLOCK_ACTIVATE; FastNMS.INSTANCE.method$LevelAccessor$gameEvent(level, player, gameEvent, pos); } @@ -203,7 +203,7 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { public BlockBehavior create(CustomBlock block, Map arguments) { BooleanProperty powered = (BooleanProperty) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.button.missing_powered"); int ticksToStayPressed = ResourceConfigUtils.getAsInt(arguments.getOrDefault("ticks-to-stay-pressed", 30), "ticks-to-stay-pressed"); - boolean canButtonBeActivatedByArrows = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-button-be-activated-by-arrows", true), "can-button-be-activated-by-arrows"); + boolean canButtonBeActivatedByArrows = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-be-activated-by-arrows", true), "can-be-activated-by-arrows"); Map sounds = (Map) arguments.get("sounds"); SoundData buttonClickOnSound = null; SoundData buttonClickOffSound = null; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java index 7ad5a1bed..d33b45da1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.bukkit.item.behavior; -import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MFluids; @@ -9,10 +8,8 @@ import net.momirealms.craftengine.core.block.UpdateOption; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; import net.momirealms.craftengine.core.pack.Pack; -import net.momirealms.craftengine.core.pack.PendingConfigSection; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.MiscUtils; import org.bukkit.Location; import org.bukkit.block.BlockState; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index ce1500a38..2dc58f76d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -29,7 +29,7 @@ import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; -import net.momirealms.craftengine.core.sound.SoundData; +import net.momirealms.craftengine.core.sound.SoundSet; import net.momirealms.craftengine.core.sound.SoundSource; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.BlockHitResult; @@ -41,6 +41,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Openable; +import org.bukkit.block.data.Powerable; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -219,14 +220,29 @@ public class ItemEventListener implements Listener { } } else { if (Config.enableSoundSystem() && hitResult != null) { - Object blockOwner = FastNMS.INSTANCE.method$BlockState$getBlock(blockState); - if (this.plugin.blockManager().isOpenableBlockSoundRemoved(blockOwner)) { + Key blockOwner = BlockStateUtils.getBlockOwnerIdFromState(blockState); + if (this.plugin.blockManager().isInteractSoundMissing(blockOwner)) { boolean hasItem = player.getInventory().getItemInMainHand().getType() != Material.AIR || player.getInventory().getItemInOffHand().getType() != Material.AIR; boolean flag = player.isSneaking() && hasItem; if (!flag) { if (blockData instanceof Openable openable) { - SoundData soundData = this.plugin.blockManager().getRemovedOpenableBlockSound(blockOwner, !openable.isOpen()); - serverPlayer.playSound(soundData.id(), SoundSource.BLOCK, soundData.volume().get(), soundData.pitch().get()); + SoundSet soundSet = SoundSet.getByBlock(blockOwner); + if (soundSet != null) { + serverPlayer.playSound( + Vec3d.atCenterOf(hitResult.getBlockPos()), + openable.isOpen() ? soundSet.closeSound() : soundSet.openSound(), + SoundSource.BLOCK, + 1, RandomUtils.generateRandomFloat(0.9f, 1)); + } + } else if (blockData instanceof Powerable powerable && !powerable.isPowered()) { + SoundSet soundSet = SoundSet.getByBlock(blockOwner); + if (soundSet != null) { + serverPlayer.playSound( + Vec3d.atCenterOf(hitResult.getBlockPos()), + soundSet.openSound(), + SoundSource.BLOCK, + 1, RandomUtils.generateRandomFloat(0.9f, 1)); + } } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 2c4f7468f..36ed88089 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -717,9 +717,8 @@ public class BukkitServerPlayer extends Player { // send hit sound if the sound is removed if (currentTick - this.lastHitBlockTime > 3) { - Object blockOwner = FastNMS.INSTANCE.method$BlockState$getBlock(destroyedState); - Object soundType = CoreReflections.field$BlockBehaviour$soundType.get(blockOwner); - Object soundEvent = CoreReflections.field$SoundType$hitSound.get(soundType); + Object soundType = FastNMS.INSTANCE.method$BlockBehaviour$BlockStateBase$getSoundType(destroyedState); + Object soundEvent = FastNMS.INSTANCE.field$SoundType$hitSound(soundType); Object soundId = FastNMS.INSTANCE.field$SoundEvent$location(soundEvent); player.playSound(location, soundId.toString(), SoundCategory.BLOCKS, 0.5F, 0.5F); this.lastHitBlockTime = currentTick; diff --git a/common-files/src/main/resources/resources/default/configuration/blocks/palm_tree.yml b/common-files/src/main/resources/resources/default/configuration/blocks/palm_tree.yml index 65268063a..61ccd87bc 100644 --- a/common-files/src/main/resources/resources/default/configuration/blocks/palm_tree.yml +++ b/common-files/src/main/resources/resources/default/configuration/blocks/palm_tree.yml @@ -689,7 +689,7 @@ blocks#button: - type: face_attached_horizontal_directional_block - type: button_block ticks-to-stay-pressed: 30 - can-button-be-activated-by-arrows: true + can-be-activated-by-arrows: true sounds: on: minecraft:block.wooden_button.click_on off: minecraft:block.wooden_button.click_off diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java index 6687d6731..94740912f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java @@ -14,7 +14,10 @@ import net.momirealms.craftengine.core.block.parser.BlockNbtParser; import net.momirealms.craftengine.core.block.properties.Properties; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.loot.LootTable; -import net.momirealms.craftengine.core.pack.*; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.pack.PendingConfigSection; +import net.momirealms.craftengine.core.pack.ResourceLocation; import net.momirealms.craftengine.core.pack.cache.IdAllocator; import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenerator; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; @@ -79,7 +82,8 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem // 原版方块的属性缓存 protected final BlockSettings[] vanillaBlockSettings; // 临时存储哪些视觉方块被使用了 - protected final Set tempVisualBlocksInUse = new HashSet<>(); + protected final Set tempVisualBlockStatesInUse = new HashSet<>(); + protected final Set tempVisualBlocksInUse = new HashSet<>(); // 声音映射表,和使用了哪些视觉方块有关 protected Map soundReplacements = Map.of(); @@ -184,6 +188,7 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem protected void clearCache() { this.tempVanillaBlockStateModels.clear(); + this.tempVisualBlockStatesInUse.clear(); this.tempVisualBlocksInUse.clear(); } @@ -528,12 +533,14 @@ public abstract class AbstractBlockManager extends AbstractModelGenerator implem } state.setBehavior(blockBehavior); int internalId = state.customBlockState().registryId(); - int appearanceId = state.vanillaBlockState().registryId(); + BlockStateWrapper visualState = state.vanillaBlockState(); + int appearanceId = visualState.registryId(); int index = internalId - AbstractBlockManager.this.vanillaBlockStateCount; AbstractBlockManager.this.immutableBlockStates[index] = state; AbstractBlockManager.this.blockStateMappings[internalId] = appearanceId; AbstractBlockManager.this.appearanceToRealState.computeIfAbsent(appearanceId, k -> new IntArrayList()).add(internalId); - AbstractBlockManager.this.tempVisualBlocksInUse.add(state.vanillaBlockState()); + AbstractBlockManager.this.tempVisualBlockStatesInUse.add(visualState); + AbstractBlockManager.this.tempVisualBlocksInUse.add(getBlockOwnerId(visualState)); AbstractBlockManager.this.applyPlatformSettings(state); // generate mod assets if (Config.generateModAssets()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java index c6b9cd591..ce9cf8079 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java @@ -2,6 +2,8 @@ package net.momirealms.craftengine.core.block; import net.momirealms.craftengine.core.util.Key; +import java.util.List; + public final class BlockKeys { private BlockKeys() {} @@ -243,4 +245,33 @@ public final class BlockKeys { public static final Key BAMBOO_WALL_HANGING_SIGN = Key.of("minecraft:bamboo_wall_hanging_sign"); public static final Key CACTUS = Key.of("minecraft:cactus"); + + public static final List WOODEN_TRAPDOORS = List.of(OAK_TRAPDOOR, SPRUCE_TRAPDOOR, BIRCH_TRAPDOOR, + ACACIA_TRAPDOOR, PALE_OAK_TRAPDOOR, DARK_OAK_TRAPDOOR, MANGROVE_TRAPDOOR, JUNGLE_TRAPDOOR); + public static final List CHERRY_TRAPDOORS = List.of(CHERRY_TRAPDOOR); + public static final List BAMBOO_TRAPDOORS = List.of(BAMBOO_TRAPDOOR); + public static final List NETHER_TRAPDOORS = List.of(WARPED_TRAPDOOR, CRIMSON_TRAPDOOR); + public static final List COPPER_TRAPDOORS = List.of(COPPER_TRAPDOOR, EXPOSED_COPPER_TRAPDOOR, WEATHERED_COPPER_TRAPDOOR, OXIDIZED_COPPER_DOOR, + WAXED_COPPER_TRAPDOOR, WAXED_EXPOSED_COPPER_TRAPDOOR, WAXED_WEATHERED_COPPER_TRAPDOOR, WAXED_OXIDIZED_COPPER_TRAPDOOR); + + public static final List WOODEN_DOORS = List.of(OAK_DOOR, SPRUCE_DOOR, BIRCH_DOOR, + ACACIA_DOOR, PALE_OAK_DOOR, DARK_OAK_DOOR, MANGROVE_DOOR, JUNGLE_DOOR); + public static final List CHERRY_DOORS = List.of(CHERRY_DOOR); + public static final List BAMBOO_DOORS = List.of(BAMBOO_DOOR); + public static final List NETHER_DOORS = List.of(WARPED_DOOR, CRIMSON_DOOR); + public static final List COPPER_DOORS = List.of(COPPER_DOOR, EXPOSED_COPPER_DOOR, WEATHERED_COPPER_DOOR, OXIDIZED_COPPER_DOOR, + WAXED_COPPER_DOOR, WAXED_EXPOSED_COPPER_DOOR, WAXED_WEATHERED_COPPER_DOOR, WAXED_OXIDIZED_COPPER_DOOR); + + public static final List WOODEN_FENCE_GATES = List.of(OAK_FENCE_GATE, SPRUCE_FENCE_GATE, BIRCH_FENCE_GATE, + ACACIA_FENCE_GATE, PALE_OAK_FENCE_GATE, DARK_OAK_FENCE_GATE, MANGROVE_FENCE_GATE, JUNGLE_FENCE_GATE); + public static final List CHERRY_FENCE_GATES = List.of(CHERRY_FENCE_GATE); + public static final List BAMBOO_FENCE_GATES = List.of(BAMBOO_FENCE_GATE); + public static final List NETHER_FENCE_GATES = List.of(WARPED_FENCE_GATE, CRIMSON_FENCE_GATE); + + public static final List WOODEN_BUTTONS = List.of(OAK_BUTTON, SPRUCE_BUTTON, BIRCH_BUTTON, JUNGLE_BUTTON, + ACACIA_BUTTON, DARK_OAK_BUTTON, PALE_OAK_BUTTON, MANGROVE_BUTTON); + public static final List CHERRY_BUTTONS = List.of(CHERRY_BUTTON); + public static final List BAMBOO_BUTTONS = List.of(BAMBOO_BUTTON); + public static final List NETHER_BUTTONS = List.of(CRIMSON_BUTTON, WARPED_BUTTON); + public static final List STONE_BUTTONS = List.of(STONE_BUTTON, POLISHED_BLACKSTONE_BUTTON); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java index 8f71a3707..83932728d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java @@ -5,7 +5,6 @@ import net.momirealms.craftengine.core.item.context.BlockPlaceContext; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; -import net.momirealms.craftengine.core.plugin.context.function.Function; import net.momirealms.craftengine.core.util.Key; import net.momirealms.sparrow.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; @@ -13,7 +12,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; -import java.util.Map; public interface CustomBlock { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java index cf0c172e5..33a9ac8c5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -62,11 +62,6 @@ public final class ItemKeys { public static final Key BLACK_DYE = Key.of("minecraft:black_dye"); public static final Key FIREWORK_STAR = Key.of("minecraft:firework_star"); - public static final Key[] AXES = new Key[] { - WOODEN_AXE, STONE_AXE, IRON_AXE, GOLDEN_AXE, DIAMOND_AXE, NETHERITE_AXE - }; - - public static final Key[] WATER_BUCKETS = new Key[] { - WATER_BUCKET, COD_BUCKET, SALMON_BUCKET, TROPICAL_FISH_BUCKET, TADPOLE_BUCKET, PUFFERFISH_BUCKET, AXOLOTL_BUCKET - }; + public static final Key[] AXES = new Key[] {WOODEN_AXE, STONE_AXE, IRON_AXE, GOLDEN_AXE, DIAMOND_AXE, NETHERITE_AXE}; + public static final Key[] WATER_BUCKETS = new Key[] {WATER_BUCKET, COD_BUCKET, SALMON_BUCKET, TROPICAL_FISH_BUCKET, TADPOLE_BUCKET, PUFFERFISH_BUCKET, AXOLOTL_BUCKET}; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundSet.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundSet.java new file mode 100644 index 000000000..409f9cd7b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundSet.java @@ -0,0 +1,92 @@ +package net.momirealms.craftengine.core.sound; + +import net.momirealms.craftengine.core.block.BlockKeys; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public record SoundSet(List blocks, Key openSound, Key closeSound) { + // Trapdoor sound sets + public static final SoundSet WOODEN_TRAPDOOR = new SoundSet(BlockKeys.WOODEN_TRAPDOORS, Sounds.WOODEN_TRAPDOOR_OPEN, Sounds.WOODEN_TRAPDOOR_CLOSE); + public static final SoundSet NETHER_WOOD_TRAPDOOR = new SoundSet(BlockKeys.NETHER_TRAPDOORS, Sounds.NETHER_WOOD_TRAPDOOR_OPEN, Sounds.NETHER_WOOD_TRAPDOOR_CLOSE); + public static final SoundSet BAMBOO_WOOD_TRAPDOOR = new SoundSet(BlockKeys.BAMBOO_TRAPDOORS, Sounds.BAMBOO_WOOD_TRAPDOOR_OPEN, Sounds.BAMBOO_WOOD_TRAPDOOR_CLOSE); + public static final SoundSet CHERRY_WOOD_TRAPDOOR = new SoundSet(BlockKeys.CHERRY_TRAPDOORS, Sounds.CHERRY_WOOD_TRAPDOOR_OPEN, Sounds.CHERRY_WOOD_TRAPDOOR_CLOSE); + public static final SoundSet COPPER_TRAPDOOR = new SoundSet(BlockKeys.COPPER_TRAPDOORS, Sounds.COPPER_TRAPDOOR_OPEN, Sounds.COPPER_TRAPDOOR_CLOSE); + + // Door sound sets + public static final SoundSet WOODEN_DOOR = new SoundSet(BlockKeys.WOODEN_DOORS, Sounds.WOODEN_DOOR_OPEN, Sounds.WOODEN_DOOR_CLOSE); + public static final SoundSet NETHER_WOOD_DOOR = new SoundSet(BlockKeys.NETHER_DOORS, Sounds.NETHER_WOOD_DOOR_OPEN, Sounds.NETHER_WOOD_DOOR_CLOSE); + public static final SoundSet BAMBOO_WOOD_DOOR = new SoundSet(BlockKeys.BAMBOO_DOORS, Sounds.BAMBOO_WOOD_DOOR_OPEN, Sounds.BAMBOO_WOOD_DOOR_CLOSE); + public static final SoundSet CHERRY_WOOD_DOOR = new SoundSet(BlockKeys.CHERRY_DOORS, Sounds.CHERRY_WOOD_DOOR_OPEN, Sounds.CHERRY_WOOD_DOOR_CLOSE); + public static final SoundSet COPPER_DOOR = new SoundSet(BlockKeys.COPPER_DOORS, Sounds.COPPER_DOOR_OPEN, Sounds.COPPER_DOOR_CLOSE); + + // Button sound sets + public static final SoundSet WOODEN_BUTTON = new SoundSet(BlockKeys.WOODEN_BUTTONS, Sounds.WOODEN_BUTTON_CLICK_ON, Sounds.WOODEN_BUTTON_CLICK_OFF); + public static final SoundSet NETHER_WOOD_BUTTON = new SoundSet(BlockKeys.NETHER_BUTTONS, Sounds.NETHER_WOOD_BUTTON_CLICK_ON, Sounds.NETHER_WOOD_BUTTON_CLICK_OFF); + public static final SoundSet BAMBOO_WOOD_BUTTON = new SoundSet(BlockKeys.BAMBOO_BUTTONS, Sounds.BAMBOO_WOOD_BUTTON_CLICK_ON, Sounds.BAMBOO_WOOD_BUTTON_CLICK_OFF); + public static final SoundSet CHERRY_WOOD_BUTTON = new SoundSet(BlockKeys.CHERRY_BUTTONS, Sounds.CHERRY_WOOD_BUTTON_CLICK_ON, Sounds.CHERRY_WOOD_BUTTON_CLICK_OFF); + public static final SoundSet STONE_BUTTON = new SoundSet(BlockKeys.STONE_BUTTONS, Sounds.STONE_BUTTON_CLICK_ON, Sounds.STONE_BUTTON_CLICK_OFF); + + // Fence gate sound sets + public static final SoundSet WOODEN_FENCE_GATE = new SoundSet(BlockKeys.WOODEN_FENCE_GATES, Sounds.WOODEN_FENCE_GATE_OPEN, Sounds.WOODEN_FENCE_GATE_CLOSE); + public static final SoundSet NETHER_WOOD_FENCE_GATE = new SoundSet(BlockKeys.NETHER_FENCE_GATES, Sounds.NETHER_WOOD_FENCE_GATE_OPEN, Sounds.NETHER_WOOD_FENCE_GATE_CLOSE); + public static final SoundSet BAMBOO_WOOD_FENCE_GATE = new SoundSet(BlockKeys.BAMBOO_FENCE_GATES, Sounds.BAMBOO_WOOD_FENCE_GATE_OPEN, Sounds.BAMBOO_WOOD_FENCE_GATE_CLOSE); + public static final SoundSet CHERRY_WOOD_FENCE_GATE = new SoundSet(BlockKeys.CHERRY_FENCE_GATES, Sounds.CHERRY_WOOD_FENCE_GATE_OPEN, Sounds.CHERRY_WOOD_FENCE_GATE_CLOSE); + + // 获取所有声音集合的便捷方法 + public static List getAllSoundSets() { + return List.of( + // Trapdoors + WOODEN_TRAPDOOR, NETHER_WOOD_TRAPDOOR, BAMBOO_WOOD_TRAPDOOR, + CHERRY_WOOD_TRAPDOOR, COPPER_TRAPDOOR, + // Doors + WOODEN_DOOR, NETHER_WOOD_DOOR, BAMBOO_WOOD_DOOR, + CHERRY_WOOD_DOOR, COPPER_DOOR, + // Fence gates + WOODEN_FENCE_GATE, NETHER_WOOD_FENCE_GATE, + BAMBOO_WOOD_FENCE_GATE, CHERRY_WOOD_FENCE_GATE, + // Buttons + WOODEN_BUTTON, NETHER_WOOD_BUTTON, BAMBOO_WOOD_BUTTON, + CHERRY_WOOD_BUTTON, STONE_BUTTON + ); + } + + // 按类型获取声音集合的方法 + public static List getTrapdoorSoundSets() { + return List.of(WOODEN_TRAPDOOR, NETHER_WOOD_TRAPDOOR, BAMBOO_WOOD_TRAPDOOR, + CHERRY_WOOD_TRAPDOOR, COPPER_TRAPDOOR); + } + + public static List getDoorSoundSets() { + return List.of(WOODEN_DOOR, NETHER_WOOD_DOOR, BAMBOO_WOOD_DOOR, + CHERRY_WOOD_DOOR, COPPER_DOOR); + } + + public static List getFenceGateSoundSets() { + return List.of(WOODEN_FENCE_GATE, NETHER_WOOD_FENCE_GATE, + BAMBOO_WOOD_FENCE_GATE, CHERRY_WOOD_FENCE_GATE); + } + + public static List getButtonSoundSets() { + return List.of(WOODEN_BUTTON, NETHER_WOOD_BUTTON, BAMBOO_WOOD_BUTTON, + CHERRY_WOOD_BUTTON, STONE_BUTTON); + } + + private static final Map SOUND_SETS = new HashMap<>(); + + static { + for (SoundSet set : getAllSoundSets()) { + set.blocks.forEach(block -> { + SOUND_SETS.put(block, set); + }); + } + } + + @Nullable + public static SoundSet getByBlock(Key blockType) { + return SOUND_SETS.get(blockType); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/Sounds.java b/core/src/main/java/net/momirealms/craftengine/core/sound/Sounds.java index a5e6000df..252754c00 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/sound/Sounds.java +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/Sounds.java @@ -1,35 +1,10 @@ package net.momirealms.craftengine.core.sound; -import net.momirealms.craftengine.core.block.BlockKeys; import net.momirealms.craftengine.core.util.Key; -import java.util.List; - public final class Sounds { private Sounds() {} - public static final List WOODEN_TRAPDOORS = List.of(BlockKeys.OAK_TRAPDOOR, BlockKeys.SPRUCE_TRAPDOOR, BlockKeys.BIRCH_TRAPDOOR, - BlockKeys.ACACIA_TRAPDOOR, BlockKeys.PALE_OAK_TRAPDOOR, BlockKeys.DARK_OAK_TRAPDOOR, BlockKeys.MANGROVE_TRAPDOOR, BlockKeys.JUNGLE_TRAPDOOR); - public static final List CHERRY_TRAPDOORS = List.of(BlockKeys.CHERRY_TRAPDOOR); - public static final List BAMBOO_TRAPDOORS = List.of(BlockKeys.BAMBOO_TRAPDOOR); - public static final List NETHER_TRAPDOORS = List.of(BlockKeys.WARPED_TRAPDOOR, BlockKeys.CRIMSON_TRAPDOOR); - public static final List COPPER_TRAPDOORS = List.of(BlockKeys.COPPER_TRAPDOOR, BlockKeys.EXPOSED_COPPER_TRAPDOOR, BlockKeys.WEATHERED_COPPER_TRAPDOOR, BlockKeys.OXIDIZED_COPPER_DOOR, - BlockKeys.WAXED_COPPER_TRAPDOOR, BlockKeys.WAXED_EXPOSED_COPPER_TRAPDOOR, BlockKeys.WAXED_WEATHERED_COPPER_TRAPDOOR, BlockKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR); - - public static final List WOODEN_DOORS = List.of(BlockKeys.OAK_DOOR, BlockKeys.SPRUCE_DOOR, BlockKeys.BIRCH_DOOR, - BlockKeys.ACACIA_DOOR, BlockKeys.PALE_OAK_DOOR, BlockKeys.DARK_OAK_DOOR, BlockKeys.MANGROVE_DOOR, BlockKeys.JUNGLE_DOOR); - public static final List CHERRY_DOORS = List.of(BlockKeys.CHERRY_DOOR); - public static final List BAMBOO_DOORS = List.of(BlockKeys.BAMBOO_DOOR); - public static final List NETHER_DOORS = List.of(BlockKeys.WARPED_DOOR, BlockKeys.CRIMSON_DOOR); - public static final List COPPER_DOORS = List.of(BlockKeys.COPPER_DOOR, BlockKeys.EXPOSED_COPPER_DOOR, BlockKeys.WEATHERED_COPPER_DOOR, BlockKeys.OXIDIZED_COPPER_DOOR, - BlockKeys.WAXED_COPPER_DOOR, BlockKeys.WAXED_EXPOSED_COPPER_DOOR, BlockKeys.WAXED_WEATHERED_COPPER_DOOR, BlockKeys.WAXED_OXIDIZED_COPPER_DOOR); - - public static final List WOODEN_FENCE_GATES = List.of(BlockKeys.OAK_FENCE_GATE, BlockKeys.SPRUCE_FENCE_GATE, BlockKeys.BIRCH_FENCE_GATE, - BlockKeys.ACACIA_FENCE_GATE, BlockKeys.PALE_OAK_FENCE_GATE, BlockKeys.DARK_OAK_FENCE_GATE, BlockKeys.MANGROVE_FENCE_GATE, BlockKeys.JUNGLE_FENCE_GATE); - public static final List CHERRY_FENCE_GATES = List.of(BlockKeys.CHERRY_FENCE_GATE); - public static final List BAMBOO_FENCE_GATES = List.of(BlockKeys.BAMBOO_FENCE_GATE); - public static final List NETHER_FENCE_GATES = List.of(BlockKeys.WARPED_FENCE_GATE, BlockKeys.CRIMSON_FENCE_GATE); - public static final Key WOODEN_TRAPDOOR_OPEN = Key.of("block.wooden_trapdoor.open"); public static final Key WOODEN_TRAPDOOR_CLOSE = Key.of("block.wooden_trapdoor.close"); public static final Key WOODEN_DOOR_OPEN = Key.of("block.wooden_door.open"); @@ -58,4 +33,14 @@ public final class Sounds { public static final Key COPPER_TRAPDOOR_CLOSE = Key.of("block.copper_trapdoor.close"); public static final Key COPPER_DOOR_OPEN = Key.of("block.copper_door.open"); public static final Key COPPER_DOOR_CLOSE = Key.of("block.copper_door.close"); + public static final Key STONE_BUTTON_CLICK_OFF = Key.of("block.stone_button.click_off"); + public static final Key STONE_BUTTON_CLICK_ON = Key.of("block.stone_button.click_on"); + public static final Key CHERRY_WOOD_BUTTON_CLICK_OFF = Key.of("block.cherry_wood_button.click_off"); + public static final Key CHERRY_WOOD_BUTTON_CLICK_ON = Key.of("block.cherry_wood_button.click_on"); + public static final Key NETHER_WOOD_BUTTON_CLICK_OFF = Key.of("block.nether_wood_button.click_off"); + public static final Key NETHER_WOOD_BUTTON_CLICK_ON = Key.of("block.nether_wood_button.click_on"); + public static final Key BAMBOO_WOOD_BUTTON_CLICK_OFF = Key.of("block.bamboo_wood_button.click_off"); + public static final Key BAMBOO_WOOD_BUTTON_CLICK_ON = Key.of("block.bamboo_wood_button.click_on"); + public static final Key WOODEN_BUTTON_CLICK_OFF = Key.of("block.wooden_button.click_off"); + public static final Key WOODEN_BUTTON_CLICK_ON = Key.of("block.wooden_button.click_on"); }