Added new Repair Percent Stat for consumables. Put in a number between 0 and 1, and this is the percentage it will repair.

UNTESTED!!!!!!!!!!

Also tweaked RepairItemEvent to support this
This commit is contained in:
BuildTools 2021-05-01 11:57:40 -05:00
parent b13c285d85
commit 46ae7171b9
3 changed files with 101 additions and 0 deletions

View File

@ -242,6 +242,7 @@ public class ItemStats {
RANDOM_UNSOCKET = new RandomUnsocket(),
//todo CAN_UNSOCKET = new CanUnsocket(),
REPAIR = new RepairPower(),
REPAIR_PERCENT = new RepairPowerPercent(),
REPAIR_TYPE = new RepairType(),
KNOCKBACK = new DoubleStat("KNOCKBACK", VersionMaterial.IRON_HORSE_ARMOR.toMaterial(), "Knockback", new String[]{"Using this musket will knock", "the user back if positive."}, new String[]{"musket"}),
RECOIL = new DoubleStat("RECOIL", VersionMaterial.IRON_HORSE_ARMOR.toMaterial(), "Recoil", new String[]{"Corresponds to the shooting innacuracy."}, new String[]{"musket"}),

View File

@ -14,6 +14,7 @@ public class RepairItemEvent extends PlayerDataEvent {
private final NBTItem target;
private int repaired;
private double repairedPercent;
/**
* Called when a player repairs an item using a consumable
@ -35,6 +36,14 @@ public class RepairItemEvent extends PlayerDataEvent {
this.repaired = repaired;
}
public RepairItemEvent(PlayerData playerData, VolatileMMOItem consumable, NBTItem target, double repaired) {
super(playerData);
this.consumable = consumable;
this.target = target;
this.repairedPercent = repaired;
}
public VolatileMMOItem getConsumable() {
return consumable;
}
@ -47,6 +56,10 @@ public class RepairItemEvent extends PlayerDataEvent {
return repaired;
}
public double getRepairedPercent(){
return repairedPercent;
}
public void setRepaired(int repaired) {
this.repaired = repaired;
}

View File

@ -0,0 +1,87 @@
package net.Indyuce.mmoitems.stat;
import io.lumine.mythic.lib.api.item.NBTItem;
import net.Indyuce.mmoitems.ItemStats;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.api.Type;
import net.Indyuce.mmoitems.api.event.item.RepairItemEvent;
import net.Indyuce.mmoitems.api.interaction.Consumable;
import net.Indyuce.mmoitems.api.interaction.util.DurabilityItem;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.util.message.Message;
import net.Indyuce.mmoitems.listener.CustomSoundListener;
import net.Indyuce.mmoitems.stat.type.ConsumableItemInteraction;
import net.Indyuce.mmoitems.stat.type.DoubleStat;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class RepairPowerPercent extends DoubleStat implements ConsumableItemInteraction {
public RepairPowerPercent() {
super("REPAIR_PERCENT", Material.DAMAGED_ANVIL, "Repair Percentage",
new String[] { "The percentage of total durability to repair", "When dropped onto an item." },
new String[]{"consumable"});
}
@Override
public boolean handleConsumableEffect(@NotNull InventoryClickEvent event, @NotNull PlayerData playerData, @NotNull Consumable consumable, @NotNull NBTItem target, @Nullable Type targetType) {
double repairPower = consumable.getNBTItem().getStat(ItemStats.REPAIR_PERCENT.getId());
if (repairPower <= 0)
return false;
// custom durability
Player player = playerData.getPlayer();
final String type = "MMOITEMS_REPAIR_TYPE";
if((target.hasTag(type) || consumable.getNBTItem().hasTag(type)) &&
!target.getString(type).equals(consumable.getNBTItem().getString(type))) {
Message.UNABLE_TO_REPAIR.format(ChatColor.RED, "#item#", MMOUtils.getDisplayName(target.getItem())).send(player);
player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
return false;
}
if (target.hasTag("MMOITEMS_DURABILITY")) {
RepairItemEvent called = new RepairItemEvent(playerData, consumable.getMMOItem(), target, repairPower);
Bukkit.getPluginManager().callEvent(called);
if (called.isCancelled())
return false;
DurabilityItem durItem = new DurabilityItem(player, target);
if (durItem.getDurability() < durItem.getMaxDurability()) {
target.getItem().setItemMeta(durItem.addDurability(durItem.getMaxDurability()/called.getRepaired()).toItem().getItemMeta());
Message.REPAIRED_ITEM
.format(ChatColor.YELLOW, "#item#", MMOUtils.getDisplayName(target.getItem()), "#amount#", "" + called.getRepaired())
.send(player);
CustomSoundListener.playConsumableSound(consumable.getItem(), player);
}
return true;
}
// vanilla durability
if (!target.getBoolean("Unbreakable") && target.getItem().hasItemMeta() && target.getItem().getItemMeta() instanceof Damageable
&& ((Damageable) target.getItem().getItemMeta()).getDamage() > 0) {
RepairItemEvent called = new RepairItemEvent(playerData, consumable.getMMOItem(), target, repairPower);
Bukkit.getPluginManager().callEvent(called);
if (called.isCancelled())
return false;
ItemMeta meta = target.getItem().getItemMeta();
((Damageable) meta).setDamage(Math.max(0, ((Damageable) meta).getDamage() - called.getRepaired()));
target.getItem().setItemMeta(meta);
Message.REPAIRED_ITEM.format(ChatColor.YELLOW, "#item#", MMOUtils.getDisplayName(target.getItem()), "#amount#", "" + called.getRepaired())
.send(player);
CustomSoundListener.playConsumableSound(consumable.getItem(), player);
return true;
}
return false;
}
}