From 718b39e6bea5a36a1b52a0f49bfc8f2809b8d9fe Mon Sep 17 00:00:00 2001 From: okx-code Date: Mon, 1 Jun 2026 02:47:17 +0100 Subject: [PATCH] improvements --- .../zorweth-config/plugins/Zorweth/config.yml | 6 +-- .../civmc/zorweth/oxygen/OxygenBottle.java | 52 +++++++++++++++++++ .../civmc/zorweth/oxygen/OxygenManager.java | 38 +++++++++++--- 3 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenBottle.java diff --git a/ansible/files/zorweth-config/plugins/Zorweth/config.yml b/ansible/files/zorweth-config/plugins/Zorweth/config.yml index bd2c94484..6347fb24c 100644 --- a/ansible/files/zorweth-config/plugins/Zorweth/config.yml +++ b/ansible/files/zorweth-config/plugins/Zorweth/config.yml @@ -29,7 +29,7 @@ research: oxygen: enabled: true world: world - consumption_per_second: 0.008 + consumption_per_second: 0.006 biomes: "minecraft:end_highlands": 1 "minecraft:pale_garden": 2 @@ -37,8 +37,8 @@ oxygen: "minecraft:end_barrens": 4 "minecraft:basalt_deltas": 8 activities: - idle: 0.5 - walking: 0.75 + idle: 0.25 + walking: 0.5 sprinting: 3 swimming: 4 regenerating: 5 diff --git a/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenBottle.java b/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenBottle.java new file mode 100644 index 000000000..b2608978f --- /dev/null +++ b/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenBottle.java @@ -0,0 +1,52 @@ +package net.civmc.zorweth.oxygen; + +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.Consumable; +import io.papermc.paper.datacomponent.item.consumable.ItemUseAnimation; +import java.util.List; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.CraftingRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ItemType; +import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.recipe.CraftingBookCategory; +import org.bukkit.plugin.Plugin; +import vg.civcraft.mc.civmodcore.inventory.CustomItem; + +public class OxygenBottle { + + public static ItemStack createCrudeOxygen() { + ItemStack item = new ItemStack(Material.RECOVERY_COMPASS); + item.setData(DataComponentTypes.ITEM_MODEL, new NamespacedKey("minecraft", "glass_bottle")); + item.setData(DataComponentTypes.CONSUMABLE, Consumable.consumable().consumeSeconds(0.4f).animation(ItemUseAnimation.DRINK).hasConsumeParticles(false).sound(NamespacedKey.minecraft("entity.generic.drink")).build()); + item.setData(DataComponentTypes.MAX_STACK_SIZE, 2); + ItemMeta meta = item.getItemMeta(); + meta.itemName(Component.text("Crude Oxygen Bottle", TextColor.color(140, 163, 177))); + meta.lore(List.of(Component.text("It can keep a traveller going for a little", NamedTextColor.WHITE), + Component.text("longer on this dastardly planet.", NamedTextColor.WHITE) , + Component.text("Provides +9 oxygen", NamedTextColor.WHITE))); + meta.setEnchantmentGlintOverride(true); + item.setItemMeta(meta); + CustomItem.registerCustomItem("crude_oxygen_bottle", item); + + return item; + } + + public static boolean isCrudeOxygen(ItemStack item) { + return CustomItem.isCustomItem(item, "crude_oxygen_bottle"); + } + + public static CraftingRecipe getRecipe(Plugin plugin) { + ShapelessRecipe recipe = new ShapelessRecipe(new NamespacedKey(plugin, "crude_oxygen_dry"), OxygenBottle.createCrudeOxygen()) + .addIngredient(Material.GLASS_BOTTLE) + .addIngredient(RecipeChoice.itemType(ItemType.CACTUS, ItemType.SEAGRASS)); + recipe.setCategory(CraftingBookCategory.EQUIPMENT); + return recipe; + } +} diff --git a/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenManager.java b/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenManager.java index 6393e4951..b873af7f7 100644 --- a/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenManager.java +++ b/plugins/zorweth-paper/src/main/java/net/civmc/zorweth/oxygen/OxygenManager.java @@ -3,6 +3,8 @@ package net.civmc.zorweth.oxygen; import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent; import io.papermc.paper.registry.RegistryAccess; import io.papermc.paper.registry.RegistryKey; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -20,6 +22,9 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerItemConsumeEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.CraftingRecipe; import org.bukkit.persistence.PersistentDataType; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -32,6 +37,8 @@ public class OxygenManager implements Listener { private final NamespacedKey oxygenKey; private final Map lastMessage = new WeakHashMap<>(); + private final Collection recipes = new ArrayList<>(); + public OxygenManager(ZorwethPlugin plugin, String world, ActivityManager activityManager, Map activityMultiplier, Map biomeMultipliers, double baseOxygenConsumptionPerSecond) { this.oxygenKey = new NamespacedKey(plugin, "oxygen"); @@ -57,19 +64,39 @@ public class OxygenManager implements Listener { } else { oxygen += baseOxygenConsumptionPerSecond / 2; } - oxygen = Math.min(1, oxygen); - player.getPersistentDataContainer().set(oxygenKey, PersistentDataType.DOUBLE, oxygen); + setOxygen(player, oxygen); continue; } oxygen -= loss * baseOxygenConsumptionPerSecond; - oxygen = Math.max(-1, oxygen); - player.getPersistentDataContainer().set(oxygenKey, PersistentDataType.DOUBLE, oxygen); + setOxygen(player, oxygen); applyOxygenEffects(player, oxygen); } }, 20, 20); + + recipes.add(OxygenBottle.getRecipe(plugin)); + for (CraftingRecipe recipe : recipes) { + Bukkit.addRecipe(recipe); + } + } + + @EventHandler + public void on(PlayerJoinEvent event) { + for (CraftingRecipe recipe : recipes) { + event.getPlayer().discoverRecipe(recipe.getKey()); + } + } + + @EventHandler + public void on(PlayerItemConsumeEvent event) { + if (!OxygenBottle.isCrudeOxygen(event.getItem())) { + return; + } + + Player player = event.getPlayer(); + setOxygen(player, getOxygen(player) + 0.09); } public static OxygenManager deserialize(ZorwethPlugin plugin, ActivityManager activityManager, ConfigurationSection section) { @@ -144,8 +171,7 @@ public class OxygenManager implements Listener { } public void setOxygen(final Player player, final double oxygen) { - player.getPersistentDataContainer().set(oxygenKey, PersistentDataType.DOUBLE, oxygen); - applyOxygenEffects(player, oxygen); + player.getPersistentDataContainer().set(oxygenKey, PersistentDataType.DOUBLE, Math.clamp(oxygen, -1, 1)); } private void sendDebouncedMessage(Player player, Component message) {