33import java .io .File ;
44import java .io .IOException ;
55import java .util .ArrayList ;
6+ import java .util .Arrays ;
67import java .util .Comparator ;
78import java .util .HashMap ;
89import java .util .HashSet ;
910import java .util .LinkedHashMap ;
1011import java .util .List ;
1112import java .util .Map ;
13+ import java .util .Random ;
1214import java .util .Set ;
1315import java .util .UUID ;
1416
1517import org .bukkit .Location ;
18+ import org .bukkit .Material ;
1619import org .bukkit .configuration .ConfigurationSection ;
1720import org .bukkit .configuration .file .YamlConfiguration ;
1821import org .bukkit .entity .Entity ;
@@ -28,6 +31,44 @@ public class LandmarkManager {
2831 private final Map <UUID , Set <String >> unlockedLandmarks ;
2932 private final Map <UUID , Long > cooldowns ;
3033 private static final int MENU_COLUMNS = 7 ;
34+ private final Random random = new Random ();
35+
36+ // 精选的美观物品列表
37+ private static final List <Material > ICON_MATERIALS = Arrays .asList (
38+ // 宝石类
39+ Material .DIAMOND , Material .EMERALD , Material .AMETHYST_SHARD , Material .PRISMARINE_SHARD ,
40+ Material .ECHO_SHARD , Material .NETHERITE_SCRAP , Material .GOLD_INGOT , Material .IRON_INGOT ,
41+ // 方块类
42+ Material .ENCHANTED_BOOK , Material .NETHER_STAR , Material .TOTEM_OF_UNDYING ,
43+ Material .TRIDENT , Material .ELYTRA , Material .HEART_OF_THE_SEA , Material .NAUTILUS_SHELL ,
44+ // 装饰类
45+ Material .BEACON , Material .CONDUIT , Material .END_CRYSTAL , Material .DRAGON_EGG ,
46+ Material .DRAGON_HEAD , Material .CREEPER_HEAD , Material .PLAYER_HEAD , Material .ZOMBIE_HEAD ,
47+ // 花朵类
48+ Material .POPPY , Material .DANDELION , Material .BLUE_ORCHID , Material .ALLIUM ,
49+ Material .AZURE_BLUET , Material .ORANGE_TULIP , Material .PINK_TULIP , Material .OXEYE_DAISY ,
50+ Material .CORNFLOWER , Material .LILY_OF_THE_VALLEY , Material .WITHER_ROSE , Material .SUNFLOWER ,
51+ Material .ROSE_BUSH , Material .PEONY , Material .LILAC ,
52+ // 珊瑚类
53+ Material .BRAIN_CORAL , Material .BUBBLE_CORAL , Material .FIRE_CORAL ,
54+ Material .HORN_CORAL , Material .TUBE_CORAL ,
55+ // 其他装饰品
56+ Material .HONEYCOMB , Material .HONEY_BOTTLE , Material .EXPERIENCE_BOTTLE ,
57+ Material .ENDER_EYE , Material .ENDER_PEARL , Material .BLAZE_ROD , Material .BLAZE_POWDER ,
58+ Material .MAGMA_CREAM , Material .GHAST_TEAR , Material .FERMENTED_SPIDER_EYE ,
59+ Material .GLOW_BERRIES , Material .SWEET_BERRIES , Material .APPLE , Material .GOLDEN_APPLE ,
60+ Material .ENCHANTED_GOLDEN_APPLE , Material .CAKE , Material .COOKIE , Material .PUMPKIN_PIE ,
61+ // 音乐唱片
62+ Material .MUSIC_DISC_13 , Material .MUSIC_DISC_CAT , Material .MUSIC_DISC_BLOCKS ,
63+ Material .MUSIC_DISC_CHIRP , Material .MUSIC_DISC_FAR , Material .MUSIC_DISC_MALL ,
64+ Material .MUSIC_DISC_MELLOHI , Material .MUSIC_DISC_STAL , Material .MUSIC_DISC_STRAD ,
65+ Material .MUSIC_DISC_WARD , Material .MUSIC_DISC_11 , Material .MUSIC_DISC_WAIT ,
66+ Material .MUSIC_DISC_PIGSTEP , Material .MUSIC_DISC_OTHERSIDE , Material .MUSIC_DISC_5 ,
67+ // 彩色物品
68+ Material .RED_DYE , Material .ORANGE_DYE , Material .YELLOW_DYE , Material .LIME_DYE ,
69+ Material .GREEN_DYE , Material .CYAN_DYE , Material .LIGHT_BLUE_DYE , Material .BLUE_DYE ,
70+ Material .PURPLE_DYE , Material .MAGENTA_DYE , Material .PINK_DYE , Material .WHITE_DYE
71+ );
3172
3273 public LandmarkManager (LandmarkPlugin plugin ) {
3374 this .plugin = plugin ;
@@ -52,18 +93,28 @@ public void createLandmark(String name, Location location, String description) {
5293 int row = (index / MENU_COLUMNS ) + 1 ;
5394 int column = (index % MENU_COLUMNS ) + 1 ;
5495
55- Landmark landmark = new Landmark (name , location , description , row , column );
96+ // 随机选择一个图标材质
97+ Material randomIcon = getRandomIconMaterial ();
98+
99+ Landmark landmark = new Landmark (name , location , description , row , column , randomIcon );
56100 landmarks .put (name .toLowerCase (), landmark );
57101
58102 normalizeMenuPositions ();
59103
60- plugin .getSLF4JLogger ().info ("成功创建锚点展示实体: {}" , name );
104+ plugin .getSLF4JLogger ().info ("成功创建锚点展示实体: {} (图标: {}) " , name , randomIcon . name () );
61105 saveData ();
62106 } catch (IllegalArgumentException | IllegalStateException e ) {
63107 plugin .getSLF4JLogger ().error ("创建锚点时发生错误: {}" , e .getMessage ());
64108 landmarks .remove (name .toLowerCase ());
65109 }
66110 }
111+
112+ /**
113+ * 获取一个随机的图标材质
114+ */
115+ private Material getRandomIconMaterial () {
116+ return ICON_MATERIALS .get (random .nextInt (ICON_MATERIALS .size ()));
117+ }
67118
68119 public void deleteLandmark (String name ) {
69120 String lowerName = name .toLowerCase ();
@@ -211,7 +262,21 @@ public final void loadData() {
211262 menuColumn = Math .max (1 , Math .min (menuColumn , MENU_COLUMNS ));
212263 }
213264
214- Landmark landmark = new Landmark (key , location , description , menuRow , menuColumn );
265+ // 加载图标材质,如果不存在则随机生成一个
266+ Material iconMaterial ;
267+ String iconMaterialStr = landmarkSection .getString ("icon_material" );
268+ if (iconMaterialStr != null ) {
269+ try {
270+ iconMaterial = Material .valueOf (iconMaterialStr );
271+ } catch (IllegalArgumentException e ) {
272+ plugin .getSLF4JLogger ().warn ("锚点 {} 的图标材质 {} 无效,将随机生成" , key , iconMaterialStr );
273+ iconMaterial = getRandomIconMaterial ();
274+ }
275+ } else {
276+ iconMaterial = getRandomIconMaterial ();
277+ }
278+
279+ Landmark landmark = new Landmark (key , location , description , menuRow , menuColumn , iconMaterial );
215280 landmarks .put (key .toLowerCase (), landmark );
216281 }
217282 } catch (IllegalArgumentException | IllegalStateException e ) {
@@ -258,6 +323,10 @@ public void saveData() {
258323 landmarkSection .set ("description" , landmark .getDescription ());
259324 landmarkSection .set ("menu_row" , landmark .getMenuRow ());
260325 landmarkSection .set ("menu_column" , landmark .getMenuColumn ());
326+ // 保存图标材质
327+ if (landmark .getIconMaterial () != null ) {
328+ landmarkSection .set ("icon_material" , landmark .getIconMaterial ().name ());
329+ }
261330 }
262331 try {
263332 data .save (dataFile );
0 commit comments