生存战争玩家社区 · 资源大厅

连锁

作者:用户_19fcd3a591b · 更新于

using System; using System.Collections.Generic; using SurvivalCraft.API; using SurvivalCraft.API.Blocks; using SurvivalCraft.API.Entities; using SurvivalCraft.API.Items; using SurvivalCraft.API.Events; using SurvivalCraft.API.World; namespace VeinMinerMod { public class VeinMiner : Mod { public override string Name = "连锁挖矿"; public override string Author = "你的名字"; public override Version Version = new Version(1, 0, 0); public override string Description = "可配置XYZ轴范围的连锁挖矿,潜行时触发"; // ========== 配置项(改这里就行) ========== /// X轴最大连锁范围(左右) public static int MaxXRange = 5; /// Y轴最大连锁范围(上下) public static int MaxYRange = 8; /// Z轴最大连锁范围(前后) public static int MaxZRange = 5; /// 单次最多连锁挖多少个方块(防止炸服) public static int MaxBlocksPerVein = 64; /// 是否需要潜行才触发连锁 public static bool RequireSneak = true; /// 连锁挖矿是否消耗工具耐久 public static bool ConsumeDurability = true; /// 工具耐久剩多少时停止连锁(防止工具坏掉) public static int StopAtDurability = 1; // 可连锁的方块ID列表 public static HashSet MineableBlocks = new HashSet { // 矿石 "coal ore", "iron ore", "copper ore", "gold ore", "diamond ore", "sulfur ore", "saltpeter ore", // 石头类 "granite", "basalt", "stone", // 木头 "oak log", "birch log", "spruce log", "wood" }; // 可触发连锁的工具类型 public static HashSet ValidTools = new HashSet { "wooden pickaxe", "stone pickaxe", "copper pickaxe", "iron pickaxe", "diamond pickaxe", "wooden axe", "stone axe", "iron axe", "diamond axe" }; public override void OnLoad() { // 注册方块破坏事件 EventManager.BlockBreaking += OnBlockBreaking; API.GetLogger().Info("[连锁挖矿] 加载完成!"); API.GetLogger().Info($"范围设置: X={MaxXRange}, Y={MaxYRange}, Z={MaxZRange}"); API.GetLogger().Info($"最大连锁数: {MaxBlocksPerVein}, 潜行触发: {RequireSneak}"); } public override void OnUnload() { EventManager.BlockBreaking = OnBlockBreaking; } private void OnBlockBreaking(BlockBreakingEventArgs e) { // 如果是连锁挖矿触发的,不处理(防止递归) if (e.IsFromVeinMiner) return; Player player = e.Player; if (player == null) return; // 检查是否需要潜行 if (RequireSneak && !player.IsSneaking) return; // 检查手上工具 ItemStack heldItem = player.Inventory.GetHeldItem(); if (heldItem == null || !ValidTools.Contains(heldItem.Item.InternalName)) return; // 检查方块是否可连锁 string blockName = e.Block.InternalName; if (!MineableBlocks.Contains(blockName)) return; // 开始连锁挖矿 DoVeinMine(player, e.BlockPosition, blockName, heldItem); } private void DoVeinMine(Player player, BlockPos startPos, string blockType, ItemStack tool) { // BFS 广度优先搜索,找所有相连的同类方块 var toMine = new Queue (); var visited = new HashSet (); var result = new List (); toMine.Enqueue(startPos); visited.Add(startPos); int minedCount = 0; int currentDurability = GetToolDurability(tool); while (toMine.Count 0 && minedCount

在社区中打开完整帖子