mirror of
https://github.com/CivMC/Civ.git
synced 2026-07-18 00:20:44 +00:00
improvements
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user