Move poisoned joke sound to a tag

This commit is contained in:
Sollace 2024-09-30 19:28:45 +01:00
parent 00bd1a65b9
commit 30eab4ee6a
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
6 changed files with 81 additions and 80 deletions

View file

@ -7,6 +7,7 @@ import net.minecraft.entity.effect.StatusEffect;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.registry.*; import net.minecraft.registry.*;
import net.minecraft.registry.tag.TagKey; import net.minecraft.registry.tag.TagKey;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.dimension.DimensionType;
@ -148,4 +149,12 @@ public interface UTags {
return TagKey.of(RegistryKeys.STATUS_EFFECT, Unicopia.id(name)); return TagKey.of(RegistryKeys.STATUS_EFFECT, Unicopia.id(name));
} }
} }
interface Sounds {
TagKey<SoundEvent> POISON_JOKE_EVENTS = sound("poison_joke_events");
private static TagKey<SoundEvent> sound(String name) {
return TagKey.of(RegistryKeys.SOUND_EVENT, Unicopia.id(name));
}
}
} }

View file

@ -27,7 +27,6 @@ import com.minelittlepony.unicopia.entity.effect.SeaponyGraceStatusEffect;
import com.minelittlepony.unicopia.entity.effect.UPotions; import com.minelittlepony.unicopia.entity.effect.UPotions;
import com.minelittlepony.unicopia.entity.mob.UEntities; import com.minelittlepony.unicopia.entity.mob.UEntities;
import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.UItems;
import com.minelittlepony.unicopia.item.enchantment.UEnchantments;
import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.Channel;
import com.minelittlepony.unicopia.particle.UParticles; import com.minelittlepony.unicopia.particle.UParticles;
import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import com.minelittlepony.unicopia.server.world.BlockDestructionManager;
@ -104,7 +103,6 @@ public class Unicopia implements ModInitializer {
private void registerServerDataReloaders(ResourceManagerHelper registry) { private void registerServerDataReloaders(ResourceManagerHelper registry) {
registry.registerReloadListener(TreeTypeLoader.INSTANCE); registry.registerReloadListener(TreeTypeLoader.INSTANCE);
registry.registerReloadListener(UEnchantments.POISONED_JOKE);
registry.registerReloadListener(new TraitLoader()); registry.registerReloadListener(new TraitLoader());
registry.registerReloadListener(StateMapLoader.INSTANCE); registry.registerReloadListener(StateMapLoader.INSTANCE);
registry.registerReloadListener(SpellbookChapterLoader.INSTANCE); registry.registerReloadListener(SpellbookChapterLoader.INSTANCE);

View file

@ -0,0 +1,53 @@
package com.minelittlepony.unicopia.datagen.providers.tag;
import java.util.concurrent.CompletableFuture;
import com.minelittlepony.unicopia.UTags;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.RegistryWrapper.WrapperLookup;
import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents;
public class USoundEventTagProvider extends FabricTagProvider<SoundEvent> {
public USoundEventTagProvider(FabricDataOutput output, CompletableFuture<WrapperLookup> registriesFuture) {
super(output, RegistryKeys.SOUND_EVENT, registriesFuture);
}
@Override
protected void configure(WrapperLookup lookup) {
getOrCreateTagBuilder(UTags.Sounds.POISON_JOKE_EVENTS).add(
SoundEvents.AMBIENT_CAVE.registryKey(),
SoundEvents.MUSIC_MENU.registryKey(),
SoundEvents.ENTITY_GENERIC_EXPLODE.registryKey(),
SoundEvents.AMBIENT_NETHER_WASTES_LOOP.registryKey(),
SoundEvents.AMBIENT_NETHER_WASTES_MOOD.registryKey(),
SoundEvents.AMBIENT_CRIMSON_FOREST_MOOD.registryKey(),
SoundEvents.AMBIENT_BASALT_DELTAS_MOOD.registryKey(),
SoundEvents.AMBIENT_BASALT_DELTAS_LOOP.registryKey()
).add(
SoundEvents.ENTITY_CREEPER_PRIMED,
SoundEvents.BLOCK_STONE_BUTTON_CLICK_ON,
SoundEvents.BLOCK_STONE_BUTTON_CLICK_OFF,
SoundEvents.BLOCK_WOODEN_PRESSURE_PLATE_CLICK_ON,
SoundEvents.BLOCK_WOODEN_PRESSURE_PLATE_CLICK_OFF,
SoundEvents.BLOCK_WOODEN_DOOR_CLOSE,
SoundEvents.BLOCK_STONE_BREAK,
SoundEvents.ITEM_SHIELD_BREAK,
SoundEvents.ENTITY_BLAZE_AMBIENT,
SoundEvents.ENTITY_ZOMBIE_AMBIENT,
SoundEvents.ENTITY_DROWNED_AMBIENT,
SoundEvents.ENTITY_ENDERMITE_AMBIENT,
SoundEvents.ENTITY_SKELETON_AMBIENT,
SoundEvents.ENTITY_SKELETON_HORSE_AMBIENT,
SoundEvents.ENTITY_ZOGLIN_AMBIENT,
SoundEvents.ENTITY_ZOMBIFIED_PIGLIN_AMBIENT,
SoundEvents.ENTITY_ZOMBIE_BREAK_WOODEN_DOOR,
SoundEvents.ENTITY_TNT_PRIMED,
SoundEvents.AMBIENT_UNDERWATER_LOOP_ADDITIONS_ULTRA_RARE,
SoundEvents.AMBIENT_UNDERWATER_LOOP_ADDITIONS_RARE
);
}
}

View file

@ -10,8 +10,10 @@ import java.util.stream.Stream;
import org.apache.commons.lang3.reflect.TypeUtils; import org.apache.commons.lang3.reflect.TypeUtils;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.util.RegistryUtils;
import com.minelittlepony.unicopia.util.Resources; import com.minelittlepony.unicopia.util.Resources;
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener;
@ -23,11 +25,7 @@ import net.minecraft.util.math.random.Random;
import net.minecraft.util.profiler.Profiler; import net.minecraft.util.profiler.Profiler;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
public class PoisonedJokeEnchantment extends SimpleEnchantment implements IdentifiableResourceReloadListener { public class PoisonedJokeEnchantment extends SimpleEnchantment {
private static final Identifier ID = Unicopia.id("data/poisoned_joke_sounds");
private static final Identifier FILE = Unicopia.id("poisoned_joke_sounds.json");
private static final Type TYPE = TypeUtils.parameterize(List.class, Identifier.class);
private List<SoundEvent> sounds = new ArrayList<>();
protected PoisonedJokeEnchantment(Options options) { protected PoisonedJokeEnchantment(Options options) {
super(options); super(options);
@ -35,7 +33,7 @@ public class PoisonedJokeEnchantment extends SimpleEnchantment implements Identi
@Override @Override
public void onUserTick(Living<?> user, int level) { public void onUserTick(Living<?> user, int level) {
if (sounds.isEmpty() || user.asWorld().isClient) { if (user.asWorld().isClient) {
return; return;
} }
@ -47,45 +45,15 @@ public class PoisonedJokeEnchantment extends SimpleEnchantment implements Identi
if (rng.nextInt(Math.max(1, (light * 9) + (int)data.level)) == 0) { if (rng.nextInt(Math.max(1, (light * 9) + (int)data.level)) == 0) {
data.level = rng.nextInt(5000); data.level = rng.nextInt(5000);
RegistryUtils.pickRandom(user.asWorld(), UTags.Sounds.POISON_JOKE_EVENTS).ifPresent(event -> {
user.asWorld().playSoundFromEntity( user.asWorld().playSoundFromEntity(
null, null,
user.asEntity(), user.asEntity(),
sounds.get(rng.nextInt(sounds.size())), SoundCategory.HOSTILE, event, SoundCategory.HOSTILE,
0.5F + rng.nextFloat() * 0.5F, 0.5F + rng.nextFloat() * 0.5F,
0.5F + rng.nextFloat() * 0.5F 0.5F + rng.nextFloat() * 0.5F
); );
}
}
@Override
public Identifier getFabricId() {
return ID;
}
@Override
public CompletableFuture<Void> reload(Synchronizer sync, ResourceManager manager,
Profiler serverProfiler, Profiler clientProfiler,
Executor serverExecutor, Executor clientExecutor) {
return sync.whenPrepared(null).thenRunAsync(() -> {
clientProfiler.startTick();
clientProfiler.push("Loading poisoned joke sound options");
sounds = Resources.getResources(manager, FILE)
.flatMap(r -> Resources.loadFile(r, TYPE, "Failed to load sounds file at "))
.distinct()
.flatMap(this::findSound)
.collect(Collectors.toList());
clientProfiler.pop();
clientProfiler.endTick();
}, clientExecutor);
}
private Stream<SoundEvent> findSound(Identifier id) {
return Registries.SOUND_EVENT.getOrEmpty(id).map(Stream::of).orElseGet(() -> {
Unicopia.LOGGER.warn("Could not find sound with id {}", id);
return Stream.empty();
}); });
} }
} }
}

View file

@ -4,6 +4,7 @@ import java.util.Optional;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.base.Predicates;
import com.mojang.serialization.Lifecycle; import com.mojang.serialization.Lifecycle;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
@ -34,10 +35,11 @@ public interface RegistryUtils {
} }
static <T> Optional<T> pickRandom(World world, TagKey<T> key) { static <T> Optional<T> pickRandom(World world, TagKey<T> key) {
return world.getRegistryManager().getOptional(key.registry()) return pickRandomEntry(world, key).map(RegistryEntry::value);
.flatMap(registry -> registry.getEntryList(key)) }
.flatMap(entries -> entries.getRandom(world.random))
.map(RegistryEntry::value); static <T> Optional<RegistryEntry<T>> pickRandomEntry(World world, TagKey<T> key) {
return pickRandomEntry(world, key, Predicates.alwaysTrue());
} }
static <T> Optional<T> pickRandom(World world, TagKey<T> key, Predicate<T> filter) { static <T> Optional<T> pickRandom(World world, TagKey<T> key, Predicate<T> filter) {

View file

@ -1,29 +0,0 @@
[
"minecraft:ambient.cave",
"minecraft:entity.creeper.primed",
"minecraft:block.stone_button.click_on",
"minecraft:block.stone_button.click_off",
"minecraft:block.wooden_pressure_plate.click_on",
"minecraft:block.wooden_door.close",
"minecraft:block.stone.break",
"minecraft:item.shield.break",
"minecraft:entity.blaze.ambient",
"minecraft:entity.zombie.ambient",
"minecraft:entity.drowned.ambient",
"minecraft:entity.endermite.ambient",
"minecraft:entity.skeleton.ambient",
"minecraft:entity.skeleton_horse.ambient",
"minecraft:entity.zoglin.ambient",
"minecraft:entity.zombified_piglin.ambient",
"minecraft:entity.zombie.break_wooden_door",
"minecraft:music.menu",
"minecraft:entity.tnt.primed",
"minecraft:entity.generic.explode",
"minecraft:ambient.nether_wastes.loop",
"minecraft:ambient.nether_wastes.mood",
"minecraft:ambient.crimson_forest.mood",
"minecraft:ambient.basalt_deltas.mood",
"minecraft:ambient.basalt_deltas.loop",
"minecraft:ambient.underwater.loop.additions.ultra_rare",
"minecraft:ambient.underwater.loop.additions.rare"
]