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,34 +1,18 @@
git init
git checkout -b main
git add README.md
git commit -m "first commit"
git remote add origin https://gitea.hessj.de/administrator/MCPlugins.git
git push -u origin main
BISJETZT NEU: environmentex
BUG: es haut die Backpacks ultra weit weg beim Tod
ALLGEMEIN: recipes die custom items beinhalten werden nicht im crafting angezeigt (allgm. Bukkit problem)
INFO: CustomItemIcon count: 22
IDEA: schere verschiedene versionen pferde/mule/cats/schafe/Axolotl/tropical etc?
FIX: Infinity Bucket
ADD: TOTEM BACKPACK LOOKUP
cauldron concrete to web
shulker preview SHIFT + Rechtsklick
infinite water
Armored Elytra
TO RELEASE: HOPPER FILTER WAS DURCH DARF!
TO RELEASE: cauldron concrete
TO RELEASE: shulker preview SHIFT im inv Rechtsklick
TO RELEASE: Armored Elytra
TO RELEASE: waterbottle + sponge = empty bottle
TO RELEASE: AFK Funktion
TO RELEASE: Autocrafter
VON WEBSITE NEHMEN: BÜCHERREGAL
TO RELEASE: Infinity Bucket (wers glaubt)
TO RELEASE: TOTEM
ALLGEMEIN: recipes die custom items beinhalten werden nicht im crafting angezeigt (allgm. Bukkit problem)
helper muss immer im Main sein.
craftbukkit der hauptversion auch
CUSTOM.zip ist ein backup des Server Resourcepacks
TO RELEASE: TOTEM ADD: TOTEM BACKPACK LOOKUP + SHULKER? ABER NICHT SHULKER IN BACKPACK
TO RELEASE: PIN Feature

View File

@@ -27,7 +27,6 @@ import net.kyori.adventure.text.Component;
public class BetterHopperListener implements Listener {
Component inventoryname = Component.text("Items zum filtern:");
//TODO: test if plugin works
@EventHandler
public void onBlockPlace(BlockPlaceEvent e) {
if (App.main.checkFilterHopper(e.getItemInHand())) {

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