mirror of
https://github.com/Xiao-MoMi/Custom-Fishing.git
synced 2025-12-26 02:19:21 +00:00
custom durability
This commit is contained in:
@@ -86,6 +86,7 @@ public class ActionManagerImpl implements ActionManager {
|
||||
this.registerHologramAction();
|
||||
this.registerFakeItemAction();
|
||||
this.registerFishFindAction();
|
||||
this.registerFoodAction();
|
||||
}
|
||||
|
||||
public void load() {
|
||||
@@ -329,6 +330,25 @@ public class ActionManagerImpl implements ActionManager {
|
||||
});
|
||||
}
|
||||
|
||||
private void registerFoodAction() {
|
||||
registerAction("food", (args, chance) -> {
|
||||
int food = (int) (ConfigUtils.getDoubleValue(args) * 2);
|
||||
return condition -> {
|
||||
if (Math.random() > chance) return;
|
||||
Player player = condition.getPlayer();
|
||||
player.setFoodLevel(player.getFoodLevel() + food);
|
||||
};
|
||||
});
|
||||
registerAction("saturation", (args, chance) -> {
|
||||
double saturation = ConfigUtils.getDoubleValue(args);
|
||||
return condition -> {
|
||||
if (Math.random() > chance) return;
|
||||
Player player = condition.getPlayer();
|
||||
player.setSaturation((float) (player.getSaturation() + saturation));
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
private void registerExpAction() {
|
||||
registerAction("exp", (args, chance) -> {
|
||||
int xp = (int) args;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package net.momirealms.customfishing.mechanic.fishing;
|
||||
|
||||
import com.destroystokyo.paper.event.player.PlayerJumpEvent;
|
||||
import de.tr7zw.changeme.nbtapi.NBTCompound;
|
||||
import de.tr7zw.changeme.nbtapi.NBTItem;
|
||||
import net.momirealms.customfishing.CustomFishingPluginImpl;
|
||||
import net.momirealms.customfishing.api.common.Pair;
|
||||
@@ -46,14 +47,13 @@ import net.momirealms.customfishing.api.util.LogUtils;
|
||||
import net.momirealms.customfishing.api.util.WeightUtils;
|
||||
import net.momirealms.customfishing.mechanic.requirement.RequirementManagerImpl;
|
||||
import net.momirealms.customfishing.setting.CFConfig;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.Statistic;
|
||||
import net.momirealms.customfishing.util.ItemUtils;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.entity.*;
|
||||
import org.bukkit.event.*;
|
||||
import org.bukkit.event.inventory.InventoryPickupItemEvent;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -141,30 +141,6 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
this.selectState(event);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPickUp(PlayerAttemptPickupItemEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem().getItemStack();
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
if (!nbtItem.hasTag("owner")) return;
|
||||
if (!Objects.equals(nbtItem.getString("owner"), event.getPlayer().getName())) {
|
||||
event.setCancelled(true);
|
||||
} else {
|
||||
nbtItem.removeKey("owner");
|
||||
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMove(InventoryPickupItemEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem().getItemStack();
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
if (!nbtItem.hasTag("owner")) return;
|
||||
nbtItem.removeKey("owner");
|
||||
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
this.removeHook(event.getPlayer().getUniqueId());
|
||||
@@ -200,19 +176,6 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onConsumeItem(PlayerItemConsumeEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem();
|
||||
String id = plugin.getItemManager().getAnyItemID(itemStack);
|
||||
Loot loot = plugin.getLootManager().getLoot(id);
|
||||
if (loot != null) {
|
||||
Condition condition = new Condition(event.getPlayer());
|
||||
GlobalSettings.triggerLootActions(ActionTrigger.CONSUME, condition);
|
||||
loot.triggerActions(ActionTrigger.CONSUME, condition);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onLeftClick(PlayerInteractEvent event) {
|
||||
if (event.useItemInHand() == Event.Result.DENY)
|
||||
@@ -227,30 +190,6 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteractWithUtils(PlayerInteractEvent event) {
|
||||
if (event.useItemInHand() == Event.Result.DENY)
|
||||
return;
|
||||
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return;
|
||||
if (event.getAction() != org.bukkit.event.block.Action.RIGHT_CLICK_AIR || event.getAction() != org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK)
|
||||
return;
|
||||
|
||||
String id = plugin.getItemManager().getAnyItemID(itemStack);
|
||||
EffectCarrier carrier = plugin.getEffectManager().getEffect("util", id);
|
||||
if (carrier == null)
|
||||
return;
|
||||
Condition condition = new Condition(event.getPlayer());
|
||||
if (!RequirementManager.isRequirementsMet(carrier.getRequirements(), condition))
|
||||
return;
|
||||
Action[] actions = carrier.getActions(ActionTrigger.INTERACT);
|
||||
if (actions != null)
|
||||
for (Action action : actions) {
|
||||
action.trigger(condition);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeHook(UUID uuid) {
|
||||
FishHook hook = hookCacheMap.remove(uuid);
|
||||
@@ -275,6 +214,25 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
case CAUGHT_ENTITY -> onCaughtEntity(event);
|
||||
case CAUGHT_FISH -> onCaughtFish(event);
|
||||
case BITE -> onBite(event);
|
||||
case IN_GROUND -> onInGround(event);
|
||||
}
|
||||
}
|
||||
|
||||
private void onInGround(PlayerFishEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
FishHook hook = event.getHook();
|
||||
if (player.getGameMode() != GameMode.CREATIVE) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
if (itemStack.getType() != Material.FISHING_ROD) itemStack = player.getInventory().getItemInOffHand();
|
||||
if (itemStack.getType() == Material.FISHING_ROD) {
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
NBTCompound compound = nbtItem.getCompound("CustomFishing");
|
||||
if (compound != null && compound.hasTag("max_dur")) {
|
||||
event.setCancelled(true);
|
||||
hook.remove();
|
||||
ItemUtils.loseDurability(itemStack, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,6 +313,19 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
// should not reach this but in case
|
||||
entity.remove();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (player.getGameMode() != GameMode.CREATIVE) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
if (itemStack.getType() != Material.FISHING_ROD) itemStack = player.getInventory().getItemInOffHand();
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
NBTCompound nbtCompound = nbtItem.getCompound("CustomFishing");
|
||||
if (nbtCompound != null && nbtCompound.hasTag("max_dur")) {
|
||||
event.getHook().remove();
|
||||
event.setCancelled(true);
|
||||
ItemUtils.loseDurability(itemStack, 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -463,6 +434,7 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
success(temp, event.getHook());
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -489,21 +461,27 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
if (bonus != null)
|
||||
tempFishingState.getEffect().merge(bonus);
|
||||
|
||||
if (gamingPlayer.isSuccessful())
|
||||
success(tempFishingState, fishHook);
|
||||
else
|
||||
fail(tempFishingState, fishHook);
|
||||
|
||||
gamingPlayer.cancel();
|
||||
gamingPlayerMap.remove(uuid);
|
||||
plugin.getScheduler().runTaskSync(() -> {
|
||||
|
||||
if (player.getGameMode() != GameMode.CREATIVE)
|
||||
outer: {
|
||||
ItemStack rod = tempFishingState.getPreparation().getRodItemStack();
|
||||
PlayerItemDamageEvent damageEvent = new PlayerItemDamageEvent(player, rod, 1, 1);
|
||||
Bukkit.getPluginManager().callEvent(damageEvent);
|
||||
if (damageEvent.isCancelled()) {
|
||||
break outer;
|
||||
}
|
||||
ItemUtils.loseDurability(rod, 1);
|
||||
}
|
||||
|
||||
fishHook.remove();
|
||||
ItemStack rod = tempFishingState.getPreparation().getRodItemStack();
|
||||
PlayerItemDamageEvent damageEvent = new PlayerItemDamageEvent(player, rod, 1);
|
||||
Bukkit.getPluginManager().callEvent(damageEvent);
|
||||
if (damageEvent.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (gamingPlayer.isSuccessful())
|
||||
success(tempFishingState, fishHook);
|
||||
else
|
||||
fail(tempFishingState, fishHook);
|
||||
}, fishHook.getLocation());
|
||||
}
|
||||
|
||||
@@ -519,24 +497,21 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
}
|
||||
}
|
||||
|
||||
plugin.getScheduler().runTaskSync(() -> {
|
||||
// call event
|
||||
FishingResultEvent fishingResultEvent = new FishingResultEvent(
|
||||
fishingPreparation.getPlayer(),
|
||||
FishingResultEvent.Result.FAILURE,
|
||||
loot,
|
||||
fishingPreparation.getArgs()
|
||||
);
|
||||
Bukkit.getPluginManager().callEvent(fishingResultEvent);
|
||||
if (fishingResultEvent.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
// call event
|
||||
FishingResultEvent fishingResultEvent = new FishingResultEvent(
|
||||
fishingPreparation.getPlayer(),
|
||||
FishingResultEvent.Result.FAILURE,
|
||||
loot,
|
||||
fishingPreparation.getArgs()
|
||||
);
|
||||
Bukkit.getPluginManager().callEvent(fishingResultEvent);
|
||||
if (fishingResultEvent.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
GlobalSettings.triggerLootActions(ActionTrigger.FAILURE, fishingPreparation);
|
||||
loot.triggerActions(ActionTrigger.FAILURE, fishingPreparation);
|
||||
fishingPreparation.triggerActions(ActionTrigger.FAILURE);
|
||||
|
||||
}, hook.getLocation());
|
||||
GlobalSettings.triggerLootActions(ActionTrigger.FAILURE, fishingPreparation);
|
||||
loot.triggerActions(ActionTrigger.FAILURE, fishingPreparation);
|
||||
fishingPreparation.triggerActions(ActionTrigger.FAILURE);
|
||||
}
|
||||
|
||||
public void success(TempFishingState state, FishHook hook) {
|
||||
@@ -546,47 +521,44 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
var player = fishingPreparation.getPlayer();
|
||||
fishingPreparation.insertArg("{size-multiplier}", String.format("%.2f", effect.getSizeMultiplier()));
|
||||
|
||||
plugin.getScheduler().runTaskSync(() -> {
|
||||
// call event
|
||||
FishingResultEvent fishingResultEvent = new FishingResultEvent(
|
||||
player,
|
||||
FishingResultEvent.Result.SUCCESS,
|
||||
loot,
|
||||
fishingPreparation.getArgs()
|
||||
);
|
||||
Bukkit.getPluginManager().callEvent(fishingResultEvent);
|
||||
if (fishingResultEvent.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// call event
|
||||
FishingResultEvent fishingResultEvent = new FishingResultEvent(
|
||||
player,
|
||||
FishingResultEvent.Result.SUCCESS,
|
||||
loot,
|
||||
fishingPreparation.getArgs()
|
||||
);
|
||||
Bukkit.getPluginManager().callEvent(fishingResultEvent);
|
||||
if (fishingResultEvent.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (loot.getType()) {
|
||||
case ITEM -> {
|
||||
int amount = (int) effect.getMultipleLootChance();
|
||||
amount += Math.random() < (effect.getMultipleLootChance() - amount) ? 2 : 1;
|
||||
// build the items for multiple times instead of using setAmount() to make sure that each item is unique
|
||||
if (loot.getID().equals("vanilla")) {
|
||||
ItemStack itemStack = vanillaLootMap.remove(player.getUniqueId());
|
||||
if (itemStack != null) {
|
||||
fishingPreparation.insertArg("{loot}", "<lang:item.minecraft." + itemStack.getType().toString().toLowerCase() + ">");
|
||||
for (int i = 0; i < amount; i++) {
|
||||
plugin.getItemManager().dropItem(hook.getLocation(), player.getLocation(), itemStack.clone());
|
||||
doSuccessActions(loot, effect, fishingPreparation, player);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch (loot.getType()) {
|
||||
case ITEM -> {
|
||||
int amount = (int) effect.getMultipleLootChance();
|
||||
amount += Math.random() < (effect.getMultipleLootChance() - amount) ? 2 : 1;
|
||||
// build the items for multiple times instead of using setAmount() to make sure that each item is unique
|
||||
if (loot.getID().equals("vanilla")) {
|
||||
ItemStack itemStack = vanillaLootMap.remove(player.getUniqueId());
|
||||
if (itemStack != null) {
|
||||
fishingPreparation.insertArg("{loot}", "<lang:item.minecraft." + itemStack.getType().toString().toLowerCase() + ">");
|
||||
for (int i = 0; i < amount; i++) {
|
||||
plugin.getItemManager().dropItem(player, hook.getLocation(), player.getLocation(), loot, fishingPreparation.getArgs());
|
||||
plugin.getItemManager().dropItem(hook.getLocation(), player.getLocation(), itemStack.clone());
|
||||
doSuccessActions(loot, effect, fishingPreparation, player);
|
||||
}
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
for (int i = 0; i < amount; i++) {
|
||||
plugin.getItemManager().dropItem(player, hook.getLocation(), player.getLocation(), loot, fishingPreparation.getArgs());
|
||||
doSuccessActions(loot, effect, fishingPreparation, player);
|
||||
}
|
||||
}
|
||||
case ENTITY -> plugin.getEntityManager().summonEntity(hook.getLocation(), player.getLocation(), loot);
|
||||
case BLOCK -> plugin.getBlockManager().summonBlock(player, hook.getLocation(), player.getLocation(), loot);
|
||||
return;
|
||||
}
|
||||
doSuccessActions(loot, effect, fishingPreparation, player);
|
||||
}, hook.getLocation());
|
||||
case ENTITY -> plugin.getEntityManager().summonEntity(hook.getLocation(), player.getLocation(), loot);
|
||||
case BLOCK -> plugin.getBlockManager().summonBlock(player, hook.getLocation(), player.getLocation(), loot);
|
||||
}
|
||||
doSuccessActions(loot, effect, fishingPreparation, player);
|
||||
}
|
||||
|
||||
private void doSuccessActions(Loot loot, Effect effect, FishingPreparation fishingPreparation, Player player) {
|
||||
@@ -683,7 +655,7 @@ public class FishingManagerImpl implements Listener, FishingManager {
|
||||
return;
|
||||
}
|
||||
plugin.debug("Game: " + random);
|
||||
startFishingGame(player, gamePair.get().left().getGameSetting(effect), gamePair.get().right());
|
||||
startFishingGame(player, Objects.requireNonNull(gamePair.get().left().getGameSetting(effect)), gamePair.get().right());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -24,6 +24,12 @@ import net.momirealms.customfishing.api.common.Key;
|
||||
import net.momirealms.customfishing.api.common.Pair;
|
||||
import net.momirealms.customfishing.api.common.Tuple;
|
||||
import net.momirealms.customfishing.api.manager.ItemManager;
|
||||
import net.momirealms.customfishing.api.manager.RequirementManager;
|
||||
import net.momirealms.customfishing.api.mechanic.GlobalSettings;
|
||||
import net.momirealms.customfishing.api.mechanic.action.Action;
|
||||
import net.momirealms.customfishing.api.mechanic.action.ActionTrigger;
|
||||
import net.momirealms.customfishing.api.mechanic.condition.Condition;
|
||||
import net.momirealms.customfishing.api.mechanic.effect.EffectCarrier;
|
||||
import net.momirealms.customfishing.api.mechanic.item.BuildableItem;
|
||||
import net.momirealms.customfishing.api.mechanic.item.ItemBuilder;
|
||||
import net.momirealms.customfishing.api.mechanic.item.ItemLibrary;
|
||||
@@ -33,26 +39,40 @@ import net.momirealms.customfishing.compatibility.item.CustomFishingItemImpl;
|
||||
import net.momirealms.customfishing.compatibility.item.VanillaItemImpl;
|
||||
import net.momirealms.customfishing.compatibility.papi.PlaceholderManagerImpl;
|
||||
import net.momirealms.customfishing.setting.CFConfig;
|
||||
import net.momirealms.customfishing.util.ItemUtils;
|
||||
import net.momirealms.customfishing.util.NBTUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryPickupItemEvent;
|
||||
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
||||
import org.bukkit.event.player.PlayerItemMendEvent;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
import org.bukkit.inventory.meta.Damageable;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.plaf.IconUIResource;
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class ItemManagerImpl implements ItemManager {
|
||||
public class ItemManagerImpl implements ItemManager, Listener {
|
||||
|
||||
private static ItemManager instance;
|
||||
private final CustomFishingPlugin plugin;
|
||||
@@ -71,9 +91,11 @@ public class ItemManagerImpl implements ItemManager {
|
||||
public void load() {
|
||||
this.loadItemsFromPluginFolder();
|
||||
LogUtils.info("Loaded " + buildableItemMap.size() + " items.");
|
||||
Bukkit.getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
|
||||
public void unload() {
|
||||
HandlerList.unregisterAll(this);
|
||||
HashMap<Key, BuildableItem> tempMap = new HashMap<>(this.buildableItemMap);
|
||||
this.buildableItemMap.clear();
|
||||
for (Map.Entry<Key, BuildableItem> entry : tempMap.entrySet()) {
|
||||
@@ -673,4 +695,99 @@ public class ItemManagerImpl implements ItemManager {
|
||||
|
||||
return actualAmount;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPickUp(PlayerAttemptPickupItemEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem().getItemStack();
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
if (!nbtItem.hasTag("owner")) return;
|
||||
if (!Objects.equals(nbtItem.getString("owner"), event.getPlayer().getName())) {
|
||||
event.setCancelled(true);
|
||||
} else {
|
||||
nbtItem.removeKey("owner");
|
||||
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMove(InventoryPickupItemEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem().getItemStack();
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
if (!nbtItem.hasTag("owner")) return;
|
||||
nbtItem.removeKey("owner");
|
||||
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onConsumeItem(PlayerItemConsumeEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem();
|
||||
String id = getAnyItemID(itemStack);
|
||||
Loot loot = plugin.getLootManager().getLoot(id);
|
||||
if (loot != null) {
|
||||
Condition condition = new Condition(event.getPlayer());
|
||||
GlobalSettings.triggerLootActions(ActionTrigger.CONSUME, condition);
|
||||
loot.triggerActions(ActionTrigger.CONSUME, condition);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onRepairItem(PrepareAnvilEvent event) {
|
||||
ItemStack result = event.getInventory().getResult();
|
||||
if (result == null || result.getType() == Material.AIR) return;
|
||||
NBTItem nbtItem = new NBTItem(result);
|
||||
NBTCompound compound = nbtItem.getCompound("CustomFishing");
|
||||
if (compound == null || !compound.hasTag("max_dur")) return;
|
||||
if (!(result.getItemMeta() instanceof Damageable damageable)) {
|
||||
return;
|
||||
}
|
||||
int max_dur = compound.getInteger("max_dur");
|
||||
compound.setInteger("cur_dur", (int) (max_dur * (1 - (double) damageable.getDamage() / result.getType().getMaxDurability())));
|
||||
event.setResult(nbtItem.getItem());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMending(PlayerItemMendEvent event) {
|
||||
if (event.isCancelled()) return;
|
||||
ItemStack itemStack = event.getItem();
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
NBTCompound compound = nbtItem.getCompound("CustomFishing");
|
||||
if (compound == null) return;
|
||||
event.setCancelled(true);
|
||||
ItemUtils.addDurability(itemStack, event.getRepairAmount());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteractWithUtils(PlayerInteractEvent event) {
|
||||
if (event.useItemInHand() == Event.Result.DENY)
|
||||
return;
|
||||
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
|
||||
if (itemStack.getType() == Material.AIR)
|
||||
return;
|
||||
if (event.getAction() != org.bukkit.event.block.Action.RIGHT_CLICK_AIR || event.getAction() != org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK)
|
||||
return;
|
||||
|
||||
String id = getAnyItemID(itemStack);
|
||||
EffectCarrier carrier = plugin.getEffectManager().getEffect("util", id);
|
||||
if (carrier == null)
|
||||
return;
|
||||
Condition condition = new Condition(event.getPlayer());
|
||||
if (!RequirementManager.isRequirementsMet(carrier.getRequirements(), condition))
|
||||
return;
|
||||
Action[] actions = carrier.getActions(ActionTrigger.INTERACT);
|
||||
if (actions != null)
|
||||
for (Action action : actions) {
|
||||
action.trigger(condition);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCustomFishingItem(ItemStack itemStack) {
|
||||
if (itemStack == null || itemStack.getType() == Material.AIR) return false;
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
return nbtItem.hasTag("CustomFishing");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package net.momirealms.customfishing.util;
|
||||
|
||||
import de.tr7zw.changeme.nbtapi.NBTCompound;
|
||||
import de.tr7zw.changeme.nbtapi.NBTItem;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.Damageable;
|
||||
|
||||
public class ItemUtils {
|
||||
|
||||
public static void loseDurability(ItemStack itemStack, int amount) {
|
||||
if (itemStack.getItemMeta() instanceof Damageable damageable) {
|
||||
if (damageable.isUnbreakable()) {
|
||||
return;
|
||||
}
|
||||
int unBreakingLevel = itemStack.getEnchantmentLevel(Enchantment.DURABILITY);
|
||||
if (Math.random() > (double) 1 / (unBreakingLevel + 1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
NBTCompound cfCompound = nbtItem.getCompound("CustomFishing");
|
||||
if (cfCompound != null && cfCompound.hasTag("max_dur")) {
|
||||
int max = cfCompound.getInteger("max_dur");
|
||||
int current = cfCompound.getInteger("cur_dur") - amount;
|
||||
cfCompound.setInteger("cur_dur", current);
|
||||
int damage = (int) (itemStack.getType().getMaxDurability() * (1 - ((double) current / max)));
|
||||
nbtItem.setInteger("Damage", damage);
|
||||
if (current > 0) {
|
||||
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
|
||||
} else {
|
||||
itemStack.setAmount(0);
|
||||
}
|
||||
} else {
|
||||
int damage = damageable.getDamage() + amount;
|
||||
if (damage > itemStack.getType().getMaxDurability()) {
|
||||
itemStack.setAmount(0);
|
||||
} else {
|
||||
damageable.setDamage(damage);
|
||||
itemStack.setItemMeta(damageable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void addDurability(ItemStack itemStack, int amount) {
|
||||
if (itemStack.getItemMeta() instanceof Damageable damageable) {
|
||||
if (damageable.isUnbreakable()) {
|
||||
return;
|
||||
}
|
||||
NBTItem nbtItem = new NBTItem(itemStack);
|
||||
NBTCompound cfCompound = nbtItem.getCompound("CustomFishing");
|
||||
if (cfCompound != null && cfCompound.hasTag("max_dur")) {
|
||||
int max = cfCompound.getInteger("max_dur");
|
||||
int current = Math.min(max, cfCompound.getInteger("cur_dur") + amount);
|
||||
cfCompound.setInteger("cur_dur", current);
|
||||
int damage = (int) (itemStack.getType().getMaxDurability() * (1 - ((double) current / max)));
|
||||
nbtItem.setInteger("Damage", damage);
|
||||
itemStack.setItemMeta(nbtItem.getItem().getItemMeta());
|
||||
} else {
|
||||
int damage = Math.max(damageable.getDamage() - amount, 0);
|
||||
damageable.setDamage(damage);
|
||||
itemStack.setItemMeta(damageable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user