物品系统
概述
物品系统负责在游戏中定期生成物品掉落物,为玩家提供装备和特殊道具来应对灾难。系统支持原版物品和自定义特殊物品,采用随机生成机制确保游戏的可玩性。
核心类
ItemManager(物品管理器)
路径:cn.enderrealm.disaster.game.items.ItemManager
物品管理器负责物品的注册、生成和管理。
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;
}核心方法
// 注册所有可用物品
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
物品初始化器负责全局物品系统的初始化和管理。
public class ItemInitializer {
private final disaster plugin;
public void startItemSpawnTask() {
// 启动全局物品生成任务
}
public void stopItemSpawnTask() {
// 停止全局物品生成任务
}
}物品生成机制
生成位置
物品生成遵循以下规则:
玩家附近生成(20% 概率)
- 在玩家周围 6 格范围内随机位置
- 寻找 Y 轴最高层的安全位置
- 确保物品不会生成在玩家脚下
地图随机位置生成(80% 概率)
- 在地图边界范围内随机位置
- 从世界最高处向下搜索安全位置
- 确保物品生成在实心方块上方
// 在玩家附近生成物品
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);
}
}物品属性
所有生成的物品都具有以下属性:
| 属性 | 值 | 描述 |
|---|---|---|
Glowing | true | 物品发光,更容易被发现 |
PickupDelay | 20 (1 秒) | 防止立即拾取 |
Invulnerable | true | 物品不会被破坏 |
物品类型
原版物品
| 物品 | 类型 | 描述 |
|---|---|---|
| 不死图腾 | 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,放置后延迟爆炸。
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,投掷后在空中爆炸。
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
可以投掷的火球,造成爆炸和火焰效果。
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
使用后随机传送到地图上的一个位置。
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
使用后与最近的玩家交换位置。
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% 概率掉落的特殊物品,使用后随机获得效果。
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
处理特殊物品的交互事件。
public class SpecialItemHandler implements Listener {
private final disaster plugin;
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
// 处理物品使用
}
}TotemHandler(不死图腾处理器)
路径:cn.enderrealm.disaster.game.items.TotemHandler
处理不死图腾的使用事件。
public class TotemHandler implements Listener {
private final disaster plugin;
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
// 处理不死图腾效果
}
}EnderPearlHandler(末影珍珠处理器)
路径:cn.enderrealm.disaster.game.items.EnderPearlHandler
处理末影珍珠的投掷事件。
public class EnderPearlHandler implements Listener {
private final disaster plugin;
@EventHandler
public void onProjectileLaunch(ProjectileLaunchEvent event) {
// 处理末影珍珠投掷
}
}CustomExplosionHandler(自定义爆炸处理器)
路径:cn.enderrealm.disaster.game.items.CustomExplosionHandler
处理自定义爆炸效果。
public class CustomExplosionHandler implements Listener {
private final disaster plugin;
@EventHandler
public void onEntityExplode(EntityExplodeEvent event) {
// 处理自定义爆炸
}
}配置示例
# 物品生成配置
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