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