diff --git a/pom.xml b/pom.xml index e55717185..c554fa537 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.lokka30 LevelledMobs - 3.9.5 b743 + 3.10.0 b752 LevelledMobs The Ultimate RPG Mob Levelling Solution @@ -14,28 +14,27 @@ jar - 17 + 17 + 17 UTF-8 + + 3.0.1 + 3.2.0 + + 1.19.4-R0.1-SNAPSHOT + 2.19.7 + 2.11.2 + 3.3.39 + 7.0.7 + 4.8.0 + 2.11.1 + 1.1.0 clean package ${project.name}-${project.version} - - org.apache.maven.plugins - maven-compiler-plugin - 3.10.1 - - 17 - 17 - - - - net.md-5 - specialsource-maven-plugin - 1.2.4 - org.apache.maven.plugins maven-shade-plugin @@ -75,11 +74,6 @@ false - - - *:* - - @@ -94,6 +88,10 @@ + + papermc + https://repo.papermc.io/repository/maven-public/ + essentials-releases https://repo.essentialsx.net/releases/ @@ -102,10 +100,6 @@ placeholderapi https://repo.extendedclip.com/content/repositories/placeholderapi/ - - spigotmc-repo - https://hub.spigotmc.org/nexus/content/groups/public/ - sonatype https://oss.sonatype.org/content/groups/public/ @@ -125,77 +119,76 @@ + + + com.github.lokka30 + MicroLib + ${microlib.version} + compile + + + org.bstats + bstats-bukkit + ${bstats.version} + compile + + + net.essentialsx EssentialsX - 2.19.7 + ${essentialsx.version} provided + + + + org.spigotmc + spigot-api + + io.papermc.paper paper-api - 1.19.3-R0.1-SNAPSHOT + ${paper.version} provided me.clip placeholderapi - 2.11.2 + ${placeholderapi.version} provided com.mojang authlib - 3.3.39 - provided - - - - org.spigotmc - spigot-api - 1.19.3-R0.1-SNAPSHOT + ${authlib.version} provided - - org.bstats - bstats-bukkit - 3.0.0 - compile - com.sk89q.worldguard worldguard-bukkit - 7.0.7 + ${worldguard.version} provided - - com.github.lokka30 - MicroLib - 3.2.0 - compile - com.github.dmulloy2 ProtocolLib - 4.8.0 + ${protocollib.version} provided de.tr7zw item-nbt-api-plugin - 2.11.1 - provided - - - com.google.code.gson - gson - 2.10.1 + ${item-nbt.version} provided io.github.stumper66 LM_Items - 1.1.0 + ${lm-items.version} provided diff --git a/src/main/java/me/lokka30/levelledmobs/Companion.java b/src/main/java/me/lokka30/levelledmobs/Companion.java index f16a8741b..a757d5cbb 100644 --- a/src/main/java/me/lokka30/levelledmobs/Companion.java +++ b/src/main/java/me/lokka30/levelledmobs/Companion.java @@ -167,7 +167,6 @@ boolean loadFiles(final boolean isReload) { main.customDropsHandler = new CustomDropsHandler(main); if (!isReload) { - main.attributesCfg = loadEmbeddedResource("defaultAttributes.yml"); main.dropsCfg = loadEmbeddedResource("defaultDrops.yml"); main.mobHeadManager.loadTextures( Objects.requireNonNull(loadEmbeddedResource("textures.yml"))); diff --git a/src/main/java/me/lokka30/levelledmobs/LevelledMobs.java b/src/main/java/me/lokka30/levelledmobs/LevelledMobs.java index 96c4d7898..1c8e053b8 100644 --- a/src/main/java/me/lokka30/levelledmobs/LevelledMobs.java +++ b/src/main/java/me/lokka30/levelledmobs/LevelledMobs.java @@ -83,7 +83,6 @@ public final class LevelledMobs extends JavaPlugin { // Configuration public YamlConfiguration settingsCfg; public YamlConfiguration messagesCfg; - public YamlConfiguration attributesCfg; public YamlConfiguration dropsCfg; public final ConfigUtils configUtils = new ConfigUtils(this); diff --git a/src/main/java/me/lokka30/levelledmobs/commands/subcommands/DebugSubcommand.java b/src/main/java/me/lokka30/levelledmobs/commands/subcommands/DebugSubcommand.java index 2ba87432d..b0e68f500 100644 --- a/src/main/java/me/lokka30/levelledmobs/commands/subcommands/DebugSubcommand.java +++ b/src/main/java/me/lokka30/levelledmobs/commands/subcommands/DebugSubcommand.java @@ -41,7 +41,7 @@ public void parseSubcommand(final LevelledMobs main, final @NotNull CommandSende } if (args.length <= 1) { - sender.sendMessage("Options: create / chunk_kill_count / nbt_dump / mylocation"); + sender.sendMessage("Options: create / chunk_kill_count / nbt_dump / mylocation / spawn_distance"); return; } @@ -64,12 +64,66 @@ public void parseSubcommand(final LevelledMobs main, final @NotNull CommandSende } } else if ("mylocation".equalsIgnoreCase(args[1])){ showPlayerLocation(sender); - } - else { + } else if ("spawn_distance".equalsIgnoreCase(args[1])) { + showSpawnDistance(sender, args); + } else { showMessage("other.create-debug"); } } + private void showSpawnDistance(final @NotNull CommandSender sender, final String @NotNull [] args){ + Player player = null; + if (!(sender instanceof Player) && args.length < 3) { + sender.sendMessage("Must specify a player when running this command from console"); + return; + } + if (args.length >= 3) { + player = Bukkit.getPlayer(args[2]); + if (player == null) { + sender.sendMessage("Invalid playername: " + args[2]); + return; + } + } + + if (player == null) { + player = (Player) sender; + } + + final LivingEntityWrapper lmEntity = main.levelledMobsCommand.rulesSubcommand.getMobBeingLookedAt( + player, true, sender); + + if (lmEntity == null){ + sender.sendMessage("Could not locate any mobs near player: " + player.getName()); + return; + } + + final double distance = lmEntity.getDistanceFromSpawn(); + + final String locationStr = String.format("%s, %s, %s", + lmEntity.getLivingEntity().getLocation().getBlockX(), + lmEntity.getLivingEntity().getLocation().getBlockY(), + lmEntity.getLivingEntity().getLocation().getBlockZ()); + final String mobLevel = lmEntity.isLevelled() ? String.valueOf(lmEntity.getMobLevel()) : "0"; + + String entityName = lmEntity.getTypeName(); + if (ExternalCompatibilityManager.hasMythicMobsInstalled() + && ExternalCompatibilityManager.isMythicMob(lmEntity)) { + entityName = ExternalCompatibilityManager.getMythicMobInternalName(lmEntity); + } + + final String message = String.format( + "Spawn distance is %s for: %s (lvl %s %s) in %s, %s", + Utils.round(distance, 1), + entityName, + mobLevel, + lmEntity.getNameIfBaby(), + lmEntity.getWorldName(), + locationStr); + + lmEntity.free(); + sender.sendMessage(message); + } + private void showPlayerLocation(final @NotNull CommandSender sender){ if (!(sender instanceof final Player player)){ sender.sendMessage("The command must be run by a player"); @@ -118,7 +172,7 @@ private void doNbtDump(final @NotNull CommandSender sender, final String @NotNul lmEntity.getLivingEntity().getLocation().getBlockX(), lmEntity.getLivingEntity().getLocation().getBlockY(), lmEntity.getLivingEntity().getLocation().getBlockZ()); - final String mobLevel = lmEntity.isLevelled() ? lmEntity.getMobLevel() + "" : "0"; + final String mobLevel = lmEntity.isLevelled() ? String.valueOf(lmEntity.getMobLevel()) : "0"; final String message = String.format( "Showing nbt dump for: %s (lvl %s %s) in %s, %s\n%s", @@ -154,7 +208,7 @@ public List parseTabCompletions(final LevelledMobs main, final CommandSe final String @NotNull [] args) { if (args.length <= 2) { - return List.of("create", "chunk_kill_count", "mylocation", "nbt_dump"); + return List.of("create", "chunk_kill_count", "mylocation", "nbt_dump", "spawn_distance"); } if ("chunk_kill_count".equalsIgnoreCase(args[1])) { return List.of("reset"); diff --git a/src/main/java/me/lokka30/levelledmobs/commands/subcommands/RulesSubcommand.java b/src/main/java/me/lokka30/levelledmobs/commands/subcommands/RulesSubcommand.java index 3b5cdcf09..11cc36b03 100644 --- a/src/main/java/me/lokka30/levelledmobs/commands/subcommands/RulesSubcommand.java +++ b/src/main/java/me/lokka30/levelledmobs/commands/subcommands/RulesSubcommand.java @@ -361,7 +361,7 @@ private void showEffectiveRules(@NotNull final Player player, final boolean show lmEntity.getLivingEntity().getLocation().getBlockX(), lmEntity.getLivingEntity().getLocation().getBlockY(), lmEntity.getLivingEntity().getLocation().getBlockZ()); - final String mobLevel = lmEntity.isLevelled() ? lmEntity.getMobLevel() + "" : "0"; + final String mobLevel = lmEntity.isLevelled() ? String.valueOf(lmEntity.getMobLevel()) : "0"; final List messages = getMessage("command.levelledmobs.rules.effective-rules", new String[]{"%mobname%", "%entitytype%", "%location%", "%world%", "%level%"}, new String[]{entityName, lmEntity.getNameIfBaby(), locationStr, lmEntity.getWorldName(), diff --git a/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropInstance.java b/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropInstance.java index 9402ad5dc..25772f663 100644 --- a/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropInstance.java +++ b/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropInstance.java @@ -28,7 +28,7 @@ public CustomDropInstance(final @Nullable EntityType associatedMob) { this.isBabyMob = false; } - CustomDropInstance(final @NotNull EntityType associatedMob, final boolean isBabyMob) { + public CustomDropInstance(final @NotNull EntityType associatedMob, final boolean isBabyMob) { this.associatedMob = associatedMob; this.entityGroup = null; this.customItems = new LinkedList<>(); @@ -36,7 +36,7 @@ public CustomDropInstance(final @Nullable EntityType associatedMob) { this.isBabyMob = isBabyMob; } - CustomDropInstance(final @NotNull CustomUniversalGroups entityGroup) { + public CustomDropInstance(final @NotNull CustomUniversalGroups entityGroup) { this.associatedMob = null; this.entityGroup = entityGroup; this.customItems = new LinkedList<>(); diff --git a/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsHandler.java b/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsHandler.java index 16168ad10..b87fd2c5c 100644 --- a/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsHandler.java +++ b/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsHandler.java @@ -533,6 +533,7 @@ && isCustomDropsDebuggingEnabled()) { return; } + final boolean runOnSpawn = dropBase instanceof CustomCommand cc && cc.runOnSpawn; boolean didNotMakeChance = false; float chanceRole = 0.0F; @@ -553,14 +554,14 @@ && hasReachedChunkKillLimit(info.lmEntity)) { return; } - if (!info.equippedOnly && dropBase.chance < 1.0) { + if ((!info.equippedOnly || runOnSpawn) && dropBase.chance < 1.0) { chanceRole = (float) ThreadLocalRandom.current().nextInt(0, 100001) * 0.00001F; if (1.0F - chanceRole >= dropBase.chance) { didNotMakeChance = true; } } - if (didNotMakeChance && !info.equippedOnly && isCustomDropsDebuggingEnabled()) { + if (didNotMakeChance && (!info.equippedOnly || runOnSpawn) && isCustomDropsDebuggingEnabled()) { if (dropBase instanceof final CustomDropItem dropItem) { final ItemStack itemStack = info.deathByFire ? getCookedVariantOfMeat(dropItem.getItemStack()) @@ -574,8 +575,14 @@ && hasReachedChunkKillLimit(info.lmEntity)) { ); } } + else if (isCustomDropsDebuggingEnabled()){ + info.addDebugMessage(String.format( + "&8 - &7Custom command&7, chance: &b%s&7, chanceRole: &b%s&7, executed: &bfalse&7.", + dropBase.chance, Utils.round(chanceRole, 4)) + ); + } } - if (!info.equippedOnly && didNotMakeChance) { + if ((!info.equippedOnly || runOnSpawn) && didNotMakeChance) { return; } @@ -987,7 +994,7 @@ private boolean madePlayerLevelRequirement(final @NotNull CustomDropProcessingIn } else { //levelToUse = main.levelManager.getPlayerLevelSourceNumber(info.mobKiller, variableToUse); final PlayerLevelSourceResult result = main.levelManager.getPlayerLevelSourceNumber( - info.mobKiller, variableToUse); + info.mobKiller, info.lmEntity, variableToUse); levelToUse = result.isNumericResult ? result.numericResult : 1; info.playerLevelVariableCache.put(variableToUse, levelToUse); } diff --git a/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsParser.java b/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsParser.java index 1d3c90c5f..5990a87c1 100644 --- a/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsParser.java +++ b/src/main/java/me/lokka30/levelledmobs/customdrops/CustomDropsParser.java @@ -1077,8 +1077,9 @@ private void showCustomDropsDebugInfo(final StringBuilder sbMain) { item.getMaterial() != null ? item.getMaterial().toString() : "(unknown)"; sb.append(String.format(" &b%s&r, amount: &b%s&r, chance: &b%s&r", itemMaterial, item.getAmountAsString(), baseItem.chance)); - } else { - sb.append(String.format(" COMMAND, chance: &b%s&r", baseItem.chance)); + } else if (baseItem instanceof final CustomCommand cc) { + sb.append(String.format(" COMMAND, chance: &b%s&r, run-on-spawn: %s, run-on-death: %s", + baseItem.chance, cc.runOnSpawn, cc.runOnDeath)); } if (baseItem.minLevel > -1) { diff --git a/src/main/java/me/lokka30/levelledmobs/listeners/paper/PlayerDeathListener.java b/src/main/java/me/lokka30/levelledmobs/listeners/paper/PlayerDeathListener.java index 08c59ccd4..b36c75a33 100644 --- a/src/main/java/me/lokka30/levelledmobs/listeners/paper/PlayerDeathListener.java +++ b/src/main/java/me/lokka30/levelledmobs/listeners/paper/PlayerDeathListener.java @@ -86,6 +86,7 @@ public boolean onPlayerDeathEvent(final @NotNull PlayerDeathEvent event) { return lmKiller; } + lmKiller.setPlayerForLevelling(event.getPlayer()); final NametagResult mobNametag = main.levelManager.getNametag(lmKiller, true, true); if (mobNametag.getNametag() != null && mobNametag.getNametag().isEmpty()){ this.shouldCancelEvent = true; diff --git a/src/main/java/me/lokka30/levelledmobs/managers/LevelManager.java b/src/main/java/me/lokka30/levelledmobs/managers/LevelManager.java index 2521fa79c..479024f80 100644 --- a/src/main/java/me/lokka30/levelledmobs/managers/LevelManager.java +++ b/src/main/java/me/lokka30/levelledmobs/managers/LevelManager.java @@ -22,6 +22,8 @@ import java.util.Objects; import java.util.TreeMap; import java.util.WeakHashMap; +import java.util.concurrent.ThreadLocalRandom; + import me.lokka30.levelledmobs.LevelInterface; import me.lokka30.levelledmobs.LevelledMobs; import me.lokka30.levelledmobs.LivingEntityInterface; @@ -257,7 +259,7 @@ private int generateRandomLevel(RandomLevellingStrategy randomLevelling, final i final boolean usePlayerMax = options.usePlayerMaxLevel != null && options.usePlayerMaxLevel; final boolean matchPlayerLvl = options.matchPlayerLevel != null && options.matchPlayerLevel; final PlayerLevelSourceResult playerLevelSourceResult = getPlayerLevelSourceNumber( - lmEntity.getPlayerForLevelling(), variableToUse); + lmEntity.getPlayerForLevelling(), lmEntity, variableToUse); final double origLevelSource = playerLevelSourceResult.isNumericResult ? playerLevelSourceResult.numericResult : 1; @@ -318,6 +320,16 @@ private int generateRandomLevel(RandomLevellingStrategy randomLevelling, final i } } + String varianceDebug = ""; + if (playerLevelSourceResult.randomVarianceResult != null){ + results[1] += playerLevelSourceResult.randomVarianceResult; + if (results[1] < 1) + results[1] = 1; + if (results[0] > results[1]) + results[0] = results[1]; + varianceDebug = String.format(", var: %s", playerLevelSourceResult.randomVarianceResult); + } + if (options.levelCap != null) { if (results[0] > options.levelCap) { results[0] = options.levelCap; @@ -332,27 +344,27 @@ private int generateRandomLevel(RandomLevellingStrategy randomLevelling, final i if (tierMatched == null) { Utils.debugLog(main, DebugType.PLAYER_LEVELLING, String.format( - "mob: %s, player: %s, lvl-src: %s%s, lvl-scale: %s, %sresult: %s", - lmEntity.getNameIfBaby(), player.getName(), origLevelSource, homeName, levelSource, - capDisplay, Arrays.toString(results))); + "mob: %s, player: %s, lvl-src: %s%s%s, lvl-scale: %s, %sresult: %s", + lmEntity.getNameIfBaby(), player.getName(), origLevelSource, homeName, + varianceDebug, levelSource, capDisplay, Arrays.toString(results))); } else { if (playerLevelSourceResult.isNumericResult) { Utils.debugLog(main, DebugType.PLAYER_LEVELLING, String.format( - "mob: %s, player: %s, lvl-src: %s%s, lvl-scale: %s, tier: %s, %sresult: %s", + "mob: %s, player: %s, lvl-src: %s%s%s, lvl-scale: %s, tier: %s, %sresult: %s", lmEntity.getNameIfBaby(), player.getName(), origLevelSource, homeName, - levelSource, tierMatched, capDisplay, Arrays.toString(results))); + varianceDebug, levelSource, tierMatched, capDisplay, Arrays.toString(results))); } else { Utils.debugLog(main, DebugType.PLAYER_LEVELLING, String.format( - "mob: %s, player: %s, lvl-src: '%s', tier: %s, %sresult: %s", + "mob: %s, player: %s, lvl-src: '%s'%s, tier: %s, %sresult: %s", lmEntity.getNameIfBaby(), player.getName(), - playerLevelSourceResult.stringResult, tierMatched, capDisplay, - Arrays.toString(results))); + playerLevelSourceResult.stringResult, varianceDebug, tierMatched, + capDisplay, Arrays.toString(results))); } } if (options.recheckPlayers != null && options.recheckPlayers) { final String numberOrString = playerLevelSourceResult.isNumericResult ? - playerLevelSourceResult.numericResult + "" : playerLevelSourceResult.stringResult; + String.valueOf(playerLevelSourceResult.numericResult) : playerLevelSourceResult.stringResult; if (numberOrString != null) lmEntity.getPDC().set(main.namespacedKeys.playerLevellingSourceNumber, PersistentDataType.STRING, numberOrString); } @@ -362,7 +374,7 @@ private int generateRandomLevel(RandomLevellingStrategy randomLevelling, final i } public @NotNull PlayerLevelSourceResult getPlayerLevelSourceNumber(final @Nullable Player player, - final @NotNull String variableToUse) { + final @NotNull LivingEntityWrapper lmEntity ,final @NotNull String variableToUse) { if (player == null) { return new PlayerLevelSourceResult(1); } @@ -471,6 +483,14 @@ private int generateRandomLevel(RandomLevellingStrategy randomLevelling, final i } } + final Integer maxRandomVariance = main.rulesManager.getRuleMaxRandomVariance(lmEntity); + if (maxRandomVariance != null){ + sourceResult.randomVarianceResult = ThreadLocalRandom.current().nextInt(0, maxRandomVariance + 1); + if (ThreadLocalRandom.current().nextBoolean()){ + sourceResult.randomVarianceResult *= -1; + } + } + sourceResult.numericResult = (int) Math.round(origLevelSource); return sourceResult; } @@ -709,6 +729,9 @@ public int getLevelledExpDrops(@NotNull final LivingEntityWrapper lmEntity, fina final String deathMessage = main.rulesManager.getDeathMessage(lmEntity); if (deathMessage != null && !deathMessage.isEmpty()){ nametag = deathMessage.replace("%death_nametag%", nametag); + final Player player = lmEntity.getPlayerForLevelling(); + nametag = nametag.replace("%player%", player != null ? player.getName() : ""); + nametag = replaceStringPlaceholders(nametag, lmEntity, true); preserveMobName = false; hadCustomDeathMessage = true; } @@ -1192,9 +1215,9 @@ private boolean doesMobNeedRelevelling(final @NotNull LivingEntityWrapper lmEnti } final String variableToUse = Utils.isNullOrEmpty(opts.variable) ? "%level%" : opts.variable; - PlayerLevelSourceResult result = getPlayerLevelSourceNumber(player, variableToUse); + PlayerLevelSourceResult result = getPlayerLevelSourceNumber(player, lmEntity, variableToUse); final String sourceNumberStr = result.isNumericResult ? - result.numericResult + "" : result.stringResult; + String.valueOf(result.numericResult) : result.stringResult; return !previousResult.equals(sourceNumberStr); } diff --git a/src/main/java/me/lokka30/levelledmobs/managers/MobDataManager.java b/src/main/java/me/lokka30/levelledmobs/managers/MobDataManager.java index 871f7fe3a..fcd564d05 100644 --- a/src/main/java/me/lokka30/levelledmobs/managers/MobDataManager.java +++ b/src/main/java/me/lokka30/levelledmobs/managers/MobDataManager.java @@ -25,7 +25,6 @@ import org.bukkit.attribute.AttributeModifier; import org.bukkit.entity.EntityType; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * Manages data related to various mob levelling @@ -60,23 +59,6 @@ public MobDataManager(final LevelledMobs main) { private final LevelledMobs main; public final Map vanillaMultiplierNames; - @Nullable private Object getAttributeDefaultValue(@NotNull final LivingEntityWrapper lmEntity, - final Attribute attribute) { - if (lmEntity.isMobTamed()) { - // if the tamed variant in the cfg then use it, otherwise check for untamed path - final String tamedPath = "TAMED_" + lmEntity.getTypeName() + "." + attribute; - if (main.attributesCfg.contains(tamedPath)) { - return main.attributesCfg.get(tamedPath); - } - } - - final String path = lmEntity.getTypeName() + "." + attribute; - - return main.attributesCfg.contains(path) ? - main.attributesCfg.get(path) : - null; - } - final boolean isLevelledDropManaged(final EntityType entityType, @NotNull final Material material) { // Head drops @@ -92,12 +74,8 @@ final boolean isLevelledDropManaged(final EntityType entityType, void setAdditionsForLevel(@NotNull final LivingEntityWrapper lmEntity, final @NotNull Attribute attribute, final Addition addition) { - final boolean useStaticValues = main.helperSettings.getBoolean(main.settingsCfg, - "attributes-use-preset-base-values"); - final float defaultValue = useStaticValues ? - (float) Objects.requireNonNull(getAttributeDefaultValue(lmEntity, attribute)) : - (float) Objects.requireNonNull(lmEntity.getLivingEntity().getAttribute(attribute)) - .getBaseValue(); + final float defaultValue = (float) Objects.requireNonNull(lmEntity.getLivingEntity() + .getAttribute(attribute)).getBaseValue(); final float additionValue = getAdditionsForLevel(lmEntity, addition, defaultValue); if (additionValue == 0.0f) { @@ -145,20 +123,12 @@ void setAdditionsForLevel(@NotNull final LivingEntityWrapper lmEntity, attrib.removeModifier(existingMod); } + debugLog(main, ATTRIBUTE_MULTIPLIERS, + String.format("%s (%s): attrib: %s, base: %s, addtion: %s", + lmEntity.getNameIfBaby(), lmEntity.getMobLevel(), attribute.name(), + Utils.round(attrib.getBaseValue(), 3), Utils.round(additionValue, 3))); + attrib.addModifier(mod); - if (useStaticValues) { - debugLog(main, ATTRIBUTE_MULTIPLIERS, - String.format("%s (%s): attrib: %s, base: %s, new base value: %s", - lmEntity.getNameIfBaby(), lmEntity.getMobLevel(), attribute.name(), - Utils.round(attrib.getBaseValue(), 3), Utils.round(defaultValue, 3))); - attrib.setBaseValue(defaultValue); - } else { - debugLog(main, ATTRIBUTE_MULTIPLIERS, - String.format("%s (%s): attrib: %s, base: %s, addtion: %s", - lmEntity.getNameIfBaby(), lmEntity.getMobLevel(), attribute.name(), - Utils.round(attrib.getBaseValue(), 3), Utils.round(additionValue, 3))); - attrib.addModifier(mod); - } // MAX_HEALTH specific: set health to max health if (attribute == Attribute.GENERIC_MAX_HEALTH) { diff --git a/src/main/java/me/lokka30/levelledmobs/managers/MobsQueueManager.java b/src/main/java/me/lokka30/levelledmobs/managers/MobsQueueManager.java index dc340bdfe..32f43e9dd 100644 --- a/src/main/java/me/lokka30/levelledmobs/managers/MobsQueueManager.java +++ b/src/main/java/me/lokka30/levelledmobs/managers/MobsQueueManager.java @@ -41,7 +41,7 @@ public void start() { @Override public void run() { try { - main(); + mainThread(); } catch (final InterruptedException ignored) { isRunning = false; } @@ -65,7 +65,7 @@ public void addToQueue(final @NotNull QueueItem item) { this.queue.offer(item); } - private void main() throws InterruptedException { + private void mainThread() throws InterruptedException { while (doThread) { final QueueItem item = queue.poll(200, TimeUnit.MILLISECONDS); diff --git a/src/main/java/me/lokka30/levelledmobs/managers/NametagQueueManager.java b/src/main/java/me/lokka30/levelledmobs/managers/NametagQueueManager.java index 0390022bc..00ae67c40 100644 --- a/src/main/java/me/lokka30/levelledmobs/managers/NametagQueueManager.java +++ b/src/main/java/me/lokka30/levelledmobs/managers/NametagQueueManager.java @@ -70,7 +70,7 @@ public void start() { @Override public void run() { try { - main(); + mainThread(); } catch (final InterruptedException ignored) { isRunning = false; } @@ -99,7 +99,7 @@ void addToQueue(final @NotNull QueueItem item) { queue.offer(item); } - private void main() throws InterruptedException { + private void mainThread() throws InterruptedException { while (doThread) { final QueueItem item = queue.poll(200, TimeUnit.MILLISECONDS); diff --git a/src/main/java/me/lokka30/levelledmobs/nametag/Definitions.java b/src/main/java/me/lokka30/levelledmobs/nametag/Definitions.java index 298c7280a..fc7abba78 100644 --- a/src/main/java/me/lokka30/levelledmobs/nametag/Definitions.java +++ b/src/main/java/me/lokka30/levelledmobs/nametag/Definitions.java @@ -182,7 +182,7 @@ private void buildClasses() throws ClassNotFoundException { this.clazz_EntityTypes = Class.forName( "net.minecraft.world.entity.EntityTypes"); - if (hasKiori){ + if (hasKiori && ver.getMinecraftVersion() >= 1.18){ try{ Class.forName("net.kyori.adventure.text.minimessage.MiniMessage"); this.hasMiniMessage = true; diff --git a/src/main/java/me/lokka30/levelledmobs/nametag/NmsNametagSender.java b/src/main/java/me/lokka30/levelledmobs/nametag/NmsNametagSender.java index 2a215e24c..88392a148 100644 --- a/src/main/java/me/lokka30/levelledmobs/nametag/NmsNametagSender.java +++ b/src/main/java/me/lokka30/levelledmobs/nametag/NmsNametagSender.java @@ -9,7 +9,6 @@ import me.lokka30.levelledmobs.LevelledMobs; import me.lokka30.levelledmobs.result.NametagResult; -import me.lokka30.levelledmobs.util.Utils; import me.lokka30.microlib.messaging.MessageUtils; import org.bukkit.Bukkit; import org.bukkit.entity.LivingEntity; diff --git a/src/main/java/me/lokka30/levelledmobs/result/PlayerLevelSourceResult.java b/src/main/java/me/lokka30/levelledmobs/result/PlayerLevelSourceResult.java index 435fff459..18de21eb1 100644 --- a/src/main/java/me/lokka30/levelledmobs/result/PlayerLevelSourceResult.java +++ b/src/main/java/me/lokka30/levelledmobs/result/PlayerLevelSourceResult.java @@ -19,6 +19,7 @@ public PlayerLevelSourceResult(final String stringResult) { } public int numericResult; + public Integer randomVarianceResult; public String stringResult; public final boolean isNumericResult; public String homeNameUsed; diff --git a/src/main/java/me/lokka30/levelledmobs/rules/RulesManager.java b/src/main/java/me/lokka30/levelledmobs/rules/RulesManager.java index 63c20ad2e..8913f21b7 100644 --- a/src/main/java/me/lokka30/levelledmobs/rules/RulesManager.java +++ b/src/main/java/me/lokka30/levelledmobs/rules/RulesManager.java @@ -82,6 +82,7 @@ public boolean getRuleIsWorldAllowedInAnyRule(final @Nullable World world) { return result; } + @SuppressWarnings("unused") public void addCustomRule(final @Nullable RuleInfo ri){ if (ri == null) return; @@ -118,8 +119,8 @@ public double getRuleSunlightBurnIntensity(final @NotNull LivingEntityWrapper lm return result; } - public int getRuleMaxRandomVariance(@NotNull final LivingEntityWrapper lmEntity) { - int result = 0; + public @Nullable Integer getRuleMaxRandomVariance(@NotNull final LivingEntityWrapper lmEntity) { + Integer result = null; for (final RuleInfo ruleInfo : lmEntity.getApplicableRules()) { if (ruleInfo.maxRandomVariance != null) { diff --git a/src/main/java/me/lokka30/levelledmobs/rules/RulesParsingManager.java b/src/main/java/me/lokka30/levelledmobs/rules/RulesParsingManager.java index d832626d2..79f3a8c4e 100644 --- a/src/main/java/me/lokka30/levelledmobs/rules/RulesParsingManager.java +++ b/src/main/java/me/lokka30/levelledmobs/rules/RulesParsingManager.java @@ -1039,16 +1039,7 @@ private void parseStrategies(final @Nullable ConfigurationSection cs) { spawnDistanceStrategy.startDistance = ymlHelper.getInt2(cs_SpawnDistance, "start-distance", spawnDistanceStrategy.startDistance); - if (cs_SpawnDistance.get( - ymlHelper.getKeyNameFromConfig(cs_SpawnDistance, "spawn-location.x")) != null) { - spawnDistanceStrategy.spawnLocation_X = parseOptionalSpawnCoordinate( - ymlHelper.getKeyNameFromConfig(cs, "spawn-location.x"), cs_SpawnDistance); - } - if (cs_SpawnDistance.get( - ymlHelper.getKeyNameFromConfig(cs_SpawnDistance, "spawn-location.z")) != null) { - spawnDistanceStrategy.spawnLocation_Z = parseOptionalSpawnCoordinate( - ymlHelper.getKeyNameFromConfig(cs, "spawn-location.z"), cs_SpawnDistance); - } + parseOptionalSpawnCoordinate(cs_SpawnDistance, spawnDistanceStrategy); if (ymlHelper.getString(cs_SpawnDistance, "blended-levelling") != null) { parseBlendedLevelling(objTo_CS(cs_SpawnDistance, "blended-levelling"), @@ -1071,10 +1062,17 @@ private void parseWeightedRandom(final @NotNull ConfigurationSection cs){ final String useWeightedRandom = cs.getString("weighted-random"); // weighted-random: true - if ("true".equalsIgnoreCase(useWeightedRandom)) { + final boolean isDisabled = "false".equalsIgnoreCase(useWeightedRandom); + if (isDisabled || "true".equalsIgnoreCase(useWeightedRandom)) { final RandomLevellingStrategy randomLevelling = new RandomLevellingStrategy(); - randomLevelling.autoGenerate = true; + if (isDisabled){ + randomLevelling.enabled = false; + } + else{ + randomLevelling.autoGenerate = true; + } this.parsingInfo.levellingStrategy = randomLevelling; + return; } @@ -1320,16 +1318,20 @@ private void parseBlendedLevelling(final ConfigurationSection cs, spawnDistanceStrategy.scaleDownward); } - private @Nullable Integer parseOptionalSpawnCoordinate(final @NotNull String path, - final @NotNull ConfigurationSection cs) { - if (cs.getString(path) == null) { - return null; + private void parseOptionalSpawnCoordinate(final @NotNull ConfigurationSection cs, + final @NotNull SpawnDistanceStrategy sds) { + final ConfigurationSection spawnLocation = objTo_CS_2(cs.get("spawn-location")); + if (spawnLocation == null){ + return; } - if ("default".equalsIgnoreCase(cs.getString(path))) { - return null; + + if (!"default".equalsIgnoreCase(spawnLocation.getString("x"))) { + sds.spawnLocation_X = spawnLocation.getInt("x"); } - return (cs.getInt(path)); + if (!"default".equalsIgnoreCase(spawnLocation.getString("z"))) { + sds.spawnLocation_Z = spawnLocation.getInt("z"); + } } private void parseFineTuning(final @Nullable ConfigurationSection cs) { diff --git a/src/main/java/me/lokka30/levelledmobs/rules/strategies/RandomLevellingStrategy.java b/src/main/java/me/lokka30/levelledmobs/rules/strategies/RandomLevellingStrategy.java index be9611bd5..50685e411 100644 --- a/src/main/java/me/lokka30/levelledmobs/rules/strategies/RandomLevellingStrategy.java +++ b/src/main/java/me/lokka30/levelledmobs/rules/strategies/RandomLevellingStrategy.java @@ -22,8 +22,9 @@ * @since 3.1.0 */ public class RandomLevellingStrategy implements LevellingStrategy, Cloneable { - public RandomLevellingStrategy(){ + public RandomLevellingStrategy() { this.weightedRandom = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + this.enabled = true; } public final @NotNull Map weightedRandom; @@ -32,6 +33,7 @@ public RandomLevellingStrategy(){ private int minLevel; private int maxLevel; public boolean autoGenerate; + public boolean enabled; public int generateLevel(final int minLevel, final int maxLevel) { return generateLevel(null, minLevel, maxLevel); @@ -174,7 +176,7 @@ public void mergeRule(final LevellingStrategy levellingStrategy) { return; } - if (randomLevelling.doMerge) { + if (randomLevelling.doMerge && randomLevelling.enabled) { this.weightedRandom.putAll(randomLevelling.weightedRandom); } } diff --git a/src/main/java/me/lokka30/levelledmobs/rules/strategies/SpawnDistanceStrategy.java b/src/main/java/me/lokka30/levelledmobs/rules/strategies/SpawnDistanceStrategy.java index d8f274b39..cb9e0c43f 100644 --- a/src/main/java/me/lokka30/levelledmobs/rules/strategies/SpawnDistanceStrategy.java +++ b/src/main/java/me/lokka30/levelledmobs/rules/strategies/SpawnDistanceStrategy.java @@ -112,9 +112,10 @@ public int generateLevel(final @Nullable LivingEntityWrapper lmEntity, final int final int distanceFromSpawn = (int) spawnLocation.distance(lmEntity.getLocation()); final int levelDistance = Math.max(distanceFromSpawn - startDistance, 0); - int variance = lmEntity.getMainInstance().rulesManager.getRuleMaxRandomVariance(lmEntity); - if (variance > 0) { - variance = ThreadLocalRandom.current().nextInt(0, variance + 1); + final Integer variance = lmEntity.getMainInstance().rulesManager.getRuleMaxRandomVariance(lmEntity); + int varianceAdded = 0; + if (variance != null) { + varianceAdded = ThreadLocalRandom.current().nextInt(0, variance + 1); } int increaseLevelDistance = @@ -125,7 +126,7 @@ public int generateLevel(final @Nullable LivingEntityWrapper lmEntity, final int //Get the level thats meant to be at a given distance final int spawnDistanceAssignment = Math.min( - (levelDistance / increaseLevelDistance) + minLevel + variance, maxLevel); + (levelDistance / increaseLevelDistance) + minLevel + varianceAdded, maxLevel); if (this.blendedLevellingEnabled == null || !this.blendedLevellingEnabled) { return spawnDistanceAssignment; } @@ -159,9 +160,9 @@ private int generateBlendedLevel(@NotNull final LivingEntityWrapper lmEntity, result = result < 0.0 ? Math.ceil(result) + spawnDistanceLevelAssignment : Math.floor(result) + spawnDistanceLevelAssignment; - final int variance = lmEntity.getMainInstance().rulesManager.getRuleMaxRandomVariance( + final Integer variance = lmEntity.getMainInstance().rulesManager.getRuleMaxRandomVariance( lmEntity); - if (variance > 0) { + if (variance != null && variance > 0) { result += ThreadLocalRandom.current().nextInt(0, variance + 1); } diff --git a/src/main/java/me/lokka30/levelledmobs/rules/strategies/YDistanceStrategy.java b/src/main/java/me/lokka30/levelledmobs/rules/strategies/YDistanceStrategy.java index 8a41e602f..3d0c0f5d0 100644 --- a/src/main/java/me/lokka30/levelledmobs/rules/strategies/YDistanceStrategy.java +++ b/src/main/java/me/lokka30/levelledmobs/rules/strategies/YDistanceStrategy.java @@ -87,9 +87,9 @@ public int generateLevel(final @Nullable LivingEntityWrapper lmEntity, final int private int getVariance(@NotNull final LivingEntityWrapper lmEntity, final boolean isAtMaxLevel) { - final int variance = lmEntity.getMainInstance().rulesManager.getRuleMaxRandomVariance( + final Integer variance = lmEntity.getMainInstance().rulesManager.getRuleMaxRandomVariance( lmEntity); - if (variance == 0) { + if (variance == null || variance == 0) { return 0; } diff --git a/src/main/resources/defaultAttributes.yml b/src/main/resources/defaultAttributes.yml deleted file mode 100644 index 3103fc1db..000000000 --- a/src/main/resources/defaultAttributes.yml +++ /dev/null @@ -1,650 +0,0 @@ -# This is NOT a configuration file! All changes to this file will not take effect and be reset! -GENERATION_INFO: '[Date: 28/06/2021 09:50:57], [ServerVersion: git-Paper-53 (MC: 1.17)]' -ELDER_GUARDIAN: - GENERIC_MAX_HEALTH: 80.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 8.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -WITHER_SKELETON: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 4.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -STRAY: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -HUSK: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 35.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 2.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - ZOMBIE_SPAWN_REINFORCEMENTS: 0.07773360634627124 -ZOMBIE_VILLAGER: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 35.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 2.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - ZOMBIE_SPAWN_REINFORCEMENTS: 0.0223845313911179 -SKELETON_HORSE: - GENERIC_MAX_HEALTH: 15.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.7856159188376174 -ZOMBIE_HORSE: - GENERIC_MAX_HEALTH: 15.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.8605999557318784 -ARMOR_STAND: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -DONKEY: - GENERIC_MAX_HEALTH: 22.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.17499999701976776 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.5 -MULE: - GENERIC_MAX_HEALTH: 19.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.17499999701976776 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.5 -EVOKER: - GENERIC_MAX_HEALTH: 24.0 - GENERIC_FOLLOW_RANGE: 12.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.5 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -VEX: - GENERIC_MAX_HEALTH: 14.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_DAMAGE: 4.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -VINDICATOR: - GENERIC_MAX_HEALTH: 24.0 - GENERIC_FOLLOW_RANGE: 12.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.3499999940395355 - GENERIC_ATTACK_DAMAGE: 5.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -ILLUSIONER: - GENERIC_MAX_HEALTH: 32.0 - GENERIC_FOLLOW_RANGE: 18.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.5 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -CREEPER: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SKELETON: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SPIDER: - GENERIC_MAX_HEALTH: 16.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -GIANT: - GENERIC_MAX_HEALTH: 100.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.5 - GENERIC_ATTACK_DAMAGE: 50.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -ZOMBIE: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 35.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 2.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - ZOMBIE_SPAWN_REINFORCEMENTS: 0.06097764643698858 -SLIME: - GENERIC_MAX_HEALTH: 1.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 1.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -GHAST: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 100.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -ZOMBIFIED_PIGLIN: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 35.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_DAMAGE: 5.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 2.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - ZOMBIE_SPAWN_REINFORCEMENTS: 0.0 -ENDERMAN: - GENERIC_MAX_HEALTH: 40.0 - GENERIC_FOLLOW_RANGE: 64.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 7.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -CAVE_SPIDER: - GENERIC_MAX_HEALTH: 12.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SILVERFISH: - GENERIC_MAX_HEALTH: 8.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 1.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -BLAZE: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 48.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_DAMAGE: 6.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -MAGMA_CUBE: - GENERIC_MAX_HEALTH: 1.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 1.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 3.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -ENDER_DRAGON: - GENERIC_MAX_HEALTH: 200.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -WITHER: - GENERIC_MAX_HEALTH: 300.0 - GENERIC_FOLLOW_RANGE: 40.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.6000000238418579 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 4.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -BAT: - GENERIC_MAX_HEALTH: 6.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -WITCH: - GENERIC_MAX_HEALTH: 26.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -ENDERMITE: - GENERIC_MAX_HEALTH: 8.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -GUARDIAN: - GENERIC_MAX_HEALTH: 30.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.5 - GENERIC_ATTACK_DAMAGE: 6.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SHULKER: - GENERIC_MAX_HEALTH: 30.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PIG: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SHEEP: - GENERIC_MAX_HEALTH: 8.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -COW: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -CHICKEN: - GENERIC_MAX_HEALTH: 4.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SQUID: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -WOLF: - GENERIC_MAX_HEALTH: 8.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 4.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -MUSHROOM_COW: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SNOWMAN: - GENERIC_MAX_HEALTH: 4.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -OCELOT: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -IRON_GOLEM: - GENERIC_MAX_HEALTH: 100.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 1.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 15.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -HORSE: - GENERIC_MAX_HEALTH: 19.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.2996117270875736 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.7759714942836219 -RABBIT: - GENERIC_MAX_HEALTH: 3.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -POLAR_BEAR: - GENERIC_MAX_HEALTH: 30.0 - GENERIC_FOLLOW_RANGE: 20.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_DAMAGE: 6.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -LLAMA: - GENERIC_MAX_HEALTH: 17.0 - GENERIC_FOLLOW_RANGE: 40.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.17499999701976776 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.5 -PARROT: - GENERIC_MAX_HEALTH: 6.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_FLYING_SPEED: 0.4000000059604645 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -VILLAGER: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 48.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.5 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -TURTLE: - GENERIC_MAX_HEALTH: 30.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.25 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PHANTOM: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -COD: - GENERIC_MAX_HEALTH: 3.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -SALMON: - GENERIC_MAX_HEALTH: 3.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PUFFERFISH: - GENERIC_MAX_HEALTH: 3.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -TROPICAL_FISH: - GENERIC_MAX_HEALTH: 3.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -DROWNED: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 35.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.23000000417232513 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 2.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - ZOMBIE_SPAWN_REINFORCEMENTS: 0.01612167090595561 -DOLPHIN: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 1.2000000476837158 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -CAT: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 3.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PANDA: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.15000000596046448 - GENERIC_ATTACK_DAMAGE: 6.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PILLAGER: - GENERIC_MAX_HEALTH: 24.0 - GENERIC_FOLLOW_RANGE: 32.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.3499999940395355 - GENERIC_ATTACK_DAMAGE: 5.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -RAVAGER: - GENERIC_MAX_HEALTH: 100.0 - GENERIC_FOLLOW_RANGE: 32.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.75 - GENERIC_MOVEMENT_SPEED: 0.3 - GENERIC_ATTACK_DAMAGE: 12.0 - GENERIC_ATTACK_KNOCKBACK: 1.5 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -TRADER_LLAMA: - GENERIC_MAX_HEALTH: 23.0 - GENERIC_FOLLOW_RANGE: 40.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.17499999701976776 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 - HORSE_JUMP_STRENGTH: 0.5 -WANDERING_TRADER: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -FOX: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 32.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -BEE: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 48.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_FLYING_SPEED: 0.6000000238418579 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -HOGLIN: - GENERIC_MAX_HEALTH: 40.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.6000000238418579 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 6.0 - GENERIC_ATTACK_KNOCKBACK: 1.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PIGLIN: - GENERIC_MAX_HEALTH: 16.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.3499999940395355 - GENERIC_ATTACK_DAMAGE: 5.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -STRIDER: - GENERIC_MAX_HEALTH: 20.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.17499999701976776 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -ZOGLIN: - GENERIC_MAX_HEALTH: 40.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.6000000238418579 - GENERIC_MOVEMENT_SPEED: 0.30000001192092896 - GENERIC_ATTACK_DAMAGE: 6.0 - GENERIC_ATTACK_KNOCKBACK: 1.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -PIGLIN_BRUTE: - GENERIC_MAX_HEALTH: 50.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.3499999940395355 - GENERIC_ATTACK_DAMAGE: 7.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -AXOLOTL: - GENERIC_MAX_HEALTH: 14.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 1.0 - GENERIC_ATTACK_DAMAGE: 2.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -GLOW_SQUID: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.699999988079071 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 -GOAT: - GENERIC_MAX_HEALTH: 10.0 - GENERIC_FOLLOW_RANGE: 16.0 - GENERIC_KNOCKBACK_RESISTANCE: 0.0 - GENERIC_MOVEMENT_SPEED: 0.20000000298023224 - GENERIC_ATTACK_DAMAGE: 1.0 - GENERIC_ATTACK_KNOCKBACK: 0.0 - GENERIC_ARMOR: 0.0 - GENERIC_ARMOR_TOUGHNESS: 0.0 diff --git a/src/main/resources/defaultDrops.yml b/src/main/resources/defaultDrops.yml index 3156e5e31..7b9f3cbdc 100644 --- a/src/main/resources/defaultDrops.yml +++ b/src/main/resources/defaultDrops.yml @@ -129,6 +129,7 @@ SQUID: MUSHROOM_COW: - LEATHER - BEEF + - COOKED_BEEF SNOWMAN: - SNOWBALL MAGMA_CUBE: @@ -184,8 +185,9 @@ RABBIT: WANDERING_TRADER: - POTION - MILK -GLOW_SQUID: # Needs verification. +GLOW_SQUID: - GLOW_INK_SAC -GOAT: # Needs verification. - - MUTTON - - COOKED_MUTTON \ No newline at end of file +GOAT: + - GOAT_HORN +WARDEN: + - SCULK_CATALYST \ No newline at end of file diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml index ffda4f6ad..e9d93ef39 100644 --- a/src/main/resources/settings.yml +++ b/src/main/resources/settings.yml @@ -32,34 +32,56 @@ # || ADVANCED USERS ONLY | DEBUG # || Do not touch this unless a LM developer tells you to. # || These settings print a lot of 'behind the scenes' -# || information about LevelledMobs' operations. +# || information about LevelledMobs' operations to the console. debug-entity-damage: false debug-misc: [ ] +# || This is a good update checker - it doesn't freeze +# || your server startup since it is asynchronous, it +# || only speaks if it found an update, and it only runs +# || once every server startup. Pointless to disable. +use-update-checker: true + +# || ADVANCED USERS ONLY +# || If your server software (e.g. Paper) has +# || the Adventure library in it, then LevelledMobs +# || will use it, so long this setting is enabled. +# || CraftBukkit and Spigot servers do not have +# || this library, although PaperMC servers and +# || all PaperMC forks (Airplane, etc) do. +# || It is recommended that you keep this enabled. +use-adventure: true + # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. -# || This setting controls the repeating asynchronous nametag -# || and levelling update tasks. -# || This controls the timing and distance from players -# || when the check is performed. This can be resource intensive -# || if you perform updates too frequently, or too far away. -async-task-update-period: 6 -async-task-max-blocks-from-player: 100 +# || If your server software (e.g. Paper) has the Adventure +# || Library in it, then you can change this to false and +# || use MiniMessage for nametag parsing. +use-legacy-serializer: true # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. -# || Customize the summon command limit -customize-summon-command-limit: 10 +# || This system controls the repeating asynchronous listener which +# || maintains the accuracy of levelling and nametag information. +# || This is very important and resource sensitive, so it is not +# || suggested to alter these settings without testing beforehand. +# || This system acts as a garbage collection and verification +# || mechanism, as well as a form of 'rechecking' entities to ensure +# || they follow the rules of the system. +async-task-update-period: 6 +async-task-max-blocks-from-player: 100 # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. -# || This setting controls the Custom Commands ratelimiter. -customcommand-amount-limit: 100 +# || Enables the on-spawn listener to apply levels to entities. +# || If false, entities will no longer be levelled when they spawn in. +level-mobs-upon-spawn: true # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. -# || Should nametag packets be ignored if the mob has died? -assert-entity-validity-with-nametag-packets: true +# || Enables the on-load listener to apply levels to entities once +# || a chunk has been loaded. If false, this listener will be disabled. +ensure-mobs-are-levelled-on-chunk-load: true # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. @@ -70,36 +92,49 @@ mob-process-delay: 0 # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. -# || Ensure mobs are levelled on chunk load? -ensure-mobs-are-levelled-on-chunk-load: true +# || Should nametag packets be ignored if the mob has died? +assert-entity-validity-with-nametag-packets: true -# || ADVANCED USERS ONLY -# || Do not touch this unless a LM developer tells you to. -# || Should mob attributes be based upon preset base-values? -attributes-use-preset-base-values: false +# || When player kill exceed amount of levelled mobs in +# || a chunk(within given period). Should we send message +# || to player to inform him? +exceed-kill-in-chunk-message: true + +# || This sets a hard limit on the number of entities +# || you can summon using the LevelledMobs summon command. +# || This is to prevent accidental crashes. +customize-summon-command-limit: 10 -# || ADVANCED USERS ONLY # || What is the max distance the summon command will # || spawn mobs away from players? summon-command-spawn-distance-from-player: 5 -# || Check for updates? -# || This is a good update checker - it doesn't freeze -# || your server startup since it is asynchronous, it -# || only speaks if it found an update, and it only runs -# || once every server startup. Pointless to disable. -use-update-checker: true +# || Do not touch this unless a LM developer tells you to. +# || This sets a hard limit on the number of times a command +# || being 'dropped' from the Custom Drops system can be +# || performed in a loop. This is to prevent accidental crashes. +customcommand-amount-limit: 100 + +# || When set to true, nametags will show the mob name +# || translated to your client language settings. +# || However some older or hacked clients do not support +# || this and will show the translation key instead. +use-translation-components: true + +# || These settings pertian to Player Levelling, which sets +# || the updating period for the Player Levelling tasks. +player-levelling-relevel-min-time: 5s + +# || This setting determines how far away an entity can be +# || for it to register under `%levelledmobs_mob-target%`. +nametag-placeholder-maxblocks: 30 # || What conditions should a mob have in order for the # || LevelledMobs kill command to 'skip' it (not kill the mob)? kill-skip-conditions: - - # || These ones are self-explanatory. nametagged: true tamed: true leashed: true - - # || If the mob is a zombie villager that is converting, skip. convertingZombieVillager: true # || Should mob heads be multiplied by LevelledMobs' @@ -108,43 +143,6 @@ kill-skip-conditions: # || by default as to not harm their economies. mobs-multiply-head-drops: false -# || When player kill exceed amount of levelled mobs in -# || a chunk(within given period). Should we send message -# || to player to inform him? -exceed-kill-in-chunk-message: true - -# || ADVANCED USERS ONLY -# || Do not touch this unless a LM developer tells you to. -# || These settings pertian to Player Levelling, obviously -# || this only affects LM if you are using Player Levelling. -player-levelling-relevel-min-time: 5s - -# || This setting determines how far away an entity can be -# || for it to register under `%levelledmobs_mob-target%`. -nametag-placeholder-maxblocks: 30 - -# || ADVANCED USERS ONLY -# || If your server software (e.g. Paper) has -# || the Adventure library in it, then LevelledMobs -# || will use it, so long this setting is enabled. -# || CraftBukkit and Spigot servers do not have -# || this library, although PaperMC servers and -# || all PaperMC forks (Airplane, etc) do. -# || It is recommended that you keep this enabled. -use-adventure: true - -# || When set to true, nametags will show the mob name -# || translated to your client language settings. -# || However some older clients don't support this -# || and will show the translation key instead. -use-translation-components: true - -# || If your server software (e.g. Paper) has -# || the Adventure library in it, then you can change -# || this to false and use MiniMessage for nametag -# || format parsing -use-legacy-serializer: true - # || ADVANCED USERS ONLY # || Do not touch this unless a LM developer tells you to. # || This value must not be modified, else your configuration