feat(hamster-chain-break): 将掉落物集中在一个方块
This commit is contained in:
@@ -3,7 +3,10 @@ package cn.hamster3.mc.plugin.chain.breaks;
|
||||
import cn.hamster3.mc.plugin.chain.breaks.core.ConfigManager;
|
||||
import cn.hamster3.mc.plugin.chain.breaks.listener.MainListener;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ChainBreakPlugin extends JavaPlugin {
|
||||
private static ChainBreakPlugin instance;
|
||||
@@ -23,4 +26,28 @@ public class ChainBreakPlugin extends JavaPlugin {
|
||||
Bukkit.getPluginManager().registerEvents(MainListener.INSTANCE, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||
if (args.length < 1) {
|
||||
return true;
|
||||
}
|
||||
switch (args[0]) {
|
||||
case "reload": {
|
||||
if (!sender.hasPermission("hamster.chain.break.admin")) {
|
||||
sender.sendMessage("§c你没有这个权限");
|
||||
return true;
|
||||
}
|
||||
ConfigManager.init();
|
||||
sender.sendMessage("§a插件重载完成");
|
||||
return true;
|
||||
}
|
||||
case "": {
|
||||
|
||||
}
|
||||
default: {
|
||||
sender.sendMessage("§c未找到该指令");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,9 +3,7 @@ package cn.hamster3.mc.plugin.chain.breaks.listener;
|
||||
import cn.hamster3.mc.plugin.chain.breaks.config.ToolGroup;
|
||||
import cn.hamster3.mc.plugin.chain.breaks.core.ConfigManager;
|
||||
import cn.hamster3.mc.plugin.chain.breaks.util.ChainBreakUtils;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -45,18 +43,26 @@ public final class MainListener implements Listener {
|
||||
if (group == null) {
|
||||
return;
|
||||
}
|
||||
if (!ChainBreakUtils.isToolGroupBlock(group, event.getBlock())) {
|
||||
Block eventBlock = event.getBlock();
|
||||
if (!ChainBreakUtils.isToolGroupBlock(group, eventBlock)) {
|
||||
return;
|
||||
}
|
||||
List<Block> resultBlocks = new ArrayList<>();
|
||||
bfsSearchBlock(group, resultBlocks, Collections.singletonList(event.getBlock()));
|
||||
resultBlocks.remove(event.getBlock());
|
||||
if (resultBlocks.isEmpty()) {
|
||||
List<Block> searchResultBlocks = new ArrayList<>();
|
||||
bfsSearchBlock(group, searchResultBlocks, Collections.singletonList(eventBlock));
|
||||
searchResultBlocks.remove(eventBlock);
|
||||
if (searchResultBlocks.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<ItemStack> dropItemList = new ArrayList<>();
|
||||
World blockWorld = eventBlock.getWorld();
|
||||
Location blockLocation = eventBlock.getLocation();
|
||||
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||
for (Block block : resultBlocks) {
|
||||
block.breakNaturally(stack);
|
||||
for (Block block : searchResultBlocks) {
|
||||
dropItemList.addAll(block.getDrops(stack, player));
|
||||
block.setType(Material.AIR, true);
|
||||
}
|
||||
for (ItemStack dropItem : dropItemList) {
|
||||
blockWorld.dropItem(blockLocation, dropItem);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -65,9 +71,10 @@ public final class MainListener implements Listener {
|
||||
if (durability >= maxDurability) {
|
||||
return;
|
||||
}
|
||||
for (Block block : resultBlocks) {
|
||||
for (Block block : searchResultBlocks) {
|
||||
boolean leaves = block.getType().name().endsWith("_LEAVES");
|
||||
if (block.breakNaturally(stack)) {
|
||||
dropItemList.addAll(block.getDrops(stack, player));
|
||||
block.setType(Material.AIR, true);
|
||||
if (!leaves) {
|
||||
durability++;
|
||||
if (durability >= maxDurability) {
|
||||
@@ -75,6 +82,8 @@ public final class MainListener implements Listener {
|
||||
}
|
||||
}
|
||||
}
|
||||
for (ItemStack dropItem : dropItemList) {
|
||||
blockWorld.dropItem(blockLocation, dropItem);
|
||||
}
|
||||
if (durability >= maxDurability) {
|
||||
player.getInventory().setItemInMainHand(null);
|
||||
|
@@ -14,7 +14,7 @@ public class ChainBreakUtils {
|
||||
if (stack == null) {
|
||||
return null;
|
||||
}
|
||||
String name = stack.getType().name().toLowerCase();
|
||||
String name = stack.getType().name();
|
||||
for (ToolGroup group : ConfigManager.getToolGroups()) {
|
||||
for (String type : group.getToolTypes()) {
|
||||
if (name.matches(type)) {
|
||||
@@ -27,7 +27,7 @@ public class ChainBreakUtils {
|
||||
|
||||
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
||||
public static boolean isToolGroupBlock(@NotNull ToolGroup group, @NotNull Block block) {
|
||||
String name = block.getType().name().toLowerCase();
|
||||
String name = block.getType().name();
|
||||
for (String type : group.getBlockTypes()) {
|
||||
if (name.matches(type)) {
|
||||
return true;
|
||||
|
@@ -7,14 +7,17 @@ tool-groups:
|
||||
axe:
|
||||
# 该工具组内的物品名称,支持正则表达式匹配
|
||||
tool-types:
|
||||
- ".*_axe"
|
||||
- ".*_AXE"
|
||||
- "THERMAL_FLUX_SAW"
|
||||
# 该工具组内可以连锁破坏的方块,支持正则表达式匹配
|
||||
block-types:
|
||||
- ".*_wood"
|
||||
- ".*_log"
|
||||
- ".*_leaves"
|
||||
- ".*_WOOD"
|
||||
- ".*_LOG"
|
||||
- ".*_LEAVES"
|
||||
pickaxe:
|
||||
tool-types:
|
||||
- ".*_pickaxe"
|
||||
- ".*_PICKAXE"
|
||||
- ".*MANASTEEL_PICK"
|
||||
- "THERMAL_FLUX_DRILL"
|
||||
block-types:
|
||||
- ".*_ore"
|
||||
- ".*_ORE"
|
||||
|
@@ -6,3 +6,8 @@ api-version: 1.13
|
||||
author: MiniDay
|
||||
website: https://github.com/MiniDay/hamster-little-plugins
|
||||
description: 仓鼠连锁破坏:一键挖矿 & 砍树
|
||||
|
||||
commands:
|
||||
hamster-chain-break:
|
||||
aliases: [ chain-break ]
|
||||
description: 连锁破坏相关指令
|
||||
|
Reference in New Issue
Block a user