fixed #252 double drops

This commit is contained in:
Indyuce 2021-08-20 17:11:12 +02:00
parent e9b417f191
commit c1a98bc5a5
2 changed files with 196 additions and 204 deletions

View File

@ -1,13 +1,12 @@
package net.Indyuce.mmocore.api.droptable.dropitem; package net.Indyuce.mmocore.api.droptable.dropitem;
import org.apache.commons.lang.Validate; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.droptable.DropTable; import net.Indyuce.mmocore.api.droptable.DropTable;
import net.Indyuce.mmocore.api.droptable.condition.ConditionInstance; import net.Indyuce.mmocore.api.droptable.condition.ConditionInstance;
import net.Indyuce.mmocore.api.loot.LootBuilder; import net.Indyuce.mmocore.api.loot.LootBuilder;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import io.lumine.mythic.lib.api.MMOLineConfig; import org.apache.commons.lang.Validate;
public class DropTableDropItem extends DropItem { public class DropTableDropItem extends DropItem {
private final DropTable dropTable; private final DropTable dropTable;
@ -26,8 +25,9 @@ public class DropTableDropItem extends DropItem {
public void collect(LootBuilder builder) { public void collect(LootBuilder builder) {
PlayerData data = builder.getEntity(); PlayerData data = builder.getEntity();
if (!data.isOnline()) return; if (!data.isOnline()) return;
if (dropTable.areConditionsMet(new ConditionInstance(data.getPlayer()))) if (dropTable.areConditionsMet(new ConditionInstance(data.getPlayer())))
for (int j = 0; j < rollAmount(); j++) for (int j = 0; j < rollAmount(); j++)
builder.addLoot(dropTable.collect(builder)); dropTable.collect(builder);
} }
} }

View File

@ -1,25 +1,5 @@
package net.Indyuce.mmocore.listener; package net.Indyuce.mmocore.listener;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.utils.Schedulers; import io.lumine.mythic.utils.Schedulers;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
@ -28,8 +8,23 @@ import net.Indyuce.mmocore.api.block.BlockInfo.BlockInfoOption;
import net.Indyuce.mmocore.api.block.VanillaBlockType; import net.Indyuce.mmocore.api.block.VanillaBlockType;
import net.Indyuce.mmocore.api.droptable.condition.ConditionInstance; import net.Indyuce.mmocore.api.droptable.condition.ConditionInstance;
import net.Indyuce.mmocore.api.event.CustomBlockMineEvent; import net.Indyuce.mmocore.api.event.CustomBlockMineEvent;
import net.Indyuce.mmocore.api.loot.LootBuilder;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import java.util.ArrayList;
import java.util.List;
public class BlockListener implements Listener { public class BlockListener implements Listener {
private static final BlockFace[] order = {BlockFace.UP, BlockFace.DOWN, BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH}; private static final BlockFace[] order = {BlockFace.UP, BlockFace.DOWN, BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH};
@ -90,14 +85,19 @@ public class BlockListener implements Listener {
canBreak = false; canBreak = false;
} }
/*
* Find the block drops
*/
boolean conditionsMet = !info.hasDropTable() || info.getDropTable().areConditionsMet(new ConditionInstance(player));
List<ItemStack> drops = conditionsMet ? info.getDropTable().collect(new LootBuilder(PlayerData.get(player), 0)) : new ArrayList<>();
/* /*
* Calls the event and listen for cancel & for drops changes... also * Calls the event and listen for cancel & for drops changes... also
* allows to apply tool durability & enchants to drops, etc. * allows to apply tool durability & enchants to drops, etc.
*/ */
CustomBlockMineEvent called = new CustomBlockMineEvent(PlayerData.get(player), block, info, canBreak); CustomBlockMineEvent called = new CustomBlockMineEvent(PlayerData.get(player), block, info, drops, !canBreak);
Bukkit.getPluginManager().callEvent(called); Bukkit.getPluginManager().callEvent(called);
if (called.isCancelled()) {
if (called.isCancelled() || !called.canBreak()) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -117,20 +117,19 @@ public class BlockListener implements Listener {
* Apply triggers, add experience info to the event so the other events * Apply triggers, add experience info to the event so the other events
* can give exp to other TOOLS and display HOLOGRAMS * can give exp to other TOOLS and display HOLOGRAMS
*/ */
if (info.hasTriggers() && !block.hasMetadata("player_placed")) { if (conditionsMet && info.hasTriggers() && !block.hasMetadata("player_placed")) {
if (!info.hasDropTable() || info.hasDropTable() && info.getDropTable().areConditionsMet(new ConditionInstance(player))) {
PlayerData playerData = PlayerData.get(player); PlayerData playerData = PlayerData.get(player);
info.getTriggers().forEach(trigger -> trigger.apply(playerData)); info.getTriggers().forEach(trigger -> trigger.apply(playerData));
} }
}
/* /*
* Apply drop tables * Apply drop tables
*
* You can apply the drop tables even if the block was placed by a player.
*/ */
if (info.hasDropTable()) { if (conditionsMet && info.hasDropTable()) {
Location dropLocation = getSafeDropLocation(block, Location dropLocation = getSafeDropLocation(block, !block.getType().isSolid() || !(info.regenerates() && info.getRegenerationInfo().hasTemporaryBlock()));
!block.getType().isSolid() || !(info.regenerates() && info.getRegenerationInfo().hasTemporaryBlock())); for (ItemStack drop : drops)
for (ItemStack drop : called.getDrops())
if (drop.getType() != Material.AIR && drop.getAmount() > 0) if (drop.getType() != Material.AIR && drop.getAmount() > 0)
UtilityMethods.dropItemNaturally(dropLocation, drop); UtilityMethods.dropItemNaturally(dropLocation, drop);
} }
@ -138,12 +137,8 @@ public class BlockListener implements Listener {
/* /*
* Finally enable block regen. * Finally enable block regen.
*/ */
if (info.hasRegen()) { if (info.hasRegen())
Schedulers.sync().runLater(()-> { Schedulers.sync().runLater(() -> MMOCore.plugin.mineManager.initialize(info.startRegeneration(Bukkit.createBlockData(savedData), block.getLocation()), !temporaryBlock), 1);
MMOCore.plugin.mineManager.initialize(info.startRegeneration(Bukkit.createBlockData(savedData), block.getLocation()), !temporaryBlock);
}, 1);
}
} }
/* /*
@ -156,13 +151,11 @@ public class BlockListener implements Listener {
event.getBlock().removeMetadata("player_placed", MMOCore.plugin); event.getBlock().removeMetadata("player_placed", MMOCore.plugin);
} }
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void registerPlayerPlacedBlocksTag(BlockPlaceEvent event) { public void registerPlayerPlacedBlocksTag(BlockPlaceEvent event) {
event.getBlock().setMetadata("player_placed", new FixedMetadataValue(MMOCore.plugin, true)); event.getBlock().setMetadata("player_placed", new FixedMetadataValue(MMOCore.plugin, true));
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void blockPistonExtend(BlockPistonExtendEvent event) { public void blockPistonExtend(BlockPistonExtendEvent event) {
Block movedBlock = event.getBlock(); Block movedBlock = event.getBlock();
@ -194,7 +187,6 @@ public class BlockListener implements Listener {
* Allows to mark cobblestone generated by cobblestone generators so that * Allows to mark cobblestone generated by cobblestone generators so that
* exp is not gained by these blocks * exp is not gained by these blocks
*/ */
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void cobblestoneGeneratorHandling(BlockFormEvent event) { public void cobblestoneGeneratorHandling(BlockFormEvent event) {
if (event.getBlock().hasMetadata("player_placed")) if (event.getBlock().hasMetadata("player_placed"))