Add cache for slime max health (resolves #234)

This commit is contained in:
BillyGalbreath
2021-03-25 12:54:05 -05:00
parent 39dd78a0dd
commit 0d25d391e3
38 changed files with 86 additions and 79 deletions

View File

@@ -1078,7 +1078,7 @@ index cb52c4e63ac487d55dc16accca6976f44f904112..62f1808a456f46a6c7fbb5e030d9ed65
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
index 0cbe3032fd3b048b0eb8ec3d8592a662c69c9e30..b80b426acd8aec61c5e970ca039c8c47bc97f9e4 100644
index 0cbe3032fd3b048b0eb8ec3d8592a662c69c9e30..ce0d52a501dbff7c4eb70270bafa3e2a77599107 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
@@ -51,6 +51,7 @@ import com.destroystokyo.paper.event.entity.SlimeChangeDirectionEvent;
@@ -1097,7 +1097,7 @@ index 0cbe3032fd3b048b0eb8ec3d8592a662c69c9e30..b80b426acd8aec61c5e970ca039c8c47
public float b;
public float c;
public float d;
@@ -104,6 +106,25 @@ public class EntitySlime extends EntityInsentient implements IMonster {
@@ -104,6 +106,30 @@ public class EntitySlime extends EntityInsentient implements IMonster {
}
return true; // do not jump() in wasd controller, let vanilla controller handle
}
@@ -1113,17 +1113,22 @@ index 0cbe3032fd3b048b0eb8ec3d8592a662c69c9e30..b80b426acd8aec61c5e970ca039c8c47
+
+ public double generateMaxHealth() {
+ int size = getSize();
+ try {
+ scriptEngine.eval("size = " + size);
+ return (double) scriptEngine.eval(getMaxHealthEquation());
+ } catch (Exception e) {
+ return size * size;
+ Double maxHealth = world.purpurConfig.slimeMaxHealthCache.get(size);
+ if (maxHealth == null) {
+ try {
+ scriptEngine.eval("size = " + size);
+ maxHealth = (double) scriptEngine.eval(getMaxHealthEquation());
+ } catch (Exception e) {
+ maxHealth = (double) size * size;
+ }
+ world.purpurConfig.slimeMaxHealthCache.put(size, maxHealth);
+ }
+ return maxHealth;
+ }
// Purpur end
@Override
@@ -130,7 +151,7 @@ public class EntitySlime extends EntityInsentient implements IMonster {
@@ -130,7 +156,7 @@ public class EntitySlime extends EntityInsentient implements IMonster {
this.datawatcher.set(EntitySlime.bo, i);
this.af();
this.updateSize();
@@ -1402,7 +1407,7 @@ index 90cbef7fe8803295f82bddd6709fdf303aedcaba..b84916c0c58fd208ef5547299f8db846
@Nullable
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d4507787f 100644
index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..c423bc6a535a61dc7deed0b2c5f94eb1633aa1a3 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -496,30 +496,58 @@ public class PurpurWorldConfig {
@@ -2145,7 +2150,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean rabbitRidable = false;
@@ -936,68 +1292,142 @@ public class PurpurWorldConfig {
@@ -936,68 +1292,144 @@ public class PurpurWorldConfig {
public double rabbitNaturalToast = 0.0D;
public double rabbitNaturalKiller = 0.0D;
public int rabbitBreedingTicks = 6000;
@@ -2276,6 +2281,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
public boolean slimeRidable = false;
public boolean slimeRidableInWater = false;
+ public String slimeMaxHealth = "size * size";
+ public Map<Integer, Double> slimeMaxHealthCache = new HashMap<>();
private void slimeSettings() {
slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable);
slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater);
@@ -2285,10 +2291,11 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
+ set("mobs.slime.attributes.max_health", oldValue);
+ }
+ slimeMaxHealth = getString("mobs.slime.attributes.max_health", slimeMaxHealth);
+ slimeMaxHealthCache.clear();
}
public boolean snowGolemRidable = false;
@@ -1009,6 +1439,7 @@ public class PurpurWorldConfig {
@@ -1009,6 +1441,7 @@ public class PurpurWorldConfig {
public int snowGolemSnowBallMax = 20;
public float snowGolemSnowBallModifier = 10.0F;
public double snowGolemAttackDistance = 1.25D;
@@ -2296,7 +2303,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
private void snowGolemSettings() {
snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable);
snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater);
@@ -1019,63 +1450,118 @@ public class PurpurWorldConfig {
@@ -1019,63 +1452,118 @@ public class PurpurWorldConfig {
snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax);
snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier);
snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance);
@@ -2415,7 +2422,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean villagerRidable = false;
@@ -1093,6 +1579,7 @@ public class PurpurWorldConfig {
@@ -1093,6 +1581,7 @@ public class PurpurWorldConfig {
public int villagerLobotomizeCheck = 60;
public boolean villagerClericsFarmWarts = false;
public boolean villagerClericFarmersThrowWarts = true;
@@ -2423,7 +2430,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
private void villagerSettings() {
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
@@ -1114,33 +1601,60 @@ public class PurpurWorldConfig {
@@ -1114,33 +1603,60 @@ public class PurpurWorldConfig {
villagerLobotomizeCheck = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheck);
villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts);
villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts);
@@ -2484,7 +2491,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean witherRidable = false;
@@ -1157,19 +1671,30 @@ public class PurpurWorldConfig {
@@ -1157,19 +1673,30 @@ public class PurpurWorldConfig {
witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay);
if (PurpurConfig.version < 8) {
double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth);
@@ -2517,7 +2524,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean wolfRidable = false;
@@ -1178,6 +1703,7 @@ public class PurpurWorldConfig {
@@ -1178,6 +1705,7 @@ public class PurpurWorldConfig {
public boolean wolfMilkCuresRabies = true;
public double wolfNaturalRabid = 0.0D;
public int wolfBreedingTicks = 6000;
@@ -2525,7 +2532,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
private void wolfSettings() {
wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable);
wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater);
@@ -1189,13 +1715,26 @@ public class PurpurWorldConfig {
@@ -1189,13 +1717,26 @@ public class PurpurWorldConfig {
wolfMilkCuresRabies = getBoolean("mobs.wolf.milk-cures-rabid-wolves", wolfMilkCuresRabies);
wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid);
wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks);
@@ -2552,7 +2559,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean zombieRidable = false;
@@ -1205,6 +1744,8 @@ public class PurpurWorldConfig {
@@ -1205,6 +1746,8 @@ public class PurpurWorldConfig {
public boolean zombieJockeyTryExistingChickens = true;
public boolean zombieAggressiveTowardsVillagerWhenLagging = true;
public EnumDifficulty zombieBreakDoorMinDifficulty = EnumDifficulty.HARD;
@@ -2561,7 +2568,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
private void zombieSettings() {
zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable);
zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater);
@@ -1217,15 +1758,40 @@ public class PurpurWorldConfig {
@@ -1217,15 +1760,40 @@ public class PurpurWorldConfig {
} catch (IllegalArgumentException ignore) {
zombieBreakDoorMinDifficulty = EnumDifficulty.HARD;
}
@@ -2602,7 +2609,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean zombifiedPiglinRidable = false;
@@ -1234,6 +1800,8 @@ public class PurpurWorldConfig {
@@ -1234,6 +1802,8 @@ public class PurpurWorldConfig {
public double zombifiedPiglinJockeyChance = 0.05D;
public boolean zombifiedPiglinJockeyTryExistingChickens = true;
public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true;
@@ -2611,7 +2618,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
private void zombifiedPiglinSettings() {
zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable);
zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater);
@@ -1241,6 +1809,13 @@ public class PurpurWorldConfig {
@@ -1241,6 +1811,13 @@ public class PurpurWorldConfig {
zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance);
zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens);
zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry);
@@ -2625,7 +2632,7 @@ index 6f1ea7f760bd3a4ab6ba0787776b4017f9e6d52e..894c0e86dbbd7bcbdbd7af48cd50d38d
}
public boolean zombieVillagerRidable = false;
@@ -1248,11 +1823,20 @@ public class PurpurWorldConfig {
@@ -1248,11 +1825,20 @@ public class PurpurWorldConfig {
public boolean zombieVillagerJockeyOnlyBaby = true;
public double zombieVillagerJockeyChance = 0.05D;
public boolean zombieVillagerJockeyTryExistingChickens = true;