程序包 com.playerblocklife

# 类 PlayerBlockManager

java.lang.Object
com.playerblocklife.PlayerBlockManager

public class PlayerBlockManager extends Object
玩家方块管理器 - 负责管理玩家生命方块的核心组件

主要职责：

- 生成和放置玩家生命方块
- 管理方块位置和所有者映射关系
- 处理方块破坏和恢复逻辑
- 提供方块数据持久化存储
- 支持方块位置查询和验证
- 与SkinManager协同工作，确保方块正确显示玩家皮肤

SkinsRestorer集成特性：

- 通过SkinManager获取SkinsRestorer提供的玩家皮肤纹理
- 确保离线服务器上的方块显示正确的自定义皮肤
- 支持异步皮肤加载，避免方块放置阻塞
- 提供皮肤加载状态检查，确保皮肤就绪后再放置方块

使用并发安全的数据结构确保多线程环境下的数据一致性。

从以下版本开始:
  1.0.0
版本:
  2.1.0
作者:
  xiaobai

## 构造器概要

构造器
构造器
说明
`PlayerBlockManager(PlayerBlockLife plugin, SkinManager skinManager)`

## 方法概要

修饰符和类型
方法
说明
`void`
`clearPlayerBlocks(UUID playerId)`
清除玩家的所有生命方块
`boolean`
`generateLifeBlocksForPlayer(org.bukkit.entity.Player player, int blockAmount, int spreadRange, boolean requireOpenSky, int maxAttempts)`
为玩家生成指定数量的生命方块
`Map<org.bukkit.Location,UUID>`
`getAllBlockOwners()`
获取所有方块的位置和所有者
`Map<UUID,List<org.bukkit.Location>>`
`getAllPlayerBlocks()`
获取所有玩家的方块数据
`UUID`
`getBlockOwner(org.bukkit.Location location)`
检查方块是否属于某个玩家
`org.bukkit.Location`
`getNearestBlock(org.bukkit.entity.Player player)`
获取距离玩家最近的方块
`List<String>`
`getPlayerBlockLocations(UUID playerId)`
获取玩家的生命方块位置列表（用于显示）
`List<org.bukkit.Location>`
`getPlayerBlocks(UUID playerId)`
获取玩家的所有生命方块位置
`int`
`getPlayerBlocksCount()`
获取已注册玩家的数量
`int`
`getRemainingBlocks(UUID playerId)`
获取玩家剩余方块数量
`Map<String,Object>`
`getStats()`
获取所有生命方块的统计信息
`int`
`getTotalBlocksCount()`
获取总方块数量
`boolean`
`hasLifeBlocks(UUID playerId)`
检查玩家是否有生命方块
`boolean`
`isLifeBlock(org.bukkit.Location location)`
检查位置是否包含生命方块
`void`
`loadData()`
加载数据
`boolean`
`regeneratePlayerBlocks(org.bukkit.entity.Player player)`
重新生成玩家的生命方块
`boolean`
`removeBlock(org.bukkit.Location location, org.bukkit.entity.Player breaker)`
移除方块（当被挖掘时）
`void`
`saveData()`
保存数据
`boolean`
`setLifeBlocks(org.bukkit.entity.Player player, org.bukkit.Location center)`
为玩家设置生命方块（兼容旧方法）

### 从类继承的方法 java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## 构造器详细资料

### PlayerBlockManager

public PlayerBlockManager(PlayerBlockLife plugin, SkinManager skinManager)

## 方法详细资料

### setLifeBlocks

public boolean setLifeBlocks(org.bukkit.entity.Player player, org.bukkit.Location center)
为玩家设置生命方块（兼容旧方法）

### generateLifeBlocksForPlayer

public boolean generateLifeBlocksForPlayer(org.bukkit.entity.Player player, int blockAmount, int spreadRange, boolean requireOpenSky, int maxAttempts)
为玩家生成指定数量的生命方块

此方法负责生成玩家的生命方块，包括以下步骤：

1. 检查玩家是否已有生命方块
2. 验证玩家皮肤是否已从SkinsRestorer或其他来源加载完成
3. 在指定范围内寻找合适的放置位置
4. 放置带有玩家皮肤纹理的玩家头颅方块
5. 记录方块位置和所有者关系
6. 保存数据并返回生成结果

皮肤加载检查：

- 调用skinManager.isSkinLoaded()检查皮肤是否就绪
- 如果皮肤未加载，方块生成将失败
- 确保离线服务器通过SkinsRestorer获取的皮肤能正确应用
- 避免放置默认Steve皮肤的方块

参数:
  `player` - 目标玩家
  `blockAmount` - 要生成的方块数量
  `spreadRange` - 生成范围（以玩家为中心的正方形边长的一半）
  `requireOpenSky` - 是否需要开阔天空（上方无方块覆盖）
  `maxAttempts` - 寻找合适位置的最大尝试次数
返回:
  生成成功返回true，失败返回false
另请参阅:
  - `SkinManager.isSkinLoaded(UUID)`
  - `SkinManager.getSkinFromSkinsRestorer(Player)`

### getBlockOwner

public UUID getBlockOwner(org.bukkit.Location location)
检查方块是否属于某个玩家

### removeBlock

public boolean removeBlock(org.bukkit.Location location, org.bukkit.entity.Player breaker)
移除方块（当被挖掘时）

### getRemainingBlocks

public int getRemainingBlocks(UUID playerId)
获取玩家剩余方块数量

### hasLifeBlocks

public boolean hasLifeBlocks(UUID playerId)
检查玩家是否有生命方块

### getPlayerBlocks

public List<org.bukkit.Location> getPlayerBlocks(UUID playerId)
获取玩家的所有生命方块位置

### clearPlayerBlocks

public void clearPlayerBlocks(UUID playerId)
清除玩家的所有生命方块

### regeneratePlayerBlocks

public boolean regeneratePlayerBlocks(org.bukkit.entity.Player player)
重新生成玩家的生命方块

### getPlayerBlocksCount

public int getPlayerBlocksCount()
获取已注册玩家的数量

### getTotalBlocksCount

public int getTotalBlocksCount()
获取总方块数量

### loadData

public void loadData()
加载数据

### saveData

public void saveData()
保存数据

### getAllPlayerBlocks

public Map<UUID,List<org.bukkit.Location>> getAllPlayerBlocks()
获取所有玩家的方块数据

### getAllBlockOwners

public Map<org.bukkit.Location,UUID> getAllBlockOwners()
获取所有方块的位置和所有者

### isLifeBlock

public boolean isLifeBlock(org.bukkit.Location location)
检查位置是否包含生命方块

### getPlayerBlockLocations

public List<String> getPlayerBlockLocations(UUID playerId)
获取玩家的生命方块位置列表（用于显示）

### getNearestBlock

public org.bukkit.Location getNearestBlock(org.bukkit.entity.Player player)
获取距离玩家最近的方块

### getStats

public Map<String,Object> getStats()
获取所有生命方块的统计信息