查看: 870|回復: 0

[閒聊閒語] L1HouseLocation

[複製鏈接]

71

主題

267

帖子

5707

金錢

火焰之影

Rank: 8Rank: 8

威望
247
精華
0
貢獻
0
鑽石
0
閱讀權限
50
積分
6468
在線時間
110 小時
相冊
0
日誌
0
好友
0
發表於 2026-2-1 12:48 | 顯示全部樓層 |閱讀模式
package com.lineage.server.model;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.lineage.server.templates.L1HouseLocTmp;
import com.lineage.server.types.Point;

/**
* 小屋座標相關資料
* 修正重點:
* 1. 移除過時的 new Integer() 語法。
* 2. 修正 getHouseLoc 中錯誤的 null 判定邏輯 (原版會導致空指標錯誤)。
* 3. 優化 Map 操作。
*/
public class L1HouseLocation {

        private static final Log _log = LogFactory.getLog(L1HouseLocation.class);

        private static final int[] TELEPORT_LOC_MAPID = { 4, 4, 4, 350 };

        private static final Point[] TELEPORT_LOC_GIRAN = {
                        new Point(33419, 32810), new Point(33343, 32723), // 倉庫、寵物保管所
                        new Point(33553, 32712), new Point(32702, 32842)  // 贖罪使者、奇岩市場
        };

        private static final Point[] TELEPORT_LOC_HEINE = {
                        new Point(33604, 33236), new Point(33649, 33413), // 倉庫、寵物保管所
                        new Point(33553, 32712), new Point(32702, 32842)  // 贖罪使者、奇岩市場
        };

        private static final Point[] TELEPORT_LOC_ADEN = {
                        new Point(33966, 33253), new Point(33921, 33177), // 倉庫、寵物保管所
                        new Point(33553, 32712), new Point(32702, 32842)  // 贖罪使者、奇岩市場
        };

        private static final Point[] TELEPORT_LOC_GLUDIN = {
                        new Point(32628, 32807), new Point(32623, 32729), // 倉庫、寵物保管所
                        new Point(33553, 32712), new Point(32702, 32842)  // 贖罪使者、奇岩市場
        };

        // 小屋座標資料 (小屋編號 / 座標資料)
        private static final Map<Integer, L1HouseLocTmp> _houseLoc = new HashMap<>();

        public static void put(final Integer e, final L1HouseLocTmp loc) {
                _houseLoc.put(e, loc);
        }

        private L1HouseLocation() {
        }

        /**
         * 判斷是否在地下盟屋內
         */
        public static boolean isInHouse(final short mapid) {
                // 使用 Switch 處理地下盟屋 MapID
                if (mapid >= 5001 && mapid <= 5123) {
                        return true;
                }
                return false;
        }

        /**
         * 指定座標是否屬於小屋範圍
         */
        public static boolean isInHouse(final int locx, final int locy, final short mapid) {
                for (final Integer houseId : _houseLoc.keySet()) {
                        if (isInHouseLoc(houseId, locx, locy, mapid)) {
                                return true;
                        }
                }
                return false;
        }

        /**
         * 指定位置是否在指定小屋範圍內
         */
        public static boolean isInHouseLoc(final int houseId, final int locx, final int locy, final short mapid) {
                try {
                        // 修正:直接傳入 houseId 即可 (Autoboxing)
                        final L1HouseLocTmp loc = _houseLoc.get(houseId);
                        if (loc != null) {
                                final int locx1 = loc.get_locx1();
                                final int locx2 = loc.get_locx2();
                                final int locy1 = loc.get_locy1();
                                final int locy2 = loc.get_locy2();
                                final int locx3 = loc.get_locx3();
                                final int locx4 = loc.get_locx4();
                                final int locy3 = loc.get_locy3();
                                final int locy4 = loc.get_locy4();

                                final int locmapid = loc.get_mapid();
                                final int basement = loc.get_basement();

                                // 檢查主要範圍
                                if ((locx >= locx1) && (locx <= locx2) && (locy >= locy1) && (locy <= locy2)
                                                && (mapid == locmapid)) {
                                        return true;
                                }

                                // 檢查第二範圍 (如果有)
                                if (locx3 != 0) {
                                        if ((locx >= locx3) && (locx <= locx4) && (locy >= locy3) && (locy <= locy4)
                                                        && (mapid == locmapid)) {
                                                return true;
                                        }
                                }

                                // 檢查地下室
                                if (basement != 0 && mapid == basement) {
                                        return true;
                                }
                        }

                } catch (final Exception e) {
                        _log.error("檢查盟屋位置異常, HouseID: " + houseId, e);
                }
                return false;
        }

        /**
         * 取得小屋首頁座標 (回歸點)
         */
        public static int[] getHouseLoc(final int houseId) {
                final int[] loc = new int[3];
                try {
                        final L1HouseLocTmp locTmp = _houseLoc.get(houseId);
                        // 修正原版 Bug:應該判斷從 Map 取得的 locTmp 是否為空
                        if (locTmp != null) {
                                loc[0] = locTmp.get_homelocx();
                                loc[1] = locTmp.get_homelocy();
                                loc[2] = locTmp.get_mapid();
                        }

                } catch (final Exception e) {
                        _log.error("取得盟屋座標異常, HouseID: " + houseId, e);
                }
                return loc;
        }

        /**
         * 取得小屋所屬地下盟屋座標
         */
        public static int[] getBasementLoc(final int houseId) {
                int[] loc = new int[3];
                if ((houseId >= 262145) && (houseId <= 262189)) { // 奇岩小屋 1~45
                        loc[0] = 32780;
                        loc[1] = 32815;
                        loc[2] = houseId - 257077;

                } else if ((houseId >= 327681) && (houseId <= 327691)) { // 海音小屋 1~11
                        loc[0] = 32772;
                        loc[1] = 32814;
                        loc[2] = houseId - 322568;

                } else if ((houseId >= 524289) && (houseId <= 524294)) { // 古魯丁小屋 1~6
                        // 古魯丁無地下室,返回小屋入口
                        loc = getHouseLoc(houseId);
                }
                return loc;
        }

        /**
         * 取得小屋快捷傳送座標 (傳送回各村指定點)
         */
        public static int[] getHouseTeleportLoc(final int houseId, final int number) {
                final int[] loc = new int[3];
                if (number < 0 || number >= 4) return loc; // 安全檢查

                if ((houseId >= 262145) && (houseId <= 262189)) { // 奇岩
                        loc[0] = TELEPORT_LOC_GIRAN[number].getX();
                        loc[1] = TELEPORT_LOC_GIRAN[number].getY();
                        loc[2] = TELEPORT_LOC_MAPID[number];

                } else if ((houseId >= 327681) && (houseId <= 327691)) { // 海音
                        loc[0] = TELEPORT_LOC_HEINE[number].getX();
                        loc[1] = TELEPORT_LOC_HEINE[number].getY();
                        loc[2] = TELEPORT_LOC_MAPID[number];

                } else if ((houseId >= 458753) && (houseId <= 458819)) { // 亞丁
                        loc[0] = TELEPORT_LOC_ADEN[number].getX();
                        loc[1] = TELEPORT_LOC_ADEN[number].getY();
                        loc[2] = TELEPORT_LOC_MAPID[number];

                } else if ((houseId >= 524289) && (houseId <= 524294)) { // 古魯丁
                        loc[0] = TELEPORT_LOC_GLUDIN[number].getX();
                        loc[1] = TELEPORT_LOC_GLUDIN[number].getY();
                        loc[2] = TELEPORT_LOC_MAPID[number];
                }
                return loc;
        }
}





上一篇︰2月1號 搖搖搖一
下一篇︰ClanRecommendTable
您需要登錄後才可以回帖 登錄 | 註冊會員

本版積分規則

天堂私服列表

45客服

Archiver| 45天堂私服論壇   分享到微博! 分享到臉書! 分享到噗浪! 分享到維特! 分享到Google+! 分享到LINE!

45天堂私服發佈站 ©    天堂私服架設教學  提供最新天堂私服最新資訊

流量最高、品質最好、服務最優、玩家首選、最新天堂私服資訊,都在45天堂私服發佈站.    免責聲明

Sitetag
line客服聯繫
掃一掃二碼
Line客服聯繫
24H專人回覆
返回頂部 返回列表