esdion 發表於 2026-2-1 12:48

L1HouseLocation

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;
                try {
                        final L1HouseLocTmp locTmp = _houseLoc.get(houseId);
                        // 修正原版 Bug:應該判斷從 Map 取得的 locTmp 是否為空
                        if (locTmp != null) {
                                loc = locTmp.get_homelocx();
                                loc = locTmp.get_homelocy();
                                loc = 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;
                if ((houseId >= 262145) && (houseId <= 262189)) { // 奇岩小屋 1~45
                        loc = 32780;
                        loc = 32815;
                        loc = houseId - 257077;

                } else if ((houseId >= 327681) && (houseId <= 327691)) { // 海音小屋 1~11
                        loc = 32772;
                        loc = 32814;
                        loc = 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;
                if (number < 0 || number >= 4) return loc; // 安全檢查

                if ((houseId >= 262145) && (houseId <= 262189)) { // 奇岩
                        loc = TELEPORT_LOC_GIRAN.getX();
                        loc = TELEPORT_LOC_GIRAN.getY();
                        loc = TELEPORT_LOC_MAPID;

                } else if ((houseId >= 327681) && (houseId <= 327691)) { // 海音
                        loc = TELEPORT_LOC_HEINE.getX();
                        loc = TELEPORT_LOC_HEINE.getY();
                        loc = TELEPORT_LOC_MAPID;

                } else if ((houseId >= 458753) && (houseId <= 458819)) { // 亞丁
                        loc = TELEPORT_LOC_ADEN.getX();
                        loc = TELEPORT_LOC_ADEN.getY();
                        loc = TELEPORT_LOC_MAPID;

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

頁: [1]
查看完整版本: L1HouseLocation