From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Tue, 18 Jan 2022 04:51:51 -0600 Subject: [PATCH] Configurable food attributes diff --git a/src/main/java/net/minecraft/world/food/FoodProperties.java b/src/main/java/net/minecraft/world/food/FoodProperties.java index 9967ba762567631f2bdb1e4f8fe16a13ea927b46..6c945ae8fe8b1517e312c688f829fab41f12d9f4 100644 --- a/src/main/java/net/minecraft/world/food/FoodProperties.java +++ b/src/main/java/net/minecraft/world/food/FoodProperties.java @@ -2,15 +2,22 @@ package net.minecraft.world.food; import com.google.common.collect.Lists; import com.mojang.datafixers.util.Pair; + +import java.util.ArrayList; import java.util.List; import net.minecraft.world.effect.MobEffectInstance; public class FoodProperties { - private final int nutrition; - private final float saturationModifier; - private final boolean isMeat; - private final boolean canAlwaysEat; - private final boolean fastFood; + // Purpur start + private int nutrition; public void setNutrition(int nutrition) { this.nutrition = nutrition; } + private float saturationModifier; public void setSaturationModifier(float saturation) { this.saturationModifier = saturation; } + private boolean isMeat; public void setIsMeat(boolean isMeat) { this.isMeat = isMeat; } + private boolean canAlwaysEat; public void setCanAlwaysEat(boolean canAlwaysEat) { this.canAlwaysEat = canAlwaysEat; } + private boolean fastFood; public void setFastFood(boolean isFastFood) { this.fastFood = isFastFood; } + public FoodProperties copy() { + return new FoodProperties(this.nutrition, this.saturationModifier, this.isMeat, this.canAlwaysEat, this.fastFood, new ArrayList<>(this.effects)); + } + // Purpur end private final List> effects; FoodProperties(int hunger, float saturationModifier, boolean meat, boolean alwaysEdible, boolean snack, List> statusEffects) { diff --git a/src/main/java/net/minecraft/world/food/Foods.java b/src/main/java/net/minecraft/world/food/Foods.java index b16d9e2eaa589f19c563ee70b1a56d67dbcdecb0..71beab673f04cd051c46ea37f8c847316885d38d 100644 --- a/src/main/java/net/minecraft/world/food/Foods.java +++ b/src/main/java/net/minecraft/world/food/Foods.java @@ -4,6 +4,9 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; public class Foods { + public static final java.util.Map ALL_PROPERTIES = new java.util.HashMap<>(); // Purpur + public static final java.util.Map DEFAULT_PROPERTIES = new java.util.HashMap<>(); // Purpur + public static final FoodProperties APPLE = (new FoodProperties.Builder()).nutrition(4).saturationMod(0.3F).build(); public static final FoodProperties BAKED_POTATO = (new FoodProperties.Builder()).nutrition(5).saturationMod(0.6F).build(); public static final FoodProperties BEEF = (new FoodProperties.Builder()).nutrition(3).saturationMod(0.3F).meat().build(); diff --git a/src/main/java/net/minecraft/world/item/Items.java b/src/main/java/net/minecraft/world/item/Items.java index 31f5ed9dd1727eee24804a384817d2b76a45676b..5fbb13ebef0ca66419f3e5006d19e4a5918a038a 100644 --- a/src/main/java/net/minecraft/world/item/Items.java +++ b/src/main/java/net/minecraft/world/item/Items.java @@ -1309,6 +1309,13 @@ public class Items { ((BlockItem)item).registerBlocks(Item.BY_BLOCK, item); } + // Purpur start + if (item.getFoodProperties() != null) { + Foods.ALL_PROPERTIES.put(key.location().getPath(), item.getFoodProperties()); + Foods.DEFAULT_PROPERTIES.put(key.location().getPath(), item.getFoodProperties().copy()); + } + // Purpur end + return Registry.register(BuiltInRegistries.ITEM, key, item); } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java index c0ec042d3e4b322154ae58dbc0bb95b7ddbcbdd9..daaa37ce5db26b7ad1a2ffaf843f31d0913d2f37 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -464,4 +464,75 @@ public class PurpurConfig { String setPattern = getString("settings.username-valid-characters", defaultPattern); usernameValidCharactersPattern = java.util.regex.Pattern.compile(setPattern == null || setPattern.isBlank() ? defaultPattern : setPattern); } + + private static void foodSettings() { + ConfigurationSection properties = config.getConfigurationSection("settings.food-properties"); + if (properties == null) { + config.addDefault("settings.food-properties", new HashMap<>()); + return; + } + + Map> effectDefaults = new HashMap<>(); + Map EFFECT_DEFAULT = Map.of( + "chance", 0.0F, + "duration", 0, + "amplifier", 0, + "ambient", false, + "visible", true, + "show-icon", true + ); + + properties.getKeys(false).forEach(foodKey -> { + FoodProperties food = Foods.ALL_PROPERTIES.get(foodKey); + if (food == null) { + PurpurConfig.log(Level.SEVERE, "Invalid food property: " + foodKey); + return; + } + FoodProperties foodDefaults = Foods.DEFAULT_PROPERTIES.get(foodKey); + food.setNutrition(properties.getInt(foodKey + ".nutrition", foodDefaults.getNutrition())); + food.setSaturationModifier((float) properties.getDouble(foodKey + ".saturation-modifier", foodDefaults.getSaturationModifier())); + food.setIsMeat(properties.getBoolean(foodKey + ".is-meat", foodDefaults.isMeat())); + food.setCanAlwaysEat(properties.getBoolean(foodKey + ".can-always-eat", foodDefaults.canAlwaysEat())); + food.setFastFood(properties.getBoolean(foodKey + ".fast-food", foodDefaults.isFastFood())); + ConfigurationSection effects = properties.getConfigurationSection(foodKey + ".effects"); + if (effects != null) { + effectDefaults.clear(); + foodDefaults.getEffects().forEach(pair -> { + MobEffectInstance effect = pair.getFirst(); + effectDefaults.put(effect.getEffect(), Map.of( + "chance", pair.getSecond(), + "duration", effect.getDuration(), + "amplifier", effect.getAmplifier(), + "ambient", effect.isAmbient(), + "visible", effect.isVisible(), + "show-icon", effect.showIcon() + )); + }); + effects.getKeys(false).forEach(effectKey -> { + MobEffect effect = BuiltInRegistries.MOB_EFFECT.get(new ResourceLocation(effectKey)); + if (effect == null) { + PurpurConfig.log(Level.SEVERE, "Invalid food property effect for " + foodKey + ": " + effectKey); + return; + } + + Map effectDefault = effectDefaults.get(effect); + if (effectDefault == null) { + effectDefault = EFFECT_DEFAULT; + } + + food.getEffects().removeIf(pair -> pair.getFirst().getEffect() == effect); + float chance = (float) effects.getDouble(effectKey + ".chance", ((Float) effectDefault.get("chance")).doubleValue()); + int duration = effects.getInt(effectKey + ".duration", (int) effectDefault.get("duration")); + if (chance <= 0.0F || duration < 0) { + return; + } + int amplifier = effects.getInt(effectKey + ".amplifier", (int) effectDefault.get("amplifier")); + boolean ambient = effects.getBoolean(effectKey + ".ambient", (boolean) effectDefault.get("ambient")); + boolean visible = effects.getBoolean(effectKey + ".visible", (boolean) effectDefault.get("visible")); + boolean showIcon = effects.getBoolean(effectKey + ".show-icon", (boolean) effectDefault.get("show-icon")); + food.getEffects().add(Pair.of(new MobEffectInstance(effect, duration, amplifier, ambient, visible, showIcon), chance)); + }); + } + }); + } }