From 111364ca054372518e9c80c157155d04e34fc54b Mon Sep 17 00:00:00 2001 From: Barazok Date: Sun, 11 Oct 2020 17:25:44 +0200 Subject: [PATCH] Working on project --- .../listeners/MineClassListeners.java | 37 ++++++----------- .../mineclass/utils/AppliedStatus.java | 18 ++++----- .../mineclass/utils/ClassItemPossessed.java | 6 +-- .../mineclass/utils/SmeltingEngine.java | 40 ++++++++++++++++++- 4 files changed, 63 insertions(+), 38 deletions(-) diff --git a/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java b/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java index 5caffeb..a20b666 100644 --- a/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java +++ b/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java @@ -11,18 +11,16 @@ import org.bukkit.entity.Player; import org.bukkit.entity.SmallFireball; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import java.util.List; import java.util.stream.Collectors; @@ -113,7 +111,7 @@ public class MineClassListeners implements Listener { return true; } return event.getCursor() != null - && ClassWrapper.isItemForbidden(player, event.getCursor().getType()); + && ClassWrapper.isItemForbidden(player, event.getCursor().getType()); } return false; } @@ -131,29 +129,18 @@ public class MineClassListeners implements Listener { } @EventHandler - public void on(BlockBreakEvent event) { + public void on(BlockDropItemEvent event) { Player player = event.getPlayer(); if (AppliedStatus.getInstance().isFireDwarf(player.getName())) { - List itemStacks = - event.getBlock().getDrops().stream() - .map( - itemStack -> { - ItemStack smelted = SmeltingEngine.smelt(itemStack); - if (smelted != null) { - return smelted; - } else return itemStack; - }) - .collect(Collectors.toList()); - if (!itemStacks.isEmpty()) { - event.setCancelled(true); - itemStacks.forEach( - itemStack -> - event - .getBlock() - .getWorld() - .dropItemNaturally(event.getBlock().getLocation(), itemStack)); - event.getBlock().setType(Material.AIR); - } + event + .getItems() + .forEach( + item -> { + ItemStack smelted = SmeltingEngine.getInstance().smelt(player, event.getBlock().getLocation(), item.getItemStack()); + if (smelted != null) { + item.setItemStack(smelted); + } + }); } } diff --git a/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java b/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java index 1302e5b..d5e1dea 100644 --- a/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java +++ b/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java @@ -30,39 +30,39 @@ public class AppliedStatus implements Serializable { return INSTANCE; } - public void setDwarf(String playerName, boolean dwarf) { + public synchronized void setDwarf(String playerName, boolean dwarf) { this.dwarf.put(playerName, dwarf); } - public void setElf(String playerName, boolean elf) { + public synchronized void setElf(String playerName, boolean elf) { this.elf.put(playerName, elf); } - public void setFireDwarf(String playerName, boolean fireDwarf) { + public synchronized void setFireDwarf(String playerName, boolean fireDwarf) { this.fireDwarf.put(playerName, fireDwarf); } - public void setNaga(String playerName, boolean naga) { + public synchronized void setNaga(String playerName, boolean naga) { this.naga.put(playerName, naga); } - public boolean isDwarf(String playerName) { + public synchronized boolean isDwarf(String playerName) { return dwarf.getOrDefault(playerName, false); } - public boolean isElf(String playerName) { + public synchronized boolean isElf(String playerName) { return elf.getOrDefault(playerName, false); } - public boolean isFireDwarf(String playerName) { + public synchronized boolean isFireDwarf(String playerName) { return fireDwarf.getOrDefault(playerName, false); } - public boolean isNaga(String playerName) { + public synchronized boolean isNaga(String playerName) { return naga.getOrDefault(playerName, false); } - public boolean hasAClass(String playerName) { + public synchronized boolean hasAClass(String playerName) { return dwarf.getOrDefault(playerName, false) || elf.getOrDefault(playerName, false) || fireDwarf.getOrDefault(playerName, false) diff --git a/src/main/java/net/babamod/mineclass/utils/ClassItemPossessed.java b/src/main/java/net/babamod/mineclass/utils/ClassItemPossessed.java index 7d4d3b7..8d88752 100644 --- a/src/main/java/net/babamod/mineclass/utils/ClassItemPossessed.java +++ b/src/main/java/net/babamod/mineclass/utils/ClassItemPossessed.java @@ -26,17 +26,17 @@ public class ClassItemPossessed { return INSTANCE; } - public void addItems(String playerName, List itemStacks) { + public synchronized void addItems(String playerName, List itemStacks) { List itemStackList = itemsPossessed.getOrDefault(playerName, new ArrayList<>()); itemStackList.addAll(itemStacks); itemsPossessed.put(playerName, itemStackList); } - public void clearItems(String playerName) { + public synchronized void clearItems(String playerName) { itemsPossessed.put(playerName, new ArrayList<>()); } - public List getItems(String playerName) { + public synchronized List getItems(String playerName) { return itemsPossessed.get(playerName); } } diff --git a/src/main/java/net/babamod/mineclass/utils/SmeltingEngine.java b/src/main/java/net/babamod/mineclass/utils/SmeltingEngine.java index 912c192..54dab01 100644 --- a/src/main/java/net/babamod/mineclass/utils/SmeltingEngine.java +++ b/src/main/java/net/babamod/mineclass/utils/SmeltingEngine.java @@ -1,15 +1,38 @@ package net.babamod.mineclass.utils; import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.Player; import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; +import java.util.HashMap; import java.util.Iterator; public class SmeltingEngine { + /** Instance unique pré-initialisée */ + private static SmeltingEngine INSTANCE; - public static ItemStack smelt(ItemStack itemStack) { + private final HashMap> expModifier; + + /** Constructeur privé */ + private SmeltingEngine() { + expModifier = new HashMap<>(); + } + + /** Point d'accès pour l'instance unique du singleton */ + public static synchronized SmeltingEngine getInstance() { + if (INSTANCE == null) { + INSTANCE = new SmeltingEngine(); + } + + return INSTANCE; + } + + public synchronized ItemStack smelt(Player player, Location location, ItemStack itemStack) { ItemStack result = null; Iterator iter = Bukkit.recipeIterator(); while (iter.hasNext()) { @@ -17,6 +40,21 @@ public class SmeltingEngine { if (!(recipe instanceof FurnaceRecipe)) continue; if (((FurnaceRecipe) recipe).getInput().getType() != itemStack.getType()) continue; result = recipe.getResult(); + expModifier.computeIfAbsent(player.getName(), k -> new HashMap<>()); + expModifier.get(player.getName()).putIfAbsent(result.getType(), 0.0f); + expModifier + .get(player.getName()) + .put( + result.getType(), + expModifier.get(player.getName()).get(result.getType()) + + ((FurnaceRecipe) recipe).getExperience()); + if (expModifier.get(player.getName()).get(result.getType()) >= 1) { + int exp = expModifier.get(player.getName()).get(result.getType()).intValue(); + player.getWorld().spawn(location, ExperienceOrb.class).setExperience(exp); + expModifier + .get(player.getName()) + .put(result.getType(), expModifier.get(player.getName()).get(result.getType()) - exp); + } break; } return result;