简单自动拾取

简单自动拾取

使用Auto Pickup模组,立即将从开采方块中获得的物品直接收集到你的背包中。生物掉落及更多内容均可配置!

AutoPickup

FabricNeoforgeForge [![Minecraft](https://img.shields.io/badge/minecraft-1.20 -- 26.2-green?style=for-the-badge)](https://img.shields.io/badge/minecraft-1.20 -- 26.2-green?style=for-the-badge) [![License](https://img.shields.io/badge/license-AGPL 3.0-lightgrey?style=for-the-badge)](https://img.shields.io/badge/license-AGPL 3.0-lightgrey?style=for-the-badge)

AutoPickup 是一款高度可配置的服务端模组,可自动拾取物品和经验球。它具备会话追踪、多层级权限系统以及广泛的模组兼容性,确保掉落物能正确归属于对应玩家,即使在使用高速挖掘模组或参与团队战斗时也是如此。


✨ 功能特性

核心功能

  • 🎒 无缝拾取: 破坏方块和击杀生物掉落的物品将立即加入你的背包
  • ⭐ 智能经验处理: 经验会被缓存并在短暂延迟后应用,确保工具先消耗耐久度,然后 再触发经验修补
  • 🚀 无延迟体验: 阻止物品和经验球实体生成,降低服务器负载
  • 📦 溢出保护: 如果你的背包已满,物品会安全地掉落在你脚下
  • 🔧 精细控制: 通过命令或配置界面独立开关各项功能

高级功能

  • 👥 生物战利品分配: 与参与击杀的附近玩家共享生物掉落物和经验
  • 🎮 每玩家权限: 服务器管理员可为特定玩家覆盖设置
  • 💾 客户端配置档案: 自动为每个服务器/世界保存配置档案,实现无缝切换
  • 🔌 广泛的模组兼容性: 自动兼容 VeinMiner、TreeHarvester、Traveler's Backpack、FallingTree、Panda's Falling Trees 等模组

单方块挖掘演示


⚙️ 配置说明

AutoPickup 采用灵活的三层权限系统:

  1. 服务器默认设置 - 全局后备设置
  2. 管理员覆盖 - 针对单个玩家的强制设置(优先级最高)
  3. 客户端偏好 - 玩家个人选择(仅在服务器允许时生效)

🖥️ 配置菜单(客户端)

你可以通过菜单配置个人偏好。在 Fabric 上使用 Mod Menu 以便快速访问。否则,使用 /autopickup gui 命令。

可用设置项:

  • 总开关
  • 方块物品拾取
  • 方块经验拾取
  • 生物战利品拾取
  • 生物经验拾取
  • 生物战利品分配(与附近攻击者共享掉落物)
  • 生物经验分配(与附近攻击者共享经验)

注意: 你的客户端设置仅在服务器管理员启用了相应功能的"允许"设置时才生效。

YACL 配置菜单演示


📜 命令(服务器管理员)

服务器管理员(OP 等级 2+)可以使用 /autopickup 命令管理全局默认设置和玩家覆盖。

菜单访问

命令 描述
/autopickup gui 通过命令访问配置菜单

全局配置

命令 描述 默认值
/autopickup 显示当前配置状态 -
/autopickup master <true|false> 总开关 - 设为 false 时完全禁用模组 true
/autopickup blocks <true|false> 自动拾取破坏方块掉落的物品 true
/autopickup blockxp <true|false> 自动拾取破坏方块获得的经验 true
/autopickup mobloot <true|false> 自动拾取击杀生物掉落的战利品 false
/autopickup mobxp <true|false> 自动拾取击杀生物获得的经验 false
/autopickup splitmobloot <true|false> 在附近攻击者之间分配生物战利品 false
/autopickup splitmobxp <true|false> 在附近攻击者之间分配生物经验 false

客户端控制权限

这些命令决定玩家是否可以用客户端设置覆盖服务器默认设置。

命令 描述 默认值
/autopickup allow master <true|false> 允许客户端切换总开关 false
/autopickup allow blocks <true|false> 允许客户端切换方块物品拾取 false
/autopickup allow blockxp <true|false> 允许客户端切换方块经验拾取 false
/autopickup allow mobloot <true|false> 允许客户端切换生物战利品拾取 false
/autopickup allow mobxp <true|false> 允许客户端切换生物经验拾取 false
/autopickup allow splitmobloot <true|false> 允许客户端切换生物战利品分配 false
/autopickup allow splitmobxp <true|false> 允许客户端切换生物经验分配 false

每玩家覆盖

强制设置单个玩家的特定配置(覆盖服务器默认设置和客户端偏好)。

命令 描述
/autopickup override <player> master <true|false|default> 覆盖玩家的总开关
/autopickup override <player> blocks <true|false|default> 覆盖玩家的方块拾取设置
/autopickup override <player> blockxp <true|false|default> 覆盖玩家的方块经验设置
/autopickup override <player> mobloot <true|false|default> 覆盖玩家的生物战利品设置
/autopickup override <player> mobxp <true|false|default> 覆盖玩家的生物经验设置
/autopickup override <player> splitmobloot <true|false|default> 覆盖玩家的战利品分配设置
/autopickup override <player> splitmobxp <true|false|default> 覆盖玩家的经验分配设置
/autopickup override <player> clear 移除玩家的所有覆盖设置

使用 default 可移除特定覆盖设置,同时保留其他覆盖设置。


📂 配置文件

服务器配置: config/AutoPickup/global_config.json

{
   "autoPickup": true,
   "autoPickupBlocks": true,
   "autoPickupBlockXp": true,
   "autoPickupMobLoot": false,
   "autoPickupMobXp": false,
   "autoPickupSplitMobLoot": false,
   "autoPickupSplitMobXp": false,
   "allowMaster": true,
   "allowBlocks": true,
   "allowBlockXp": true,
   "allowMobLoot": true,
   "allowMobXp": true,
   "allowSplitMobLoot": true,
   "allowSplitMobXp": true
}

客户端配置: config/AutoPickup/client_default.toml(或 presets/ 中的每服务器配置档案)

# AutoPickup 客户端配置
master = true
blocks = true
blockXp = true
mobLoot = false
mobXp = false
splitMobLoot = false
splitMobXp = false

玩家覆盖: config/AutoPickup/player_overrides.json

{
   "player-uuid-here": {
      "overrideMaster": true,
      "overrideBlocks": null,
      ...
   }
}

可选但推荐的客户端依赖项

  • Mod Menu - 在游戏中访问配置界面
  • YetAnotherConfigLib (YACL) - YACL 配置界面所需(有原版 GUI 作为后备)

✅ 兼容性

AutoPickup 挂钩核心 Minecraft 机制,开箱即可与大多数模组无缝协作。

🔧 明确支持的模组

模组 状态 备注
VeinMiner 完整 所有矿脉方块被立即拾取并附带经验
TreeHarvester 完整 收集原木/树叶;若启用则自动补种树苗
Traveler's Backpack 完整 物品优先路由到背包过滤器(如果安装了 Auto Pickup 升级则生效)
FallingTree 完整 树类物品可处理不同的破坏模式
Panda's Falling Trees 完整 树类物品在掉落动画后由 AutoPickup 处理
RightClickHarvest 完整 右键收获的作物(包括高甘蔗)自动拾取
通用方块破坏器 兼容 任何使用原版破坏钩子的模组

📋 技术细节

AutoPickup 在以下注入点拦截掉落物:

  • Block.dropResources() - 主要方块掉落处理
  • ServerLevel.addFreshEntity() - 物品实体生成和下落方块实体追踪(FallingTree 以及任何直接生成掉落物的模组)
  • LivingEntity.dropFromLootTable() - 生物战利品生成
  • LivingEntity.dropExperience() - 生物经验球
  • Block.popExperience() - 方块经验球
  • ExperienceOrb.award() - 捕获由方块破坏模组(如 VeinMiner)直接生成的经验
  • ServerPlayerGameMode.useItemOn() - 右键收获(甜浆果、唱片机唱片弹出、通过 RightClickHarvest 模组的作物等)
  • ItemFrame.hurt() / hurtServer() - 左键点击从物品展示框中取出的物品
  • Mob.interact() / ShearsItem.interactLivingEntity() - 剪刀剪下的掉落物(羊毛、雪傀儡南瓜、哞菇蘑菇)
  • BrushableBlockEntity.dropContent() - 刷可疑的沙砾/沙子
  • LivingEntity.dropFromEntityInteractLootTable() - 刷犰狳获取鳞甲

这种广泛的兼容性意味着大多数模组无需显式支持即可自动工作。

多方块挖掘演示


🎮 生物战利品分配

当启用 生物战利品分配 或 生物经验分配 时,击杀生物获得的奖励将在参与者之间共享:

工作原理

  1. 伤害追踪: 模组追踪对每只生物造成过伤害的最后 10 名独特玩家
  2. 资格检查: 生物死亡时,只有满足以下条件的玩家才能参与分配: - 在线且未处于旁观模式
    • 已启用总开关
    • 已启用特定的生物拾取功能
    • 已启用特定的分配功能
    • 与击杀者处于同一世界
  3. 分配机制: - 物品平均分配;击杀者获得余数
    • 经验平均分配;击杀者获得余数
    • 背包放不下的物品会掉落在生物死亡位置

示例

玩家 A(击杀者)、B 和 C 都对一只僵尸造成了伤害。设置如下:

  • 玩家 A: 总开关 ✅、生物战利品 ✅、生物战利品分配 ✅
  • 玩家 B: 总开关 ✅、生物战利品 ✅、生物战利品分配 ✅
  • 玩家 C: 总开关 ✅、生物战利品 ✅、生物战利品分配 ❌

结果: 只有 A 和 B 会获得分配的战利品。玩家 C 因禁用了分配功能而不会获得任何物品。


👩‍💻 开发者 API

添加为依赖项

Gradle:

dependencies {
   compileOnly(files("libs/autopickup-platform-x.x.x.jar"))
}

使用 API

import com.lukarbonite.autopickup.AutoPickupApi;

public class QuestRewards {

   public void giveReward(Player player, List<ItemStack> items, int xp) {
      if (!isModLoaded("autopickup")) {
         // 后备方案:手动掉落
         items.forEach(stack -> player.dropItem(stack, false));
         player.addExperience(xp);
         return;
      }

      // AutoPickup 处理:
      // - 背包插入
      // - Traveler's Backpack 路由
      // - 配置检查(总开关、方块等)
      List<ItemStack> remaining = AutoPickupApi.tryPickup(player, items);

      // 掉落未放入背包的物品
      remaining.forEach(stack -> player.dropItem(stack, false));

      // AutoPickup 处理:
      // - 经验修补计算
      // - 配置检查
      AutoPickupApi.tryPickupBlockExperience(player, xp);
   }

   // 用于生物相关奖励
   public void giveMobReward(Player player, List<ItemStack> loot, int xp) {
      List<ItemStack> remaining = AutoPickupApi.tryPickupFromMob(player, loot);
      remaining.forEach(stack -> player.dropItem(stack, false));

      AutoPickupApi.tryPickupMobExperience(player, xp);
   }
}

API 方法

方法 描述
tryPickup(PlayerEntity, List<ItemStack>) 拾取方块掉落的物品(遵守总开关 + 方块设置)
tryPickupFromMob(PlayerEntity, List<ItemStack>) 拾取生物掉落的物品(遵守总开关 + 生物战利品设置)
tryPickupBlockExperience(PlayerEntity, int) 给予方块经验(遵守总开关 + 方块经验设置)
tryPickupMobExperience(PlayerEntity, int) 给予生物经验(遵守总开关 + 生物经验设置)
isMasterEnabled(PlayerEntity) 检查该玩家的自动拾取是否已启用
isBlocksEnabled(PlayerEntity) 检查方块物品拾取设置
isBlockXpEnabled(PlayerEntity) 检查方块经验拾取设置
isMobLootEnabled(PlayerEntity) 检查生物战利品拾取设置
isMobXpEnabled(PlayerEntity) 检查生物经验拾取设置

注意: 所有 try* 方法都会返回无法拾取(背包已满)的物品列表。


📜 许可证

本项目采用 GNU Affero 通用公共许可证 v3.0(AGPL-3.0)授权。

你可以自由:

  • ✅ 在整合包中使用
  • ✅ 个人使用修改
  • ✅ 分发修改版本(也必须基于 AGPL-3.0)

完整详情请参阅 LICENSE 文件。