feat: implement harvest damage calculation and update totem handling on player death

This commit is contained in:
Your Name
2025-03-12 18:07:32 +01:00
parent b544939f65
commit 8567d18fca
6 changed files with 174 additions and 80 deletions

View File

@@ -1,6 +1,8 @@
package de.hessj.environmentex;
import java.io.IOException;
import java.util.Iterator;
import org.bukkit.Bukkit;
import org.bukkit.EntityEffect;
import org.bukkit.Material;
import org.bukkit.block.ShulkerBox;
@@ -14,33 +16,18 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import de.hessj.helper.Helper;
import net.kyori.adventure.text.Component;
public class BetterTotems implements Listener {
public boolean removeTotemFromShulker(ItemStack item) {
BlockStateMeta blockMeta = (BlockStateMeta) item.getItemMeta();
if (blockMeta.getBlockState() instanceof ShulkerBox) {
ShulkerBox box = (ShulkerBox) blockMeta.getBlockState();
Inventory inv = box.getSnapshotInventory();
ItemStack totem = new ItemStack(Material.TOTEM_OF_UNDYING, 1);
if (inv.containsAtLeast(totem, 1)) {
inv.removeItem(new ItemStack[] { totem });
box.update(true, false);
blockMeta.setBlockState(box);
item.setItemMeta(blockMeta);
return true;
}
} else { // wenn einer von Backpacks
}
return false;
}
ItemStack totem = new ItemStack(Material.TOTEM_OF_UNDYING, 1);
Inventory temp_inv = Bukkit.createInventory(null, 9, Component.translatable("tempBackpack"));
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerDamage(EntityDamageEvent event) {
public void onPlayerDamage(EntityDamageEvent event) throws IOException {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
double pHealth = player.getHealth();
@@ -48,41 +35,147 @@ public class BetterTotems implements Listener {
if (event.getCause().equals(DamageCause.VOID)) {
return;
}
if (pDamage >= pHealth) {
if (pHealth - pDamage <= 0) {
PlayerInventory pInv = player.getInventory();
ItemStack totem = new ItemStack(Material.TOTEM_OF_UNDYING, 1);
boolean hasTotem = pInv.containsAtLeast(totem, 1);
boolean hasShulkerTotem = false;
Iterator<ItemStack> var17;
if (!hasTotem) {
if (hasTotem) {
pInv.removeItem(totem);
resurrect(event, player);
} else {
var17 = pInv.iterator();
while (var17.hasNext()) {
ItemStack item = (ItemStack) var17.next();
if (item != null && (item.getType().toString().endsWith("SHULKER_BOX") /* || BACKPACK! */)) {
hasShulkerTotem = removeTotemFromShulker(item);
break;
if (item != null && item.hasItemMeta()
&& item.getItemMeta().getPersistentDataContainer().has(App.main.nsk, PersistentDataType.STRING)
&& (item.getItemMeta().getPersistentDataContainer().get(App.main.nsk, PersistentDataType.STRING)
.equals("R3S_kleiner_Rucksack"))) {
App.main.log("bin drin + k");
temp_inv = Bukkit.createInventory(null, 9, Component.translatable("tempBackpack"));
ItemStack[] is;
is = Helper.itemStackArrayFromBase64(
App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.leatherbackpack"));
temp_inv.setContents(is);
if (temp_inv.containsAtLeast(totem, 1)) {
temp_inv.removeItem(totem);
resurrect(event, player);
App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.leatherbackpack",
Helper.itemStackArrayToBase64(temp_inv.getContents()));
App.main.saveConfig();
App.main.reloadConfig();
break;
}
}
if (item != null && item.hasItemMeta()
&& item.getItemMeta().getPersistentDataContainer().has(App.main.nsk2, PersistentDataType.STRING)
&& (item.getItemMeta().getPersistentDataContainer()
.get(App.main.nsk2, PersistentDataType.STRING)
.equals("R3S_Rucksack"))) {
App.main.log("bin drin + r");
temp_inv = Bukkit.createInventory(null, 18, Component.translatable("tempBackpack"));
ItemStack[] is;
is = Helper.itemStackArrayFromBase64(
App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.ironbackpack"));
temp_inv.setContents(is);
if (temp_inv.containsAtLeast(totem, 1)) {
temp_inv.removeItem(totem);
resurrect(event, player);
App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.ironbackpack",
Helper.itemStackArrayToBase64(temp_inv.getContents()));
App.main.saveConfig();
App.main.reloadConfig();
break;
}
}
if (item != null && item.hasItemMeta()
&& item.getItemMeta().getPersistentDataContainer().has(App.main.nsk3, PersistentDataType.STRING)
&& (item.getItemMeta().getPersistentDataContainer()
.get(App.main.nsk3, PersistentDataType.STRING)
.equals("R3S_großer_Rucksack"))) {
App.main.log("bin drin + g");
temp_inv = Bukkit.createInventory(null, 27, Component.translatable("tempBackpack"));
ItemStack[] is;
is = Helper.itemStackArrayFromBase64(
App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.goldbackpack"));
temp_inv.setContents(is);
if (temp_inv.containsAtLeast(totem, 1)) {
temp_inv.removeItem(totem);
resurrect(event, player);
App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.goldbackpack",
Helper.itemStackArrayToBase64(temp_inv.getContents()));
App.main.saveConfig();
App.main.reloadConfig();
break;
}
}
if (item != null && item.hasItemMeta()
&& item.getItemMeta().getPersistentDataContainer().has(App.main.nsk4, PersistentDataType.STRING)
&& (item.getItemMeta().getPersistentDataContainer()
.get(App.main.nsk4, PersistentDataType.STRING)
.equals("R3S_riesiger_Rucksack"))) {
App.main.log("bin drin + riesig");
temp_inv = Bukkit.createInventory(null, 36, Component.translatable("tempBackpack"));
ItemStack[] is;
is = Helper.itemStackArrayFromBase64(
App.main.getConfig().getString(player.getUniqueId() + ".backpack.contents.diamondbackpack"));
temp_inv.setContents(is);
if (temp_inv.containsAtLeast(totem, 1)) {
temp_inv.removeItem(totem);
resurrect(event, player);
App.main.getConfig().set(player.getUniqueId() + ".backpack.contents.diamondbackpack",
Helper.itemStackArrayToBase64(temp_inv.getContents()));
App.main.saveConfig();
App.main.reloadConfig();
break;
}
}
if (item != null && (item.getType().toString().endsWith("SHULKER_BOX"))) {
BlockStateMeta blockMeta = (BlockStateMeta) item.getItemMeta();
if (blockMeta.getBlockState() instanceof ShulkerBox) {
ShulkerBox box = (ShulkerBox) blockMeta.getBlockState();
Inventory inv = box.getSnapshotInventory();
if (inv.containsAtLeast(totem, 1)) {
inv.removeItem(new ItemStack[] { totem });
box.update(true, false);
blockMeta.setBlockState(box);
item.setItemMeta(blockMeta);
break;
}
}
}
}
}
if (hasTotem || hasShulkerTotem) {
try {
player.getInventory().removeItem(new ItemStack[] { totem });
} finally {
event.setDamage(0.0D);
player.setHealth(5);
}
player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 5 * 20, 2));
player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 45 * 20, 2));
player.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 40 * 20, 1));
player.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING, 5 * 20, 1));
player.playEffect(EntityEffect.PROTECTED_FROM_DEATH);
return;
}
}
}
}
private void resurrect(EntityDamageEvent event, Player player) {
event.setDamage(0.0D);
player.setHealth(5);
player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 5 * 20, 2));
player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 45 * 20, 2));
player.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 40 * 20, 1));
if (event.getCause().equals(DamageCause.DROWNING)) {
player.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING, 5 * 20, 1));
}
player.playEffect(EntityEffect.PROTECTED_FROM_DEATH);
}
}

View File

@@ -273,6 +273,28 @@ public class EnvironmentExListeners implements Listener {
}
}
public static int harvestDMG(Material weapon) {
double perc = 0.70;
if (weapon == Material.WOODEN_HOE) {
perc = 0.70;
} else if (weapon == Material.STONE_HOE) {
perc = 0.75;
} else if (weapon == Material.IRON_HOE) {
perc = 0.80;
} else if (weapon == Material.GOLDEN_HOE) {
perc = 0.85;
} else if (weapon == Material.DIAMOND_HOE) {
perc = 0.90;
} else if (weapon == Material.NETHERITE_HOE) {
perc = 0.95;
}
Random rand = new Random();
return (rand.nextDouble() < perc) ? 0 : 1;
}
void harvest(int radius, PlayerInteractEvent e) {
e.setCancelled(true);
Block middle = e.getClickedBlock();
@@ -311,7 +333,7 @@ public class EnvironmentExListeners implements Listener {
ItemStack is = e.getPlayer().getInventory().getItemInMainHand();
ItemMeta meta = is.getItemMeta();
Damageable d = (Damageable) meta;
d.setDamage(d.getDamage() + 1);
d.setDamage(d.getDamage() + harvestDMG(is.getType()));
is.setItemMeta(meta);
middle.setType(cropM);
}
@@ -378,7 +400,7 @@ public class EnvironmentExListeners implements Listener {
ItemStack is = e.getPlayer().getInventory().getItemInMainHand();
ItemMeta meta = is.getItemMeta();
Damageable d = (Damageable) meta;
d.setDamage(d.getDamage() + 1);
d.setDamage(d.getDamage() + harvestDMG(is.getType()));
is.setItemMeta(meta);
}
}
@@ -819,8 +841,6 @@ public class EnvironmentExListeners implements Listener {
@EventHandler
public void onDeath(PlayerDeathEvent e) throws IllegalArgumentException, IOException {
e.deathMessage(null);
ItemStack itemStack[] = Helper.itemStackArrayFromBase64(
"rO0ABXVyACFbTG9yZy5idWtraXQuaW52ZW50b3J5Lkl0ZW1TdGFjazuWEWyPcqQUzwIAAHhwAAAACXBwcHBwcHBwcA==");
for (ItemStack is : e.getPlayer().getInventory().getContents()) {
if (is == null || !is.hasItemMeta() || is.getItemMeta().getPersistentDataContainer() == null) {
// return;
@@ -842,7 +862,7 @@ public class EnvironmentExListeners implements Listener {
}
App.main.getConfig().set(e.getPlayer().getUniqueId() + ".backpack.contents.leatherbackpack",
Helper.itemStackArrayToBase64(itemStack));
Helper.itemStackArrayToBase64(new ItemStack[] {}));
App.main.saveConfig();
}
@@ -860,7 +880,7 @@ public class EnvironmentExListeners implements Listener {
}
App.main.getConfig().set(e.getPlayer().getUniqueId() + ".backpack.contents.ironbackpack",
Helper.itemStackArrayToBase64(itemStack));
Helper.itemStackArrayToBase64(new ItemStack[] {}));
App.main.saveConfig();
}
} else if (is.getItemMeta().getPersistentDataContainer().has(App.main.nsk3,
@@ -878,7 +898,7 @@ public class EnvironmentExListeners implements Listener {
}
App.main.getConfig().set(e.getPlayer().getUniqueId() + ".backpack.contents.goldbackpack",
Helper.itemStackArrayToBase64(itemStack));
Helper.itemStackArrayToBase64(new ItemStack[] {}));
App.main.saveConfig();
}
} else if (is.getItemMeta().getPersistentDataContainer().has(App.main.nsk4,
@@ -896,7 +916,7 @@ public class EnvironmentExListeners implements Listener {
}
App.main.getConfig().set(e.getPlayer().getUniqueId() + ".backpack.contents.diamondbackpack",
Helper.itemStackArrayToBase64(itemStack));
Helper.itemStackArrayToBase64(new ItemStack[] {}));
App.main.saveConfig();
}
}

View File

@@ -173,7 +173,6 @@ public class ExpBottleListener implements Listener {
public void onDispense(BlockDispenseEvent e) {
if (e.getItem().getType() == Material.POTION && e.getBlock().getType() == Material.DISPENSER) {
PotionMeta pm = (PotionMeta) e.getItem().getItemMeta();
//TODO: check if working after method replacement
if (pm.getBasePotionType() == PotionType.WATER) {
Location loc = e.getBlock().getLocation();

View File

@@ -17,7 +17,6 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
public class PinFeature implements TabCompleter {
//TODO: add to webpage
public static File pinYml = new File(App.main.getDataFolder() + "/pins.yml");
public static FileConfiguration pinConfig = YamlConfiguration.loadConfiguration(pinYml);
@Override