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.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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,9 +71,10 @@ 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));
|
||||||
|
block.setType(Material.AIR, true);
|
||||||
if (!leaves) {
|
if (!leaves) {
|
||||||
durability++;
|
durability++;
|
||||||
if (durability >= maxDurability) {
|
if (durability >= maxDurability) {
|
||||||
@@ -75,6 +82,8 @@ public final class MainListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (ItemStack dropItem : dropItemList) {
|
||||||
|
blockWorld.dropItem(blockLocation, dropItem);
|
||||||
}
|
}
|
||||||
if (durability >= maxDurability) {
|
if (durability >= maxDurability) {
|
||||||
player.getInventory().setItemInMainHand(null);
|
player.getInventory().setItemInMainHand(null);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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"
|
||||||
|
@@ -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: 连锁破坏相关指令
|
||||||
|
Reference in New Issue
Block a user