 | 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;
}
}
| |