improvements

This commit is contained in:
okx-code
2026-06-01 02:47:17 +01:00
parent 3b5a34c255
commit 718b39e6be
3 changed files with 87 additions and 9 deletions

View File

@@ -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;
}
}

View File

@@ -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<Player, Long> lastMessage = new WeakHashMap<>();
private final Collection<CraftingRecipe> recipes = new ArrayList<>();
public OxygenManager(ZorwethPlugin plugin, String world, ActivityManager activityManager,
Map<ActivityManager.Activity, Double> activityMultiplier, Map<Biome, Double> 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) {