diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ed2d378
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,51 @@
+
+ 4.0.0
+
+ com.zivilon
+ DamageModifiers
+ 1.0
+ jar
+
+ DamageModifiers
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.bukkit
+ bukkit
+ 1.7.10-R0.1-SNAPSHOT
+ provided
+
+
+ com.github.flinbein
+ PowerNBT
+ 0.8.9.2
+
+
+
+
+ package
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+
+
diff --git a/src/main/java/com/zivilon/damagemodifiers/DamageModifiers.java b/src/main/java/com/zivilon/damagemodifiers/DamageModifiers.java
new file mode 100644
index 0000000..1858da4
--- /dev/null
+++ b/src/main/java/com/zivilon/damagemodifiers/DamageModifiers.java
@@ -0,0 +1,63 @@
+package com.zivilon.damagemodifiers;
+
+import org.bukkit.Material;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import com.zivilon.damagemodifiers.listeners.damage_listener;
+import com.zivilon.damagemodifiers.commands.damage_modifier_command;
+import com.zivilon.damagemodifiers.types.weapon_damage;
+
+public class DamageModifiers extends JavaPlugin {
+ private FileConfiguration items_config;
+ @Override
+ public void onEnable() {
+ setup_items_config();
+ weapon_damage.setPlugin(this);
+
+ getServer().getPluginManager().registerEvents(new damage_listener(), this);
+
+ getCommand("damagemodifier").setExecutor(new damage_modifier_command(this));
+ }
+
+ private void setup_items_config() {
+ // Check if items.yml exists, if not, create it from the default
+ File items_file = new File(getDataFolder(), "items.yml");
+ if (!items_file.exists()) {
+ saveResource("items.yml", false);
+ }
+
+ items_config = YamlConfiguration.loadConfiguration(items_file);
+ }
+ public FileConfiguration get_items_config() {
+ if (items_config == null) {
+ reload_items_config();
+ }
+ return items_config;
+ }
+
+ public void reload_items_config() {
+ File items_file = new File(getDataFolder(), "items.yml");
+ items_config = YamlConfiguration.loadConfiguration(items_file);
+ }
+
+ public void save_items_config() {
+ if (items_config == null) {
+ return;
+ }
+ File items_file = new File(getDataFolder(), "items.yml");
+ try {
+ get_items_config().save(items_file);
+ } catch (IOException ex) {
+ getLogger().log(Level.SEVERE, "Could not save config to " + items_file, ex);
+ }
+ }
+}
diff --git a/src/main/java/com/zivilon/damagemodifiers/commands/damage_modifier_command.java b/src/main/java/com/zivilon/damagemodifiers/commands/damage_modifier_command.java
new file mode 100644
index 0000000..5947d3c
--- /dev/null
+++ b/src/main/java/com/zivilon/damagemodifiers/commands/damage_modifier_command.java
@@ -0,0 +1,213 @@
+package com.zivilon.damagemodifiers.commands;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import me.dpohvar.powernbt.api.NBTCompound;
+import me.dpohvar.powernbt.api.NBTManager;
+import me.dpohvar.powernbt.PowerNBT;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.zivilon.damagemodifiers.DamageModifiers;
+
+public class damage_modifier_command implements CommandExecutor {
+ private final DamageModifiers plugin;
+
+ public damage_modifier_command(DamageModifiers plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+ if (!sender.hasPermission("admin")) {
+ sender.sendMessage(ChatColor.RED + "You do not have permission to use this command.");
+ return true;
+ }
+
+ if (args.length < 1) {
+ sender.sendMessage("Please specify a subcommand: add, remove, list, read");
+ return false;
+ }
+ if (!args[0].equals("add") && !args[0].equals("remove") && !args[0].equals("list") && !args[0].equals("read")) {
+ sender.sendMessage("Invalid subcommand: " + args[0]);
+ sender.sendMessage("Valid subcommands: add, remove, list, read");
+ return false;
+ }
+
+ if (args.length < 2) {
+ sender.sendMessage("Please specify a target player");
+ return false;
+ }
+
+ Player target = Bukkit.getPlayer(args[1]);
+ if (target == null) {
+ sender.sendMessage("Target player not found.");
+ return true;
+ }
+
+ switch (args[0].toLowerCase()) {
+ case "add":
+ if (args.length != 5) {
+ sender.sendMessage("Usage: /damagemodifier add ");
+ return true;
+ }
+ add_modifier(target, args[2].toUpperCase(), args[3].toUpperCase(), Float.parseFloat(args[4]));
+ break;
+ case "remove":
+ if (args.length != 3) {
+ sender.sendMessage("Usage: /damagemodifier remove ");
+ return true;
+ }
+ remove_modifier(target, args[2]);
+ break;
+ case "list":
+ if (args.length != 2) {
+ sender.sendMessage("Usage: /damagemodifier list ");
+ return true;
+ }
+ list_modifiers(target, sender);
+ break;
+ case "read":
+ if(!(sender instanceof Player)) {
+ sender.sendMessage(ChatColor.RED + "This command can only be used by a player.");
+ return true;
+ }
+ Player player = (Player) sender;
+ readItemAttributes(player);
+ break;
+ default:
+ sender.sendMessage(ChatColor.RED + "Error resolving subcommand.");
+ return false;
+ }
+ return true;
+ }
+
+ private void add_modifier(Player target, String type, String action, float value) {
+ NBTManager nbtManager = PowerNBT.getApi();
+ NBTCompound nbtData = nbtManager.read(target);
+ NBTCompound forgeData = (NBTCompound) nbtData.get("ForgeData");
+
+ // If there's no ForgeData compound, create it.
+ if (forgeData == null) {
+ forgeData = new NBTCompound();
+ nbtData.put("ForgeData", forgeData);
+ }
+
+ // Check for DamageModifiers list. If it doesn't exist, create it.
+ List damageModifiers = (List) forgeData.get("DamageModifiers");
+ if (damageModifiers == null) {
+ damageModifiers = new ArrayList<>();
+ forgeData.put("DamageModifiers", damageModifiers);
+ }
+ nbtManager.write(target, nbtData);
+
+ nbtData = nbtManager.read(target);
+ forgeData = (NBTCompound) nbtData.get("ForgeData");
+ damageModifiers = (List) forgeData.get("DamageModifiers");
+ boolean found = false;
+ for (NBTCompound modifier : damageModifiers) {
+ if (type.equals(modifier.get("type"))) {
+ modifier.put("action", action);
+ modifier.put("value", value);
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ NBTCompound newModifier = new NBTCompound();
+ newModifier.put("type", type);
+ newModifier.put("action", action);
+ newModifier.put("value", value);
+
+ damageModifiers.add(newModifier);
+ }
+ // Write the modified NBT data back to the player
+ nbtManager.write(target, nbtData);
+
+ target.sendMessage(ChatColor.GREEN + "Damage modifier added!");
+ }
+
+ private void remove_modifier(Player target, String type) {
+ NBTManager nbtManager = PowerNBT.getApi();
+ NBTCompound nbtData = nbtManager.read(target);
+ NBTCompound forgeData = (NBTCompound) nbtData.get("ForgeData");
+
+ if (forgeData == null) {
+ target.sendMessage(ChatColor.RED + "This player doesn't have any damage modifiers.");
+ return;
+ }
+
+ List damageModifiers = (List) forgeData.get("DamageModifiers");
+ if (damageModifiers == null || damageModifiers.isEmpty()) {
+ target.sendMessage(ChatColor.RED + "This player doesn't have any damage modifiers.");
+ return;
+ }
+
+ boolean found = false;
+ Iterator iterator = damageModifiers.iterator();
+ while (iterator.hasNext()) {
+ NBTCompound modifier = iterator.next();
+ if (type.equalsIgnoreCase((String) modifier.get("type"))) {
+ iterator.remove();
+ found = true;
+ break;
+ }
+ }
+
+ // Write the updated NBT data back to the player
+ nbtManager.write(target, nbtData);
+
+ if (found) {
+ target.sendMessage(ChatColor.GREEN + "Damage modifier removed!");
+ } else {
+ target.sendMessage(ChatColor.RED + "Specified damage modifier type not found.");
+ }
+ }
+ private void list_modifiers(Player target, CommandSender sender) {
+ NBTManager nbtManager = PowerNBT.getApi();
+ NBTCompound nbtData = nbtManager.read(target);
+ NBTCompound forgeData = (NBTCompound) nbtData.get("ForgeData");
+
+ if (forgeData == null) {
+ sender.sendMessage(ChatColor.RED + "This player doesn't have any damage modifiers.");
+ return;
+ }
+
+ List damageModifiers = (List) forgeData.get("DamageModifiers");
+ if (damageModifiers == null || damageModifiers.isEmpty()) {
+ sender.sendMessage(ChatColor.RED + "This player doesn't have any damage modifiers.");
+ return;
+ }
+
+ sender.sendMessage(ChatColor.YELLOW + "Damage Modifiers for " + target.getName() + ":");
+ for (NBTCompound modifier : damageModifiers) {
+ String type = (String) modifier.get("type");
+ String action = (String) modifier.get("action");
+ float value = ((Number) modifier.get("value")).floatValue();
+ sender.sendMessage(ChatColor.GOLD + "Type: " + type + ", Action: " + action + ", Value: " + value);
+ }
+ }
+ private void readItemAttributes(Player player) {
+ String itemName = player.getInventory().getItemInHand().getType().toString();
+ List damageTypes = plugin.get_items_config().getStringList("items." + itemName);
+
+ if (damageTypes == null || damageTypes.isEmpty()) {
+ player.sendMessage(ChatColor.RED + "This item doesn't have any defined damage types.");
+ return;
+ }
+
+ player.sendMessage(ChatColor.GREEN + "Damage types for " + itemName + ":");
+ for (String type : damageTypes) {
+ player.sendMessage("- " + type);
+ }
+ }
+
+}
diff --git a/src/main/java/com/zivilon/damagemodifiers/listeners/damage_listener.java b/src/main/java/com/zivilon/damagemodifiers/listeners/damage_listener.java
new file mode 100644
index 0000000..e3cc77f
--- /dev/null
+++ b/src/main/java/com/zivilon/damagemodifiers/listeners/damage_listener.java
@@ -0,0 +1,40 @@
+package com.zivilon.damagemodifiers.listeners;
+
+import org.bukkit.entity.Entity;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+
+import me.dpohvar.powernbt.api.NBTCompound;
+import me.dpohvar.powernbt.api.NBTManager;
+import me.dpohvar.powernbt.PowerNBT;
+
+import com.zivilon.damagemodifiers.types.vanilla_damage;
+import com.zivilon.damagemodifiers.types.weapon_damage;
+
+public class damage_listener implements Listener {
+
+ @EventHandler
+ public void onEntityDamage(EntityDamageEvent event) {
+ Entity damaged = event.getEntity();
+
+ NBTManager nbtManager = PowerNBT.getApi();
+ NBTCompound nbtData = nbtManager.read(damaged);
+ NBTCompound forgeData = (NBTCompound) nbtData.get("ForgeData");
+
+ // Check for the DamageModifiers list
+ if (forgeData == null || !forgeData.containsKey("DamageModifiers")) {
+ return; // Exit if there's no DamageModifiers list
+ }
+
+ if (event.getCause() == EntityDamageEvent.DamageCause.ENTITY_ATTACK && event instanceof EntityDamageByEntityEvent) {
+ weapon_damage.handle((EntityDamageByEntityEvent) event);
+ } else {
+ vanilla_damage.handle(event);
+ }
+ }
+
+
+
+}
diff --git a/src/main/java/com/zivilon/damagemodifiers/types/vanilla_damage.java b/src/main/java/com/zivilon/damagemodifiers/types/vanilla_damage.java
new file mode 100644
index 0000000..150cbab
--- /dev/null
+++ b/src/main/java/com/zivilon/damagemodifiers/types/vanilla_damage.java
@@ -0,0 +1,71 @@
+package com.zivilon.damagemodifiers.types;
+
+import org.bukkit.event.entity.EntityDamageEvent;
+import me.dpohvar.powernbt.api.NBTCompound;
+import me.dpohvar.powernbt.api.NBTManager;
+import me.dpohvar.powernbt.PowerNBT;
+
+import org.bukkit.entity.LivingEntity;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+
+public class vanilla_damage {
+
+ private static final Map CAUSE_ALIASES = new HashMap<>();
+
+ static {
+ CAUSE_ALIASES.put(EntityDamageEvent.DamageCause.FIRE_TICK, "FIRE");
+ CAUSE_ALIASES.put(EntityDamageEvent.DamageCause.LAVA, "FIRE");
+ }
+
+ public static void handle(EntityDamageEvent event) {
+ EntityDamageEvent.DamageCause cause = event.getCause();
+ String damageType = CAUSE_ALIASES.getOrDefault(cause, cause.name());
+
+ if (cause == EntityDamageEvent.DamageCause.POISON && event.getEntity() instanceof LivingEntity) {
+ LivingEntity livingEntity = (LivingEntity) event.getEntity();
+ double damage = event.getDamage();
+ double healthAfterDamage = livingEntity.getHealth() - damage;
+
+ if (healthAfterDamage <= 0) {
+ event.setDamage(livingEntity.getHealth() - 1);
+ return; // exit after adjusting the damage
+ }
+ }
+
+ // Fetch Damage Modifiers
+ NBTManager nbtManager = PowerNBT.getApi();
+ NBTCompound nbtData = nbtManager.read(event.getEntity());
+ NBTCompound forgeData = (NBTCompound) nbtData.get("ForgeData");
+ List