Skip to content

物品系统

概述

物品系统负责在游戏中定期生成物品掉落物,为玩家提供装备和特殊道具来应对灾难。系统支持原版物品和自定义特殊物品,采用随机生成机制确保游戏的可玩性。

核心类

ItemManager(物品管理器)

路径cn.enderrealm.disaster.game.items.ItemManager

物品管理器负责物品的注册、生成和管理。

java
public class ItemManager {
    private final disaster plugin;
    private final Random random = new Random();
    private BukkitTask itemSpawnTask;
    private Room room;
    
    // 可生成的物品列表
    private final List<ItemSupplier> availableItems = new ArrayList<>();
    
    // 地图边界坐标
    private Location point1;
    private Location point2;
}

核心方法

java
// 注册所有可用物品
private void registerItems() {
    // 原版物品
    availableItems.add(() -> new ItemStack(Material.TOTEM_OF_UNDYING));  // 不死图腾
    availableItems.add(() -> new ItemStack(Material.ENDER_PEARL));       // 末影珍珠
    
    // 钻石装备
    availableItems.add(() -> new ItemStack(Material.DIAMOND_SWORD));
    availableItems.add(() -> new ItemStack(Material.DIAMOND_HELMET));
    availableItems.add(() -> new ItemStack(Material.DIAMOND_CHESTPLATE));
    // ...
    
    // 特殊道具
    availableItems.add(PlaceableTNT::create);       // 放置型 TNT
    availableItems.add(ThrowableTNT::create);       // 投掷型 TNT
    availableItems.add(Fireball::create);           // 火球
    availableItems.add(RandomTeleport::create);     // 随机传送
    availableItems.add(DeathSwap::create);          // 替死鬼
}

// 启动物品生成任务
public void startItemSpawnTask() {
    if (room != null) {
        itemSpawnTask = new BukkitRunnable() {
            @Override
            public void run() {
                spawnItemsInRoom(room);
            }
        }.runTaskTimer(plugin, 0L, getRandomSpawnDelay());
    }
}

// 获取随机生成延迟(15-20 秒)
private long getRandomSpawnDelay() {
    return (30 + random.nextInt(6)) * 20L;
}

ItemInitializer(物品初始化器)

路径cn.enderrealm.disaster.game.items.ItemInitializer

物品初始化器负责全局物品系统的初始化和管理。

java
public class ItemInitializer {
    private final disaster plugin;
    
    public void startItemSpawnTask() {
        // 启动全局物品生成任务
    }
    
    public void stopItemSpawnTask() {
        // 停止全局物品生成任务
    }
}

物品生成机制

生成位置

物品生成遵循以下规则:

  1. 玩家附近生成(20% 概率)

    • 在玩家周围 6 格范围内随机位置
    • 寻找 Y 轴最高层的安全位置
    • 确保物品不会生成在玩家脚下
  2. 地图随机位置生成(80% 概率)

    • 在地图边界范围内随机位置
    • 从世界最高处向下搜索安全位置
    • 确保物品生成在实心方块上方
java
// 在玩家附近生成物品
private void spawnItemNearPlayer(Player player) {
    World world = player.getWorld();
    Location playerLoc = player.getLocation();
    
    // 在玩家周围 6 格范围内随机位置
    double offsetX, offsetZ;
    do {
        offsetX = (random.nextDouble() * 12) - 6;
        offsetZ = (random.nextDouble() * 12) - 6;
    } while (Math.abs(offsetX) < 0.5 && Math.abs(offsetZ) < 0.5);
    
    Location dropLoc = playerLoc.clone().add(offsetX, 0, offsetZ);
    
    // 寻找 Y 轴最高层的安全位置
    boolean foundSafeLocation = false;
    int worldHeight = world.getMaxHeight();
    
    for (int y = worldHeight; y > 0; y--) {
        Location checkLoc = new Location(world, dropLoc.getX(), y, dropLoc.getZ());
        
        if (checkLoc.getBlock().getType().isAir()) {
            Location belowLoc = checkLoc.clone().add(0, -1, 0);
            if (!belowLoc.getBlock().getType().isAir() && 
                belowLoc.getBlock().getType() != Material.BARRIER) {
                dropLoc = checkLoc;
                foundSafeLocation = true;
                break;
            }
        }
    }
    
    if (!foundSafeLocation) {
        dropLoc = playerLoc;
    }
    
    // 生成物品
    ItemStack itemStack = getRandomItem();
    if (itemStack != null) {
        Item droppedItem = world.dropItem(dropLoc, itemStack);
        droppedItem.setGlowing(true);  // 发光效果
        droppedItem.setPickupDelay(20);  // 1 秒拾取延迟
        droppedItem.setInvulnerable(true);  // 不可破坏
    }
}

// 在地图随机位置生成物品
private void spawnItemAtRandomLocation(World world) {
    if (point1 == null || point2 == null) return;
    
    // 获取地图边界
    double minX = Math.min(point1.getX(), point2.getX());
    double maxX = Math.max(point1.getX(), point2.getX());
    double minZ = Math.min(point1.getZ(), point2.getZ());
    double maxZ = Math.max(point1.getZ(), point2.getZ());
    
    // 随机位置
    double x = minX + random.nextDouble() * (maxX - minX);
    double z = minZ + random.nextDouble() * (maxZ - minZ);
    
    Location dropLoc = new Location(world, x, 0, z);
    
    // 寻找安全位置
    // ...
    
    // 生成物品
    ItemStack itemStack = getRandomItem();
    if (itemStack != null) {
        Item droppedItem = world.dropItem(dropLoc, itemStack);
        droppedItem.setGlowing(true);
        droppedItem.setPickupDelay(20);
        droppedItem.setInvulnerable(true);
    }
}

物品属性

所有生成的物品都具有以下属性:

属性描述
Glowingtrue物品发光,更容易被发现
PickupDelay20 (1 秒)防止立即拾取
Invulnerabletrue物品不会被破坏

物品类型

原版物品

物品类型描述
不死图腾TOTEM_OF_UNDYING免疫一次死亡
末影珍珠ENDER_PEARL瞬间传送
钻石剑DIAMOND_SWORD高伤害武器
钻石头盔DIAMOND_HELMET高防御头盔
钻石胸甲DIAMOND_CHESTPLATE高防御胸甲
钻石护腿DIAMOND_LEGGINGS高防御护腿
钻石靴子DIAMOND_BOOTS高防御靴子
钻石镐DIAMOND_PICKAXE高效挖掘工具
钻石斧DIAMOND_AXE高效伐木工具
铁剑IRON_SWORD中等伤害武器
铁头盔IRON_HELMET中等防御头盔
铁胸甲IRON_CHESTPLATE中等防御胸甲
铁护腿IRON_LEGGINGS中等防御护腿
铁靴子IRON_BOOTS中等防御靴子
铁镐IRON_PICKAXE中等挖掘工具
铁斧IRON_AXE中等伐木工具
金剑GOLDEN_SWORD低伤害武器
金头盔GOLDEN_HELMET低防御头盔
金胸甲GOLDEN_CHESTPLATE低防御胸甲
金护腿GOLDEN_LEGGINGS低防御护腿
金靴子GOLDEN_BOOTS低防御靴子
金镐GOLDEN_PICKAXE低效挖掘工具
金斧GOLDEN_AXE低效伐木工具

特殊道具

放置型 TNT(PlaceableTNT)

路径cn.enderrealm.disaster.game.items.PlaceableTNT

可以放置在地面上的 TNT,放置后延迟爆炸。

java
public class PlaceableTNT {
    public static ItemStack create() {
        ItemStack item = new ItemStack(Material.TNT);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName("§c放置型 TNT");
        meta.setLore(Arrays.asList("§7放置后延迟爆炸"));
        item.setItemMeta(meta);
        return item;
    }
}

投掷型 TNT(ThrowableTNT)

路径cn.enderrealm.disaster.game.items.ThrowableTNT

可以投掷的 TNT,投掷后在空中爆炸。

java
public class ThrowableTNT {
    public static ItemStack create() {
        ItemStack item = new ItemStack(Material.TNT);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName("§c投掷型 TNT");
        meta.setLore(Arrays.asList("§7投掷后在空中爆炸"));
        item.setItemMeta(meta);
        return item;
    }
}

火球(Fireball)

路径cn.enderrealm.disaster.game.items.Fireball

可以投掷的火球,造成爆炸和火焰效果。

java
public class Fireball {
    public static ItemStack create() {
        ItemStack item = new ItemStack(Material.FIRE_CHARGE);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName("§6火球");
        meta.setLore(Arrays.asList("§7投掷后造成爆炸"));
        item.setItemMeta(meta);
        return item;
    }
}

随机传送(RandomTeleport)

路径cn.enderrealm.disaster.game.items.RandomTeleport

使用后随机传送到地图上的一个位置。

java
public class RandomTeleport {
    public static ItemStack create() {
        ItemStack item = new ItemStack(Material.ENDER_EYE);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName("§d随机传送");
        meta.setLore(Arrays.asList("§7使用后随机传送到地图上的位置"));
        item.setItemMeta(meta);
        return item;
    }
}

替死鬼(DeathSwap)

路径cn.enderrealm.disaster.game.items.DeathSwap

使用后与最近的玩家交换位置。

java
public class DeathSwap {
    public static ItemStack create() {
        ItemStack item = new ItemStack(Material.BONE);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName("§e替死鬼");
        meta.setLore(Arrays.asList("§7使用后与最近的玩家交换位置"));
        item.setItemMeta(meta);
        return item;
    }
}

神秘药水(MysteriousPotion)

路径cn.enderrealm.disaster.game.items.MysteriousPotion

僵尸死亡时有 40% 概率掉落的特殊物品,使用后随机获得效果。

java
public class MysteriousPotion {
    public static ItemStack create() {
        ItemStack item = new ItemStack(Material.POTION);
        PotionMeta meta = (PotionMeta) item.getItemMeta();
        meta.setDisplayName("§神秘药水");
        meta.setLore(Arrays.asList("§7使用后随机获得效果"));
        
        // 设置随机药水效果
        PotionEffectType[] effects = {
            PotionEffectType.REGENERATION,
            PotionEffectType.SPEED,
            PotionEffectType.STRENGTH,
            PotionEffectType.RESISTANCE
        };
        
        Random random = new Random();
        PotionEffectType effect = effects[random.nextInt(effects.length)];
        meta.addCustomEffect(new PotionEffect(effect, 20 * 30, 1), true);
        
        item.setItemMeta(meta);
        return item;
    }
}

物品处理器

SpecialItemHandler(特殊物品处理器)

路径cn.enderrealm.disaster.game.items.SpecialItemHandler

处理特殊物品的交互事件。

java
public class SpecialItemHandler implements Listener {
    private final disaster plugin;
    
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        // 处理物品使用
    }
}

TotemHandler(不死图腾处理器)

路径cn.enderrealm.disaster.game.items.TotemHandler

处理不死图腾的使用事件。

java
public class TotemHandler implements Listener {
    private final disaster plugin;
    
    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent event) {
        // 处理不死图腾效果
    }
}

EnderPearlHandler(末影珍珠处理器)

路径cn.enderrealm.disaster.game.items.EnderPearlHandler

处理末影珍珠的投掷事件。

java
public class EnderPearlHandler implements Listener {
    private final disaster plugin;
    
    @EventHandler
    public void onProjectileLaunch(ProjectileLaunchEvent event) {
        // 处理末影珍珠投掷
    }
}

CustomExplosionHandler(自定义爆炸处理器)

路径cn.enderrealm.disaster.game.items.CustomExplosionHandler

处理自定义爆炸效果。

java
public class CustomExplosionHandler implements Listener {
    private final disaster plugin;
    
    @EventHandler
    public void onEntityExplode(EntityExplodeEvent event) {
        // 处理自定义爆炸
    }
}

配置示例

yaml
# 物品生成配置
itemSpawn:
  minDelay: 30  # 最小生成延迟(秒)
  maxDelay: 36  # 最大生成延迟(秒)
  playerNearChance: 0.2  # 玩家附近生成概率
  
# 物品列表配置
items:
  # 原版物品
  - type: TOTEM_OF_UNDYING
    weight: 10
  - type: ENDER_PEARL
    weight: 15
  - type: DIAMOND_SWORD
    weight: 5
  # 特殊道具
  - type: PLACEABLE_TNT
    weight: 10
  - type: THROWABLE_TNT
    weight: 10
  - type: FIREBALL
    weight: 10
  - type: RANDOM_TELEPORT
    weight: 8
  - type: DEATH_SWAP
    weight: 8

相关文档