Skip to content

Commit eb42ab5

Browse files
随机物品
1 parent 731488e commit eb42ab5

4 files changed

Lines changed: 103 additions & 6 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>ict.minesunshineone</groupId>
88
<artifactId>LandmarkSystem</artifactId>
9-
<version>1.7</version>
9+
<version>1.8</version>
1010

1111
<properties>
1212
<java.version>21</java.version>

src/main/java/ict/minesunshineone/landmark/gui/LandmarkMenu.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,15 @@ private ItemStack createCurrentLocationItem(boolean isAtAnyLandmark, Landmark cu
279279
}
280280

281281
private ItemStack createLandmarkItem(Landmark landmark, boolean isUnlocked) {
282-
String materialPath = isUnlocked ? "gui.items.unlocked.material" : "gui.items.locked.material";
283-
Material material = Material.valueOf(Objects.requireNonNull(plugin.getConfigManager().getConfig().getString(materialPath, "DIAMOND")));
282+
// 如果已解锁,使用地标的自定义图标;如果未解锁,使用配置中的锁定材质
283+
Material material;
284+
if (isUnlocked && landmark.getIconMaterial() != null) {
285+
material = landmark.getIconMaterial();
286+
} else {
287+
String materialPath = isUnlocked ? "gui.items.unlocked.material" : "gui.items.locked.material";
288+
material = Material.valueOf(Objects.requireNonNull(plugin.getConfigManager().getConfig().getString(materialPath, "DIAMOND")));
289+
}
290+
284291
ItemStack item = new ItemStack(material);
285292
ItemMeta meta = item.getItemMeta();
286293
if (meta == null) {

src/main/java/ict/minesunshineone/landmark/manager/LandmarkManager.java

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
import java.io.File;
44
import java.io.IOException;
55
import java.util.ArrayList;
6+
import java.util.Arrays;
67
import java.util.Comparator;
78
import java.util.HashMap;
89
import java.util.HashSet;
910
import java.util.LinkedHashMap;
1011
import java.util.List;
1112
import java.util.Map;
13+
import java.util.Random;
1214
import java.util.Set;
1315
import java.util.UUID;
1416

1517
import org.bukkit.Location;
18+
import org.bukkit.Material;
1619
import org.bukkit.configuration.ConfigurationSection;
1720
import org.bukkit.configuration.file.YamlConfiguration;
1821
import 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);

src/main/java/ict/minesunshineone/landmark/model/Landmark.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.UUID;
44

55
import org.bukkit.Location;
6+
import org.bukkit.Material;
67

78
public class Landmark {
89

@@ -12,13 +13,15 @@ public class Landmark {
1213
private UUID displayEntityId;
1314
private int menuRow; // 在菜单中的行位置
1415
private int menuColumn; // 在菜单中的列位置
16+
private Material iconMaterial; // 在菜单中显示的图标材质
1517

1618
public Landmark(String name, Location location, String description) {
1719
this.name = name;
1820
this.location = location;
1921
this.description = description;
2022
this.menuRow = 1; // 默认从第二行开始(索引1)
2123
this.menuColumn = 1; // 默认从第一列开始(索引1)
24+
this.iconMaterial = null; // 将在创建时设置
2225
}
2326

2427
public Landmark(String name, Location location, String description, int menuRow, int menuColumn) {
@@ -27,6 +30,16 @@ public Landmark(String name, Location location, String description, int menuRow,
2730
this.description = description;
2831
this.menuRow = menuRow;
2932
this.menuColumn = menuColumn;
33+
this.iconMaterial = null;
34+
}
35+
36+
public Landmark(String name, Location location, String description, int menuRow, int menuColumn, Material iconMaterial) {
37+
this.name = name;
38+
this.location = location;
39+
this.description = description;
40+
this.menuRow = menuRow;
41+
this.menuColumn = menuColumn;
42+
this.iconMaterial = iconMaterial;
3043
}
3144

3245
public String getName() {
@@ -76,4 +89,12 @@ public int getMenuColumn() {
7689
public void setMenuColumn(int menuColumn) {
7790
this.menuColumn = menuColumn;
7891
}
92+
93+
public Material getIconMaterial() {
94+
return iconMaterial;
95+
}
96+
97+
public void setIconMaterial(Material iconMaterial) {
98+
this.iconMaterial = iconMaterial;
99+
}
79100
}

0 commit comments

Comments
 (0)