Add ability to change the sounds for a disguise to whatever you like

This commit is contained in:
libraryaddict 2020-05-23 22:48:50 +12:00
parent e77a28c258
commit 37e7a0bac7
No known key found for this signature in database
GPG Key ID: 052E4FBCD257AEA4
14 changed files with 299 additions and 337 deletions

@ -25,6 +25,7 @@ import me.libraryaddict.disguise.utilities.parser.DisguiseParser;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.asm.WatcherSanitizer;
import me.libraryaddict.disguise.utilities.sounds.SoundManager;
import me.libraryaddict.disguise.utilities.updates.UpdateChecker;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
@ -119,6 +120,7 @@ public class LibsDisguises extends JavaPlugin {
}
ReflectionManager.init();
new SoundManager().load();
PacketsManager.init();
DisguiseUtilities.init();

@ -105,6 +105,9 @@ public abstract class Disguise {
@Getter
@Setter
private boolean dynamicName;
@Getter
@Setter
private String soundGroup;
public Disguise(DisguiseType disguiseType) {
this.disguiseType = disguiseType;
@ -211,6 +214,7 @@ public abstract class Disguise {
disguise.setModifyBoundingBox(isModifyBoundingBox());
disguise.multiName = Arrays.copyOf(multiName, multiName.length);
disguise.setDynamicName(isDynamicName());
disguise.setSoundGroup(getSoundGroup());
if (getWatcher() != null && disguise.getWatcher() == null) {
disguise.setWatcher(getWatcher().clone(disguise));

@ -1,309 +0,0 @@
package me.libraryaddict.disguise.utilities;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.Sound;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;
/**
* Only living disguises go in here!
*/
public enum DisguiseSound {
ARMOR_STAND,
ARROW,
BAT,
BEE,
BLAZE,
BOAT,
CAVE_SPIDER,
CHICKEN,
COD,
COW,
CREEPER,
DOLPHIN,
DONKEY,
DROWNED,
ELDER_GUARDIAN,
ENDER_DRAGON,
ENDERMAN,
ENDERMITE,
EVOKER,
EVOKER_FANGS,
GHAST,
GIANT,
GUARDIAN,
HORSE,
HUSK,
ILLUSIONER,
IRON_GOLEM,
LLAMA,
MAGMA_CUBE,
MULE,
MUSHROOM_COW,
OCELOT,
PARROT,
PIG,
PIG_ZOMBIE,
PLAYER,
PHANTOM,
POLAR_BEAR,
PUFFERFISH,
RABBIT,
SALMON,
SHEEP,
SHULKER,
SILVERFISH,
SKELETON,
SKELETON_HORSE,
SLIME,
SNOWMAN,
SPIDER,
STRAY,
SQUID,
TROPICAL_FISH,
TURTLE,
VEX,
VILLAGER,
VINDICATOR,
WITCH,
WITHER,
WITHER_SKELETON,
WOLF,
ZOMBIE,
ZOMBIE_HORSE,
ZOMBIE_VILLAGER;
public enum SoundType {
CANCEL,
DEATH,
HURT,
IDLE,
STEP
}
static {
try (InputStream stream = LibsDisguises.getInstance().getResource("ANTI_PIRACY_ENCODED_WITH_SOUNDS")) {
List<String> lines = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).lines()
.collect(Collectors.toList());
for (String s : lines) {
String[] spl = s.split(":", -1);
DisguiseSound sound = DisguiseSound.valueOf(spl[0]);
for (int i = 1; i <= SoundType.values().length; i++) {
if (spl[i].isEmpty()) {
continue;
}
String[] split = spl[i].split(",");
for (String sName : split) {
try {
sound.addSound(Sound.valueOf(sName), SoundType.values()[i - 1]);
}
catch (IllegalArgumentException ex) {
}
}
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
public static DisguiseSound getType(String name) {
try {
return valueOf(name);
}
catch (Exception ex) {
return null;
}
}
private float damageSoundVolume = 1F;
private LinkedHashMap<Object, SoundType> disguiseSounds = new LinkedHashMap<>();
private Sound parseSound(String name) {
try {
return Sound.valueOf(name);
}
catch (Exception ex) {
}
return null;
}
private void addSound(Object sound, SoundType type) {
if (sound == null) {
return;
}
if (sound instanceof String[]) {
for (String s : (String[]) sound) {
Sound so = parseSound(s);
if (so == null) {
continue;
}
addSound(so, type);
}
} else if (sound instanceof String) {
Sound so = parseSound((String) sound);
if (so == null) {
return;
}
addSound(so, type);
} else if (sound instanceof Sound[]) {
for (Sound s : (Sound[]) sound) {
if (s == null) {
continue;
}
addSound(s, type);
}
} else if (sound instanceof Sound) {
addSound((Sound) sound, type);
} else {
throw new IllegalArgumentException("Was given an unknown object " + sound);
}
}
private void addSound(Sound sound, SoundType type) {
Object soundEffect = ReflectionManager.getCraftSound(sound);
if (disguiseSounds.containsKey(soundEffect)) {
DisguiseUtilities.getLogger().severe("Already doing " + sound);
}
disguiseSounds.put(soundEffect, type);
}
public float getDamageAndIdleSoundVolume() {
return damageSoundVolume;
}
public void setDamageAndIdleSoundVolume(float strength) {
this.damageSoundVolume = strength;
}
public Object getSound(SoundType type) {
if (type == null) {
return null;
}
for (Entry<Object, SoundType> entry : disguiseSounds.entrySet()) {
if (entry.getValue() != type) {
continue;
}
return entry.getKey();
}
return null;
}
public SoundType getSound(Object sound) {
if (sound == null) {
return null;
}
return disguiseSounds.get(sound);
}
/**
* Used to check if this sound name is owned by this disguise sound.
*/
public SoundType getType(Object sound, boolean ignoreDamage) {
if (sound == null) {
return SoundType.CANCEL;
}
SoundType soundType = getSound(sound);
if (soundType == SoundType.DEATH || (ignoreDamage && soundType == SoundType.HURT)) {
return null;
}
return soundType;
}
public boolean isCancelSound(String sound) {
return getSound(sound) == SoundType.CANCEL;
}
}

@ -12,10 +12,10 @@ import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.MobDisguise;
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise;
import me.libraryaddict.disguise.utilities.DisguiseSound;
import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup.SoundType;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.block.Block;
@ -61,7 +61,7 @@ public class PacketListenerSounds extends PacketAdapter {
SoundType soundType = null;
Entity disguisedEntity = null;
DisguiseSound entitySound = null;
SoundGroup entitySound = null;
Object soundEffectObj = mods.read(0);
Disguise disguise = null;
@ -89,7 +89,7 @@ public class PacketListenerSounds extends PacketAdapter {
continue;
}
entitySound = DisguiseSound.getType(entity.getType().name());
entitySound = SoundGroup.getGroup(entity.getType().name());
if (entitySound == null) {
continue;
@ -148,7 +148,7 @@ public class PacketListenerSounds extends PacketAdapter {
(disguise.isSelfDisguiseSoundsReplaced() || disguisedEntity != observer)) {
Object sound = null;
DisguiseSound disguiseSound = DisguiseSound.getType(disguise.getType().name());
SoundGroup disguiseSound = SoundGroup.getGroup(disguise);
if (disguiseSound != null) {
sound = disguiseSound.getSound(soundType);
@ -259,7 +259,7 @@ public class PacketListenerSounds extends PacketAdapter {
if (!disguise.getType().isPlayer() &&
(disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) {
DisguiseSound disSound = DisguiseSound.getType(entity.getType().name());
SoundGroup disSound = SoundGroup.getGroup(entity.getType().name());
if (disSound == null)
return;
@ -295,7 +295,7 @@ public class PacketListenerSounds extends PacketAdapter {
return;
}
disSound = DisguiseSound.getType(disguise.getType().name());
disSound = SoundGroup.getGroup(disguise);
if (disSound != null) {
Object sound = disSound.getSound(soundType);

@ -8,6 +8,7 @@ import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher;
import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher;
import me.libraryaddict.disguise.utilities.params.types.custom.ParamInfoItemBlock;
import me.libraryaddict.disguise.utilities.params.types.custom.ParamInfoSoundGroup;
import me.libraryaddict.disguise.utilities.parser.DisguisePerm;
import me.libraryaddict.disguise.utilities.watchers.DisguiseMethods;
import org.bukkit.ChatColor;
@ -25,6 +26,8 @@ public class ParamInfoManager {
private static DisguiseMethods disguiseMethods;
@Getter
private static ParamInfoItemBlock paramInfoItemBlock;
@Getter
private static ParamInfoSoundGroup paramInfoSoundGroup;
public static List<ParamInfo> getParamInfos() {
return paramList;
@ -45,6 +48,10 @@ public class ParamInfoManager {
}
public static ParamInfo getParamInfo(Method method) {
if (method.getName().equals("setSoundGroup")) {
return getParamInfoSoundGroup();
}
if (method.getDeclaringClass() == FallingBlockWatcher.class &&
method.getParameterTypes()[0] == ItemStack.class) {
return getParamInfoItemBlock();
@ -84,6 +91,7 @@ public class ParamInfoManager {
ParamInfoTypes infoTypes = new ParamInfoTypes();
paramList = infoTypes.getParamInfos();
paramInfoItemBlock = infoTypes.getParamInfoBlock();
paramInfoSoundGroup = infoTypes.getParamInfoSoundGroup();
disguiseMethods = new DisguiseMethods();
//paramList.sort((o1, o2) -> String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName()));
@ -112,7 +120,7 @@ public class ParamInfoManager {
// Add these last as it's what we want to present to be called the least
for (String methodName : new String[]{"setSelfDisguiseVisible", "setHideHeldItemFromSelf",
"setHideArmorFromSelf", "setHearSelfDisguise", "setHidePlayer", "setExpires", "setNotifyBar",
"setBossBarColor", "setBossBarStyle", "setTallDisguisesVisible", "setDynamicName"}) {
"setBossBarColor", "setBossBarStyle", "setTallDisguisesVisible", "setDynamicName", "setSoundGroup"}) {
try {
Class cl = boolean.class;
@ -129,6 +137,9 @@ public class ParamInfoManager {
case "setBossBarStyle":
cl = BarStyle.class;
break;
case "setSoundGroup":
cl = String.class;
break;
default:
break;
}

@ -10,6 +10,7 @@ import me.libraryaddict.disguise.utilities.params.types.ParamInfoEnum;
import me.libraryaddict.disguise.utilities.params.types.base.*;
import me.libraryaddict.disguise.utilities.params.types.custom.*;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup;
import org.apache.commons.lang.StringUtils;
import org.bukkit.*;
import org.bukkit.block.BlockFace;
@ -33,6 +34,14 @@ public class ParamInfoTypes {
"An ItemStack compromised of Material,Amount,Glow. Only requires Material", getMaterials());
}
public ParamInfoSoundGroup getParamInfoSoundGroup() {
HashMap<String, Object> possibleSoundGroups = new HashMap<>();
SoundGroup.getGroups().keySet().forEach(key -> possibleSoundGroups.put(key, key));
return new ParamInfoSoundGroup(possibleSoundGroups);
}
/**
* Constructor values are listed here for continuity
*/

@ -0,0 +1,14 @@
package me.libraryaddict.disguise.utilities.params.types.custom;
import me.libraryaddict.disguise.utilities.params.types.ParamInfoEnum;
import java.util.Map;
/**
* Created by libraryaddict on 23/05/2020.
*/
public class ParamInfoSoundGroup extends ParamInfoEnum {
public ParamInfoSoundGroup(Map<String, Object> possibleValues) {
super(String.class, "SoundGroup", "A group of sounds", possibleValues);
}
}

@ -9,10 +9,10 @@ import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.disguisetypes.*;
import me.libraryaddict.disguise.disguisetypes.watchers.*;
import me.libraryaddict.disguise.utilities.DisguiseSound;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.DisguiseValues;
import me.libraryaddict.disguise.utilities.LibsPremium;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.bukkit.*;
@ -1726,7 +1726,7 @@ public class ReflectionManager {
disguiseValues.setAdultBox(new FakeBoundingBox(0, 0, 0));
DisguiseSound sound = DisguiseSound.getType(disguiseType.name());
SoundGroup sound = SoundGroup.getGroup(disguiseType.name());
if (sound != null) {
sound.setDamageAndIdleSoundVolume(1f);
@ -1820,7 +1820,7 @@ public class ReflectionManager {
" at index " + index.getIndex());
}
DisguiseSound sound = DisguiseSound.getType(disguiseType.name());
SoundGroup sound = SoundGroup.getGroup(disguiseType.name());
if (sound != null) {
Float soundStrength = ReflectionManager.getSoundModifier(nmsEntity);

@ -1,7 +1,10 @@
package me.libraryaddict.disguise.utilities;
package me.libraryaddict.disguise.utilities.sounds;
import lombok.Getter;
import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup.SoundType;
import org.bukkit.Sound;
import java.util.Arrays;
@ -229,8 +232,7 @@ public enum DisguiseSoundEnums {
Sound.ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR, Sound.ENTITY_ZOMBIE_BREAK_WOODEN_DOOR,
Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR);
@Getter
private LinkedHashMap<Sound, SoundType> disguiseSounds = new LinkedHashMap<>();
private SoundGroup group = new SoundGroup(name());
DisguiseSoundEnums(Object hurt, Object step, Object death, Object idle, Object... sounds) {
addSound(hurt, SoundType.HURT);
@ -264,6 +266,6 @@ public enum DisguiseSoundEnums {
}
private void addSound(Sound sound, SoundType type) {
disguiseSounds.put(sound, type);
group.addSound(ReflectionManager.getCraftSound(sound), type);
}
}

@ -0,0 +1,107 @@
package me.libraryaddict.disguise.utilities.sounds;
import lombok.Getter;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.Sound;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by libraryaddict on 23/05/2020.
*/
public class SoundGroup {
public enum SoundType {
CANCEL,
DEATH,
HURT,
IDLE,
STEP
}
@Getter
private final static HashMap<String, SoundGroup> groups = new HashMap<>();
private float damageSoundVolume = 1F;
@Getter
private final LinkedHashMap<Object, SoundType> disguiseSounds = new LinkedHashMap<>();
public SoundGroup(String name) {
groups.put(name, this);
}
public void addSound(Object sound, SoundType type) {
if (sound instanceof String) {
sound = ReflectionManager.createMinecraftKey((String) sound);
}
disguiseSounds.put(sound, type);
}
public float getDamageAndIdleSoundVolume() {
return damageSoundVolume;
}
public void setDamageAndIdleSoundVolume(float strength) {
this.damageSoundVolume = strength;
}
public Object getSound(SoundType type) {
if (type == null) {
return null;
}
for (Map.Entry<Object, SoundType> entry : disguiseSounds.entrySet()) {
if (entry.getValue() != type) {
continue;
}
return entry.getKey();
}
return null;
}
public SoundType getSound(Object sound) {
if (sound == null) {
return null;
}
return disguiseSounds.get(sound);
}
/**
* Used to check if this sound name is owned by this disguise sound.
*/
public SoundType getType(Object sound, boolean ignoreDamage) {
if (sound == null) {
return SoundType.CANCEL;
}
SoundType soundType = getSound(sound);
if (soundType == SoundType.DEATH || (ignoreDamage && soundType == SoundType.HURT)) {
return null;
}
return soundType;
}
public boolean isCancelSound(String sound) {
return getSound(sound) == SoundType.CANCEL;
}
public static SoundGroup getGroup(Disguise disguise) {
if (disguise.getSoundGroup() != null) {
return getGroup(disguise.getSoundGroup());
}
return getGroup(disguise.getType().name());
}
public static SoundGroup getGroup(String name) {
return groups.get(name);
}
}

@ -0,0 +1,100 @@
package me.libraryaddict.disguise.utilities.sounds;
import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by libraryaddict on 23/05/2020.
*/
public class SoundManager {
public void load() {
loadSounds();
loadCustomSounds();
}
private void loadCustomSounds() {
File f = new File(LibsDisguises.getInstance().getDataFolder(), "sounds.yml");
if (!f.exists()) {
LibsDisguises.getInstance().saveResource("sounds.yml", false);
}
YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
for (String key : config.getKeys(false)) {
if (!config.isConfigurationSection(key) || key.equals("GroupName")) {
continue;
}
if (SoundGroup.getGroups().keySet().stream().anyMatch(k -> k.equalsIgnoreCase(key))) {
DisguiseUtilities.getLogger().warning("The SoundGroup " + key + " has already been registered!");
continue;
}
SoundGroup group = new SoundGroup(key);
ConfigurationSection section = config.getConfigurationSection(key);
for (SoundGroup.SoundType type : SoundGroup.SoundType.values()) {
if (type == SoundGroup.SoundType.CANCEL) {
continue;
}
List<String> list = section
.getStringList(type.name().charAt(0) + type.name().substring(1).toLowerCase());
if (list == null || list.isEmpty()) {
continue;
}
for (String sound : list) {
if (!sound.matches(".+:.+")) {
DisguiseUtilities.getLogger()
.warning("Invalid sound '" + sound + "'! Must be a minecraft:sound.name");
continue;
}
group.addSound(sound, type);
}
}
DisguiseUtilities.getLogger().info("Loaded sound group '" + key + "'");
}
}
private void loadSounds() {
DisguiseSoundEnums.values();
}
/*private void loadSounds() {
try (InputStream stream = LibsDisguises.getInstance().getResource("ANTI_PIRACY_ENCODED_WITH_SOUNDS")) {
List<String> lines = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).lines()
.collect(Collectors.toList());
for (String line : lines) {
String[] groups = line.split("/");
SoundGroup group = new SoundGroup(groups[0]);
int i = 0;
for (SoundGroup.SoundType type : SoundGroup.SoundType.values()) {
String[] sounds = groups[++i].split(",");
for (String sound : sounds) {
group.addSound(sound, type);
}
}
}
}
catch (IOException | NoClassDefFoundError e) {
e.printStackTrace();
}
}*/
}

@ -1,14 +1,14 @@
package me.libraryaddict.disguise.utilities.watchers;
import com.comphenix.protocol.wrappers.MinecraftKey;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.utilities.DisguiseSound;
import me.libraryaddict.disguise.utilities.DisguiseSoundEnums;
import me.libraryaddict.disguise.utilities.LibsPremium;
import me.libraryaddict.disguise.utilities.reflection.ClassGetter;
import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn;
import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn;
import me.libraryaddict.disguise.utilities.sounds.DisguiseSoundEnums;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Sound;
import java.io.File;
import java.io.PrintWriter;
@ -32,21 +32,24 @@ public class CompileMethods {
@CompileMethodsIntfer(user = "%%__USER__%%")
public static void main(String[] args) {
doMethods();
doSounds();
}
private static void doSounds() {
/*private static void doSounds() {
List<String> list = new ArrayList<>();
for (DisguiseSoundEnums s : DisguiseSoundEnums.values()) {
StringBuilder sound = new StringBuilder(s.name());
for (DisguiseSoundEnums sound : DisguiseSoundEnums.values()){
for (DisguiseSound.SoundType type : DisguiseSound.SoundType.values()) {
sound.append(":");
}
for (Map.Entry<String, SoundGroup> entry : SoundGroup.getGroups().entrySet()) {
StringBuilder sound = new StringBuilder(entry.getKey());
for (SoundGroup.SoundType type : SoundGroup.SoundType.values()) {
sound.append("/");
int i = 0;
for (Map.Entry<Sound, DisguiseSound.SoundType> values : s.getDisguiseSounds().entrySet()) {
for (Map.Entry<Object, SoundGroup.SoundType> values : entry.getValue().getDisguiseSounds().entrySet()) {
if (values.getValue() != type) {
continue;
}
@ -55,7 +58,7 @@ public class CompileMethods {
sound.append(",");
}
sound.append(values.getKey().name());
sound.append(MinecraftKey.fromHandle(values.getKey()).getFullKey());
}
}
@ -70,7 +73,7 @@ public class CompileMethods {
catch (Exception ex) {
ex.printStackTrace();
}
}
}*/
private static void addClass(ArrayList<Class> classes, Class c) {
if (classes.contains(c)) {

@ -6,6 +6,7 @@ import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.reflection.asm.WatcherInfo;
import me.libraryaddict.disguise.utilities.sounds.SoundGroup;
import java.io.BufferedReader;
import java.io.IOException;
@ -47,6 +48,10 @@ public class DisguiseMethods {
}
public DisguiseMethods() {
loadMethods();
}
private void loadMethods() {
try (InputStream stream = LibsDisguises.getInstance().getResource("ANTI_PIRACY_ENCRYPTION")) {
List<String> lines = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).lines()
.collect(Collectors.toList());

@ -0,0 +1,14 @@
# Here you can define custom sounds for a sound group!
# This is an example group, this group will never be loaded.
# Create your sound group here, then use 'setSoundGroup <Name>' on your disguise
# You cannot use the same group name as a disguise type! So no 'PLAYER', 'COW' etc.
GroupName:
# If you don't set one of these options, or it is empty. Then no sound will be played for that sound type
Idle:
- minecraft:some.idle.sound
Hurt:
- minecraft:some.hurt.sound
Death:
- minecraft:some.death.scream.sound
Step:
- minecraft:some.step.sound