9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-03 22:26:16 +00:00

声音重构part 2

This commit is contained in:
XiaoMoMi
2025-09-28 20:24:36 +08:00
parent 2aa75f7178
commit 66bbe3f6e1
12 changed files with 210 additions and 77 deletions

View File

@@ -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<BlockStateWrapper> tempVisualBlocksInUse = new HashSet<>();
protected final Set<BlockStateWrapper> tempVisualBlockStatesInUse = new HashSet<>();
protected final Set<Key> tempVisualBlocksInUse = new HashSet<>();
// 声音映射表,和使用了哪些视觉方块有关
protected Map<Key, Key> 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()) {

View File

@@ -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<Key> 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<Key> CHERRY_TRAPDOORS = List.of(CHERRY_TRAPDOOR);
public static final List<Key> BAMBOO_TRAPDOORS = List.of(BAMBOO_TRAPDOOR);
public static final List<Key> NETHER_TRAPDOORS = List.of(WARPED_TRAPDOOR, CRIMSON_TRAPDOOR);
public static final List<Key> 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<Key> 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<Key> CHERRY_DOORS = List.of(CHERRY_DOOR);
public static final List<Key> BAMBOO_DOORS = List.of(BAMBOO_DOOR);
public static final List<Key> NETHER_DOORS = List.of(WARPED_DOOR, CRIMSON_DOOR);
public static final List<Key> 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<Key> 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<Key> CHERRY_FENCE_GATES = List.of(CHERRY_FENCE_GATE);
public static final List<Key> BAMBOO_FENCE_GATES = List.of(BAMBOO_FENCE_GATE);
public static final List<Key> NETHER_FENCE_GATES = List.of(WARPED_FENCE_GATE, CRIMSON_FENCE_GATE);
public static final List<Key> 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<Key> CHERRY_BUTTONS = List.of(CHERRY_BUTTON);
public static final List<Key> BAMBOO_BUTTONS = List.of(BAMBOO_BUTTON);
public static final List<Key> NETHER_BUTTONS = List.of(CRIMSON_BUTTON, WARPED_BUTTON);
public static final List<Key> STONE_BUTTONS = List.of(STONE_BUTTON, POLISHED_BLACKSTONE_BUTTON);
}

View File

@@ -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 {

View File

@@ -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};
}

View File

@@ -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<Key> 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<SoundSet> 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<SoundSet> getTrapdoorSoundSets() {
return List.of(WOODEN_TRAPDOOR, NETHER_WOOD_TRAPDOOR, BAMBOO_WOOD_TRAPDOOR,
CHERRY_WOOD_TRAPDOOR, COPPER_TRAPDOOR);
}
public static List<SoundSet> getDoorSoundSets() {
return List.of(WOODEN_DOOR, NETHER_WOOD_DOOR, BAMBOO_WOOD_DOOR,
CHERRY_WOOD_DOOR, COPPER_DOOR);
}
public static List<SoundSet> getFenceGateSoundSets() {
return List.of(WOODEN_FENCE_GATE, NETHER_WOOD_FENCE_GATE,
BAMBOO_WOOD_FENCE_GATE, CHERRY_WOOD_FENCE_GATE);
}
public static List<SoundSet> getButtonSoundSets() {
return List.of(WOODEN_BUTTON, NETHER_WOOD_BUTTON, BAMBOO_WOOD_BUTTON,
CHERRY_WOOD_BUTTON, STONE_BUTTON);
}
private static final Map<Key, SoundSet> 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);
}
}

View File

@@ -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<Key> 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<Key> CHERRY_TRAPDOORS = List.of(BlockKeys.CHERRY_TRAPDOOR);
public static final List<Key> BAMBOO_TRAPDOORS = List.of(BlockKeys.BAMBOO_TRAPDOOR);
public static final List<Key> NETHER_TRAPDOORS = List.of(BlockKeys.WARPED_TRAPDOOR, BlockKeys.CRIMSON_TRAPDOOR);
public static final List<Key> 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<Key> 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<Key> CHERRY_DOORS = List.of(BlockKeys.CHERRY_DOOR);
public static final List<Key> BAMBOO_DOORS = List.of(BlockKeys.BAMBOO_DOOR);
public static final List<Key> NETHER_DOORS = List.of(BlockKeys.WARPED_DOOR, BlockKeys.CRIMSON_DOOR);
public static final List<Key> 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<Key> 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<Key> CHERRY_FENCE_GATES = List.of(BlockKeys.CHERRY_FENCE_GATE);
public static final List<Key> BAMBOO_FENCE_GATES = List.of(BlockKeys.BAMBOO_FENCE_GATE);
public static final List<Key> 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");
}