@@ -25,6 +25,7 @@ public class LandmarkManager {
2525 private final Map <String , Landmark > landmarks ;
2626 private final Map <UUID , Set <String >> unlockedLandmarks ;
2727 private final Map <UUID , Long > cooldowns ;
28+ private static final int MAX_MENU_COLUMNS = 7 ;
2829
2930 public LandmarkManager (LandmarkPlugin plugin ) {
3031 this .plugin = plugin ;
@@ -61,39 +62,26 @@ public void createLandmark(String name, Location location, String description) {
6162 }
6263
6364 private int [] calculateNextMenuPosition () {
64- int maxRow = 1 ; // 从第二行开始(索引1)
65- int maxCol = 1 ; // 从第一列开始(索引1)
66- boolean [][] occupied = new boolean [4 ][9 ]; // 4行9列的网格,实际使用1-3行,1-7列
65+ int maxRow = getMaxMenuRows ();
66+ boolean [][] occupied = new boolean [maxRow + 1 ][MAX_MENU_COLUMNS + 1 ];
6767
68- // 标记已占用的位置
6968 for (Landmark landmark : landmarks .values ()) {
7069 int row = landmark .getMenuRow ();
7170 int col = landmark .getMenuColumn ();
72- if (row >= 1 && row <= 3 && col >= 1 && col <= 7 ) { // 修改范围:第2-4行(索引1-3),第1-7列
71+ if (row >= 1 && row <= maxRow && col >= 1 && col <= MAX_MENU_COLUMNS ) {
7372 occupied [row ][col ] = true ;
74- maxRow = Math .max (maxRow , row );
75- maxCol = Math .max (maxCol , col );
7673 }
7774 }
7875
79- // 寻找下一个可用位置(从第二行到第四行,第一列到第七列)
80- for (int row = 1 ; row <= 3 ; row ++) {
81- for (int col = 1 ; col <= 7 ; col ++) {
76+ for (int row = 1 ; row <= maxRow ; row ++) {
77+ for (int col = 1 ; col <= MAX_MENU_COLUMNS ; col ++) {
8278 if (!occupied [row ][col ]) {
8379 return new int []{row , col };
8480 }
8581 }
8682 }
8783
88- // 如果当前行未满,添加到当前行的下一个位置
89- if (maxCol < 7 ) {
90- return new int []{maxRow , maxCol + 1 };
91- }
92- // 如果需要新的一行(最多到第3行,对应实际的第4行)
93- if (maxRow < 3 ) {
94- return new int []{maxRow + 1 , 1 }; // 新行从第一列开始
95- }
96- // 如果菜单已满,返回默认位置(第1行第1列,对应实际的第2行第1列)
84+ plugin .getSLF4JLogger ().warn ("锚点菜单已满,使用默认位置 (1,1)" );
9785 return new int []{1 , 1 };
9886 }
9987
@@ -232,6 +220,16 @@ public final void loadData() {
232220 int menuRow = landmarkSection .getInt ("menu_row" , 1 );
233221 int menuColumn = landmarkSection .getInt ("menu_column" , 1 );
234222
223+ int maxRow = getMaxMenuRows ();
224+ if (menuRow < 1 || menuRow > maxRow ) {
225+ plugin .getSLF4JLogger ().warn ("锚点 {} 的菜单行 {} 超出范围,已调整至有效值" , key , menuRow );
226+ menuRow = Math .max (1 , Math .min (menuRow , maxRow ));
227+ }
228+ if (menuColumn < 1 || menuColumn > MAX_MENU_COLUMNS ) {
229+ plugin .getSLF4JLogger ().warn ("锚点 {} 的菜单列 {} 超出范围,已调整至有效值" , key , menuColumn );
230+ menuColumn = Math .max (1 , Math .min (menuColumn , MAX_MENU_COLUMNS ));
231+ }
232+
235233 Landmark landmark = new Landmark (key , location , description , menuRow , menuColumn );
236234 landmarks .put (key .toLowerCase (), landmark );
237235 }
@@ -403,15 +401,22 @@ public void cleanup() {
403401 public void updateMenuPosition (String landmarkName , int newRow , int newColumn ) {
404402 Landmark landmark = landmarks .get (landmarkName .toLowerCase ());
405403 if (landmark != null ) {
406- // 确保位置在有效范围内(第2-4行,即索引1-3,列1-7)
407- if (newRow >= 1 && newRow <= 3 && newColumn >= 1 && newColumn <= 7 ) {
404+ int maxRow = getMaxMenuRows ();
405+ // 确保位置在有效范围内(第2-倒数第二行,即索引1-maxRow,列1-7)
406+ if (newRow >= 1 && newRow <= maxRow && newColumn >= 1 && newColumn <= MAX_MENU_COLUMNS ) {
408407 landmark .setMenuRow (newRow );
409408 landmark .setMenuColumn (newColumn );
410409 saveData ();
411410 }
412411 }
413412 }
414413
414+ private int getMaxMenuRows () {
415+ int guiSize = plugin .getConfigManager ().getConfig ().getInt ("gui.size" , 54 );
416+ int totalRows = Math .max (1 , guiSize / 9 );
417+ return Math .max (1 , totalRows - 2 );
418+ }
419+
415420 // 新增一键解锁所有锚点的方法
416421 public void unlockAllLandmarks (Player player ) {
417422 if (!player .hasPermission ("landmark.unlock.all" )) {
0 commit comments