commit 1313d407ba061c3c1920d197736729bf4e129592 Author: XiaoLFeng Date: Wed Aug 2 18:00:07 2023 +0800 initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..301d5d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,116 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +target/ + +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next + +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar +.flattened-pom.xml + +# Common working directory +run/ +Server/ +src/main/resources/plugin.yml +pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..bc0fb24 --- /dev/null +++ b/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + com.frontleaves + ChainMining + 1.0-SNAPSHOT + jar + + chainMining + + 1.20 连锁挖矿 + + 1.8 + UTF-8 + + https://www.frontleaves.com/ + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + org.spigotmc + spigot-api + 1.20-R0.1-SNAPSHOT + provided + + + org.projectlombok + lombok + 1.18.28 + + + org.jetbrains + annotations + 23.0.0 + compile + + + diff --git a/src/main/java/com/frontleaves/chainmining/ChainMining.java b/src/main/java/com/frontleaves/chainmining/ChainMining.java new file mode 100644 index 0000000..033d14c --- /dev/null +++ b/src/main/java/com/frontleaves/chainmining/ChainMining.java @@ -0,0 +1,27 @@ +package com.frontleaves.chainmining; + +import com.frontleaves.chainmining.commands.PluginMenu; +import com.frontleaves.chainmining.listeners.MineralsListener; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * @author 锋楪技术(深圳)有限公司 + */ +public final class ChainMining extends JavaPlugin { + + @Override + public void onEnable() { + // 载入插件指令 + getCommand("fycm").setExecutor(new PluginMenu(this)); + // 载入监听器 + getServer().getPluginManager().registerEvents(new MineralsListener(), this); + // Plugin startup logic + getLogger().info("插件启动成功"); + } + + @Override + public void onDisable() { + // Plugin shutdown logic + getLogger().info("插件卸载完毕"); + } +} diff --git a/src/main/java/com/frontleaves/chainmining/listeners/MineralsListener.java b/src/main/java/com/frontleaves/chainmining/listeners/MineralsListener.java new file mode 100644 index 0000000..db6a1f0 --- /dev/null +++ b/src/main/java/com/frontleaves/chainmining/listeners/MineralsListener.java @@ -0,0 +1,127 @@ +package com.frontleaves.chainmining.listeners; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +/** + * @author 锋楪技术(深圳)有限公司 + */ + +public class MineralsListener implements Listener { + + private static int blockNumber; + private static int expToGive; + private static int damage; + private static int maxDurability; + + @EventHandler + public void coalBlock(BlockBreakEvent breakEvent) { + // 检测这个方块能否掉落 + if (breakEvent.getPlayer().isSneaking()) { + if (breakEvent.isDropItems()) { + Block getBlock = breakEvent.getBlock(); + if (getBlock.getType() == Material.COAL_ORE || getBlock.getType() == Material.DEEPSLATE_COAL_ORE + || getBlock.getType() == Material.LAPIS_ORE || getBlock.getType() == Material.DEEPSLATE_LAPIS_ORE + || getBlock.getType() == Material.COPPER_ORE || getBlock.getType() == Material.DEEPSLATE_COPPER_ORE + || getBlock.getType() == Material.IRON_ORE || getBlock.getType() == Material.DEEPSLATE_IRON_ORE + || getBlock.getType() == Material.GOLD_ORE || getBlock.getType() == Material.DEEPSLATE_GOLD_ORE + || getBlock.getType() == Material.DIAMOND_ORE || getBlock.getType() == Material.DEEPSLATE_DIAMOND_ORE + || getBlock.getType() == Material.REDSTONE_ORE || getBlock.getType() == Material.DEEPSLATE_REDSTONE_ORE + || getBlock.getType() == Material.EMERALD_ORE || getBlock.getType() == Material.DEEPSLATE_EMERALD_ORE + || getBlock.getType() == Material.NETHER_GOLD_ORE + || getBlock.getType() == Material.NETHER_QUARTZ_ORE + || getBlock.getType() == Material.ANCIENT_DEBRIS) { + if (breakEvent.getPlayer().getGameMode() == GameMode.SURVIVAL) { + // 预备事务 + Player getPlayer = breakEvent.getPlayer(); // 获取破坏方块的玩家 + Damageable getPlayerDamageable = (Damageable) breakEvent.getPlayer().getInventory().getItemInMainHand().getItemMeta(); + maxDurability = getPlayer.getInventory().getItemInMainHand().getType().getMaxDurability(); + if (getPlayerDamageable != null && getPlayerDamageable.hasDamage()) { + // 最大耐久检查 + damage = getPlayerDamageable.getDamage(); + } + blockNumber = 0; + expToGive = 0; + if (maxDurability - damage > 0) { + // 执行操作 + callbackCorruption(breakEvent.getBlock()); + // 执行完毕处理完成事务 + if (getPlayerDamageable != null && getPlayerDamageable.hasDamage()) { + // 最大耐久检查 + if (maxDurability - damage - blockNumber <= 0) { + if (blockNumber == 0) { + breakEvent.setCancelled(true); + } + getPlayer.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); + getPlayer.playSound(getPlayer.getLocation(), Sound.ENTITY_ITEM_BREAK, 1.0f, 1.0f); + } else { + getPlayerDamageable.setDamage(damage + blockNumber); + getPlayer.getInventory().getItemInMainHand().setItemMeta(getPlayerDamageable); + } + } + getPlayer.giveExp(expToGive); + } + } + } + } + } + } + + private void callbackCorruption(@NotNull Block block) { + for (BlockFace blockFace : BlockFace.values()) { + Block blocker = block.getRelative(blockFace); + repetitiveStatement(blocker); + } + } + + private void repetitiveStatement(@NotNull Block getBlock) { + while (getBlock.getType() == Material.COAL_ORE || getBlock.getType() == Material.DEEPSLATE_COAL_ORE + || getBlock.getType() == Material.LAPIS_ORE || getBlock.getType() == Material.DEEPSLATE_LAPIS_ORE + || getBlock.getType() == Material.COPPER_ORE || getBlock.getType() == Material.DEEPSLATE_COPPER_ORE + || getBlock.getType() == Material.IRON_ORE || getBlock.getType() == Material.DEEPSLATE_IRON_ORE + || getBlock.getType() == Material.GOLD_ORE || getBlock.getType() == Material.DEEPSLATE_GOLD_ORE + || getBlock.getType() == Material.DIAMOND_ORE || getBlock.getType() == Material.DEEPSLATE_DIAMOND_ORE + || getBlock.getType() == Material.REDSTONE_ORE || getBlock.getType() == Material.DEEPSLATE_REDSTONE_ORE + || getBlock.getType() == Material.EMERALD_ORE || getBlock.getType() == Material.DEEPSLATE_EMERALD_ORE + || getBlock.getType() == Material.NETHER_GOLD_ORE + || getBlock.getType() == Material.NETHER_QUARTZ_ORE + || getBlock.getType() == Material.ANCIENT_DEBRIS) { + // 检查耐久是否允许继续执行 + if (maxDurability - damage - blockNumber > 0) { + // 检查允许的可获得经验内容 + Random random = new Random(); + if (getBlock.getType() == Material.COAL_ORE || getBlock.getType() == Material.DEEPSLATE_COAL_ORE) { + expToGive += random.nextInt(2); + } else if (getBlock.getType() == Material.LAPIS_ORE || getBlock.getType() == Material.DEEPSLATE_LAPIS_ORE) { + expToGive += random.nextInt(3) + 2; + } else if (getBlock.getType() == Material.REDSTONE_ORE || getBlock.getType() == Material.DEEPSLATE_REDSTONE_ORE) { + expToGive += random.nextInt(4) + 1; + } else if (getBlock.getType() == Material.EMERALD_ORE || getBlock.getType() == Material.DEEPSLATE_EMERALD_ORE + || getBlock.getType() == Material.DIAMOND_ORE || getBlock.getType() == Material.DEEPSLATE_DIAMOND_ORE) { + expToGive += random.nextInt(5) + 3; + } else if (getBlock.getType() == Material.NETHER_GOLD_ORE) { + expToGive += random.nextInt(2); + } else if (getBlock.getType() == Material.NETHER_QUARTZ_ORE) { + expToGive += random.nextInt(5) + 2; + } + getBlock.breakNaturally(); + blockNumber++; + callbackCorruption(getBlock); + } else { + break; + } + } + } +}