feat(hamster-chain-break): 将掉落物集中在一个方块

This commit is contained in:
2023-06-05 18:19:06 +08:00
parent 8d26dfef2b
commit 4239e07698
5 changed files with 69 additions and 25 deletions

View File

@@ -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.core.ConfigManager;
import cn.hamster3.mc.plugin.chain.breaks.listener.MainListener; import cn.hamster3.mc.plugin.chain.breaks.listener.MainListener;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
public class ChainBreakPlugin extends JavaPlugin { public class ChainBreakPlugin extends JavaPlugin {
private static ChainBreakPlugin instance; private static ChainBreakPlugin instance;
@@ -23,4 +26,28 @@ public class ChainBreakPlugin extends JavaPlugin {
Bukkit.getPluginManager().registerEvents(MainListener.INSTANCE, this); 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;
}
}
}
} }

View File

@@ -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.config.ToolGroup;
import cn.hamster3.mc.plugin.chain.breaks.core.ConfigManager; import cn.hamster3.mc.plugin.chain.breaks.core.ConfigManager;
import cn.hamster3.mc.plugin.chain.breaks.util.ChainBreakUtils; import cn.hamster3.mc.plugin.chain.breaks.util.ChainBreakUtils;
import org.bukkit.GameMode; import org.bukkit.*;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -45,18 +43,26 @@ public final class MainListener implements Listener {
if (group == null) { if (group == null) {
return; return;
} }
if (!ChainBreakUtils.isToolGroupBlock(group, event.getBlock())) { Block eventBlock = event.getBlock();
if (!ChainBreakUtils.isToolGroupBlock(group, eventBlock)) {
return; return;
} }
List<Block> resultBlocks = new ArrayList<>(); List<Block> searchResultBlocks = new ArrayList<>();
bfsSearchBlock(group, resultBlocks, Collections.singletonList(event.getBlock())); bfsSearchBlock(group, searchResultBlocks, Collections.singletonList(eventBlock));
resultBlocks.remove(event.getBlock()); searchResultBlocks.remove(eventBlock);
if (resultBlocks.isEmpty()) { if (searchResultBlocks.isEmpty()) {
return; return;
} }
List<ItemStack> dropItemList = new ArrayList<>();
World blockWorld = eventBlock.getWorld();
Location blockLocation = eventBlock.getLocation();
if (player.getGameMode() == GameMode.CREATIVE) { if (player.getGameMode() == GameMode.CREATIVE) {
for (Block block : resultBlocks) { for (Block block : searchResultBlocks) {
block.breakNaturally(stack); dropItemList.addAll(block.getDrops(stack, player));
block.setType(Material.AIR, true);
}
for (ItemStack dropItem : dropItemList) {
blockWorld.dropItem(blockLocation, dropItem);
} }
return; return;
} }
@@ -65,17 +71,20 @@ public final class MainListener implements Listener {
if (durability >= maxDurability) { if (durability >= maxDurability) {
return; return;
} }
for (Block block : resultBlocks) { for (Block block : searchResultBlocks) {
boolean leaves = block.getType().name().endsWith("_LEAVES"); boolean leaves = block.getType().name().endsWith("_LEAVES");
if (block.breakNaturally(stack)) { dropItemList.addAll(block.getDrops(stack, player));
if (!leaves) { block.setType(Material.AIR, true);
durability++; if (!leaves) {
if (durability >= maxDurability) { durability++;
break; if (durability >= maxDurability) {
} break;
} }
} }
} }
for (ItemStack dropItem : dropItemList) {
blockWorld.dropItem(blockLocation, dropItem);
}
if (durability >= maxDurability) { if (durability >= maxDurability) {
player.getInventory().setItemInMainHand(null); player.getInventory().setItemInMainHand(null);
player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1);

View File

@@ -14,7 +14,7 @@ public class ChainBreakUtils {
if (stack == null) { if (stack == null) {
return null; return null;
} }
String name = stack.getType().name().toLowerCase(); String name = stack.getType().name();
for (ToolGroup group : ConfigManager.getToolGroups()) { for (ToolGroup group : ConfigManager.getToolGroups()) {
for (String type : group.getToolTypes()) { for (String type : group.getToolTypes()) {
if (name.matches(type)) { if (name.matches(type)) {
@@ -27,7 +27,7 @@ public class ChainBreakUtils {
@SuppressWarnings("BooleanMethodIsAlwaysInverted") @SuppressWarnings("BooleanMethodIsAlwaysInverted")
public static boolean isToolGroupBlock(@NotNull ToolGroup group, @NotNull Block block) { 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()) { for (String type : group.getBlockTypes()) {
if (name.matches(type)) { if (name.matches(type)) {
return true; return true;

View File

@@ -7,14 +7,17 @@ tool-groups:
axe: axe:
# 该工具组内的物品名称,支持正则表达式匹配 # 该工具组内的物品名称,支持正则表达式匹配
tool-types: tool-types:
- ".*_axe" - ".*_AXE"
- "THERMAL_FLUX_SAW"
# 该工具组内可以连锁破坏的方块,支持正则表达式匹配 # 该工具组内可以连锁破坏的方块,支持正则表达式匹配
block-types: block-types:
- ".*_wood" - ".*_WOOD"
- ".*_log" - ".*_LOG"
- ".*_leaves" - ".*_LEAVES"
pickaxe: pickaxe:
tool-types: tool-types:
- ".*_pickaxe" - ".*_PICKAXE"
- ".*MANASTEEL_PICK"
- "THERMAL_FLUX_DRILL"
block-types: block-types:
- ".*_ore" - ".*_ORE"

View File

@@ -6,3 +6,8 @@ api-version: 1.13
author: MiniDay author: MiniDay
website: https://github.com/MiniDay/hamster-little-plugins website: https://github.com/MiniDay/hamster-little-plugins
description: 仓鼠连锁破坏:一键挖矿 & 砍树 description: 仓鼠连锁破坏:一键挖矿 & 砍树
commands:
hamster-chain-break:
aliases: [ chain-break ]
description: 连锁破坏相关指令