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.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;
}
}
}
}

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.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,17 +71,20 @@ 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)) {
if (!leaves) {
durability++;
if (durability >= maxDurability) {
break;
}
dropItemList.addAll(block.getDrops(stack, player));
block.setType(Material.AIR, true);
if (!leaves) {
durability++;
if (durability >= maxDurability) {
break;
}
}
}
for (ItemStack dropItem : dropItemList) {
blockWorld.dropItem(blockLocation, dropItem);
}
if (durability >= maxDurability) {
player.getInventory().setItemInMainHand(null);
player.getWorld().playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1);

View File

@@ -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;

View File

@@ -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"

View File

@@ -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: 连锁破坏相关指令