add saturation support

This commit is contained in:
Enderaoe 2021-11-10 23:13:30 +08:00
parent d185c7538c
commit adc480fd03
5 changed files with 113 additions and 52 deletions

View File

@ -51,6 +51,8 @@ import org.bukkit.potion.PotionEffectType;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
public class EntityListener implements Listener { public class EntityListener implements Listener {
private final mcMMO pluginRef; private final mcMMO pluginRef;
private final @NotNull AbstractPersistentDataLayer persistentDataLayer; private final @NotNull AbstractPersistentDataLayer persistentDataLayer;
@ -893,6 +895,9 @@ public class EntityListener implements Listener {
int newFoodLevel = event.getFoodLevel(); int newFoodLevel = event.getFoodLevel();
int foodChange = newFoodLevel - currentFoodLevel; int foodChange = newFoodLevel - currentFoodLevel;
float currentSaturationLevel = player.getSaturation();
float newSaturationLevel = 0.0F; //No support in spigot API, use saturation table
if (foodChange <= 0) { if (foodChange <= 0) {
return; return;
} }
@ -909,6 +914,12 @@ public class EntityListener implements Listener {
return; //Not Food return; //Not Food
} }
Float foodSaturation = ItemUtils.getFoodSaturation(foodInHand);
if (foodSaturation != null) {
newSaturationLevel = currentSaturationLevel + foodSaturation;
}
/* /*
* Some foods have 3 ranks Some foods have 5 ranks The number of ranks * Some foods have 3 ranks Some foods have 5 ranks The number of ranks
* is based on how 'common' the item is We can adjust this quite easily * is based on how 'common' the item is We can adjust this quite easily
@ -917,64 +928,32 @@ public class EntityListener implements Listener {
//Hacky 1.17 support //Hacky 1.17 support
if(foodInHand.getKey().getKey().equalsIgnoreCase("glow_berries")) { if(foodInHand.getKey().getKey().equalsIgnoreCase("glow_berries")) {
newSaturationLevel = currentSaturationLevel + 0.4F;
if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) { if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) {
event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDiet(newFoodLevel)); event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDietHunger(newFoodLevel));
player.setSaturation(UserManager.getPlayer(player).getHerbalismManager().farmersDietSaturation(newSaturationLevel));
} }
return; return;
} }
switch (foodInHand) { switch (foodInHand) {
case BAKED_POTATO: /* case BAKED_POTATO, BEETROOT, BREAD, CARROT, GOLDEN_CARROT, MUSHROOM_STEW, PUMPKIN_PIE, COOKIE, MELON_SLICE, POISONOUS_POTATO, POTATO -> {
* RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @
* 1000
*/
case BEETROOT:
case BREAD: /* RESTORES 2 1/2 HUNGER - RESTORES 5 HUNGER @ 1000 */
case CARROT: /*
* RESTORES 2 HUNGER - RESTORES 4 1/2 HUNGER @
* 1000
*/
case GOLDEN_CARROT: /*
* RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @
* 1000
*/
case MUSHROOM_STEW: /*
* RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @
* 1000
*/
case PUMPKIN_PIE: /*
* RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @
* 1000
*/
if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) { if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) {
event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDiet(newFoodLevel)); event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDietHunger(newFoodLevel));
player.setSaturation(UserManager.getPlayer(player).getHerbalismManager().farmersDietSaturation(newSaturationLevel));
} }
return; return;
case COOKIE: /* RESTORES 1/2 HUNGER - RESTORES 2 HUNGER @ 1000 */
case MELON_SLICE: /* RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER @ 1000 */
case POISONOUS_POTATO: /*
* RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER
* @ 1000
*/
case POTATO: /* RESTORES 1/2 HUNGER - RESTORES 2 HUNGER @ 1000 */
if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) {
event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDiet(newFoodLevel));
} }
return; case COD, SALMON, TROPICAL_FISH, COOKED_COD, COOKED_SALMON -> {
case COD:
case SALMON:
case TROPICAL_FISH:
case COOKED_COD:
case COOKED_SALMON:
if (Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_FISHERMANS_DIET)) { if (Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_FISHERMANS_DIET)) {
event.setFoodLevel(UserManager.getPlayer(player).getFishingManager().handleFishermanDiet(newFoodLevel)); event.setFoodLevel(UserManager.getPlayer(player).getFishingManager().handleFishermanDietHunger(newFoodLevel));
player.setSaturation(UserManager.getPlayer(player).getFishingManager().handleFishermanDietSaturation(newSaturationLevel));
} }
return; return;
}
default: default -> {
}
} }
} }

View File

@ -213,14 +213,25 @@ public class FishingManager extends SkillManager {
} }
/** /**
* Handle the Fisherman's Diet ability * Handle the Fisherman's Diet ability about hunger
* *
* @param eventFoodLevel The initial change in hunger from the event * @param eventFoodLevel The initial change in hunger from the event
* *
* @return the modified change in hunger for the event * @return the modified change in hunger for the event
*/ */
public int handleFishermanDiet(int eventFoodLevel) { public int handleFishermanDietHunger(int eventFoodLevel) {
return SkillUtils.handleFoodSkills(getPlayer(), eventFoodLevel, SubSkillType.FISHING_FISHERMANS_DIET); return SkillUtils.handleFoodSkillsHunger(getPlayer(), eventFoodLevel, SubSkillType.FISHING_FISHERMANS_DIET);
}
/**
* Handle the Fisherman's Diet ability about saturation
*
* @param eventSaturationLevel The initial change in saturation from the event
*
* @return the modified change in saturation for the event
*/
public float handleFishermanDietSaturation(float eventSaturationLevel) {
return SkillUtils.handleFoodSkillsSaturation(getPlayer(), eventSaturationLevel, SubSkillType.FISHING_FISHERMANS_DIET);
} }
public void iceFishing(FishHook hook, Block block) { public void iceFishing(FishHook hook, Block block) {

View File

@ -166,13 +166,23 @@ public class HerbalismManager extends SkillManager {
} }
/** /**
* Handle the Farmer's Diet ability * Handle the Farmer's Diet ability about hunger
* *
* @param eventFoodLevel The initial change in hunger from the event * @param eventFoodLevel The initial change in hunger from the event
* @return the modified change in hunger for the event * @return the modified change in hunger for the event
*/ */
public int farmersDiet(int eventFoodLevel) { public int farmersDietHunger(int eventFoodLevel) {
return SkillUtils.handleFoodSkills(getPlayer(), eventFoodLevel, SubSkillType.HERBALISM_FARMERS_DIET); return SkillUtils.handleFoodSkillsHunger(getPlayer(), eventFoodLevel, SubSkillType.HERBALISM_FARMERS_DIET);
}
/**
* Handle the Farmer's Diet ability about saturation
*
* @param eventSaturationLevel The initial change in saturation from the event
* @return the modified change in saturation for the event
*/
public float farmersDietSaturation(float eventSaturationLevel) {
return SkillUtils.handleFoodSkillsSaturation(getPlayer(), eventSaturationLevel, SubSkillType.HERBALISM_FARMERS_DIET);
} }
/** /**

View File

@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
public final class ItemUtils { public final class ItemUtils {
@ -30,6 +31,51 @@ public final class ItemUtils {
*/ */
private ItemUtils() {} private ItemUtils() {}
private static final HashMap<Material, Float> foodSaturation = new HashMap<>();
static {
foodSaturation.put(Material.APPLE, 2.4F);
foodSaturation.put(Material.BAKED_POTATO, 6.0F);
foodSaturation.put(Material.BEETROOT, 1.2F);
foodSaturation.put(Material.BEETROOT_SOUP, 7.2F);
foodSaturation.put(Material.BREAD, 6.0F);
foodSaturation.put(Material.CAKE, 0.4F);
foodSaturation.put(Material.CARROT, 3.6F);
foodSaturation.put(Material.CHORUS_FRUIT, 2.4F);
foodSaturation.put(Material.COOKED_BEEF, 12.8F);
foodSaturation.put(Material.COOKED_CHICKEN, 7.2F);
foodSaturation.put(Material.COOKED_COD, 6.0F);
foodSaturation.put(Material.COOKED_MUTTON, 9.6F);
foodSaturation.put(Material.COOKED_PORKCHOP, 12.8F);
foodSaturation.put(Material.COOKED_RABBIT, 6.0F);
foodSaturation.put(Material.COOKED_SALMON, 9.6F);
foodSaturation.put(Material.COOKIE, 0.4F);
foodSaturation.put(Material.DRIED_KELP, 0.6F);
foodSaturation.put(Material.ENCHANTED_GOLDEN_APPLE, 9.6F);
foodSaturation.put(Material.HONEY_BOTTLE, 1.2F);
foodSaturation.put(Material.GOLDEN_APPLE, 9.6F);
foodSaturation.put(Material.GOLDEN_CARROT, 14.4F);
foodSaturation.put(Material.MELON_SLICE, 1.2F);
foodSaturation.put(Material.MUSHROOM_STEW, 7.2F);
foodSaturation.put(Material.POISONOUS_POTATO, 1.2F);
foodSaturation.put(Material.POTATO, 0.6F);
foodSaturation.put(Material.PUFFERFISH, 0.2F);
foodSaturation.put(Material.PUMPKIN_PIE, 4.8F);
foodSaturation.put(Material.RABBIT_STEW, 12.0F);
foodSaturation.put(Material.BEEF, 1.8F);
foodSaturation.put(Material.CHICKEN, 1.2F);
foodSaturation.put(Material.COD, 0.4F);
foodSaturation.put(Material.MUTTON, 1.2F);
foodSaturation.put(Material.PORKCHOP, 1.8F);
foodSaturation.put(Material.RABBIT, 1.8F);
foodSaturation.put(Material.SALMON, 0.4F);
foodSaturation.put(Material.ROTTEN_FLESH, 0.8F);
foodSaturation.put(Material.SPIDER_EYE, 3.2F);
foodSaturation.put(Material.SUSPICIOUS_STEW, 7.2F);
foodSaturation.put(Material.SWEET_BERRIES, 0.4F);
foodSaturation.put(Material.TROPICAL_FISH, 0.2F);
}
/** /**
* Checks if the item is a bow. * Checks if the item is a bow.
* *
@ -650,4 +696,8 @@ public final class ItemUtils {
int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size()); int randomIndex = Misc.getRandom().nextInt(enchantmentWrappers.size());
return enchantmentWrappers.get(randomIndex); return enchantmentWrappers.get(randomIndex);
} }
public static @Nullable Float getFoodSaturation(@NotNull Material food) {
return foodSaturation.get(food);
}
} }

View File

@ -79,7 +79,7 @@ public final class SkillUtils {
* Others * Others
*/ */
public static int handleFoodSkills(Player player, int eventFoodLevel, SubSkillType subSkillType) { public static int handleFoodSkillsHunger(Player player, int eventFoodLevel, SubSkillType subSkillType) {
int curRank = RankUtils.getRank(player, subSkillType); int curRank = RankUtils.getRank(player, subSkillType);
int currentFoodLevel = player.getFoodLevel(); int currentFoodLevel = player.getFoodLevel();
@ -90,6 +90,17 @@ public final class SkillUtils {
return currentFoodLevel + foodChange; return currentFoodLevel + foodChange;
} }
public static float handleFoodSkillsSaturation(Player player, float eventSaturationLevel, SubSkillType subSkillType) {
int curRank = RankUtils.getRank(player, subSkillType);
float currentSaturationLevel = player.getSaturation();
float saturationChange = eventSaturationLevel - currentSaturationLevel;
saturationChange += curRank;
return currentSaturationLevel + saturationChange;
}
/** /**
* Calculate the time remaining until the cooldown expires. * Calculate the time remaining until the cooldown expires.
* *