軒云熊 發表於 2025-12-28 09:14

關於船停靠港口的位置該怎麼修

請問有大大知道話島往古丁的船到古丁港口之後船會停在港口的橋樑上
為甚麼會這樣要怎麼修正 有大大遇過這個問題嗎?

yasioukon 發表於 2025-12-28 18:46

你可能要截圖比較清楚

有可能是有覆蓋地圖補丁

新舊說話之島地圖樣貌不同之類的

軒云熊 發表於 2025-12-28 20:57

yasioukon 發表於 2025-12-28 18:46
你可能要截圖比較清楚

有可能是有覆蓋地圖補丁


https://lineage45.com/forum.php?mod=image&aid=43658&size=300x300&key=2bc46b05099767e8&nocache=yes&type=fixnone

就是這樣位置不對伊葳815 的版本

yasioukon 發表於 2025-12-29 17:41

我測38也是這樣

182那種未燒毀的古魯丁就正常

可能船到港就被傳送下去了

所以大家都沒去注意吧

而且雙開看 兩艘船外觀還不同

那可能就是要改til檔了

軒云熊 發表於 2025-12-29 20:13

yasioukon 發表於 2025-12-29 17:41
我測38也是這樣

182那種未燒毀的古魯丁就正常


看起來 範圍是不一樣

https://lineage45.com/forum.php?mod=image&aid=43672&size=300x300&key=2f1b0a60e130027b&nocache=yes&type=fixnone
請問 yasioukon 大大 這該怎麼改直接改範圍 會出錯 直接匯出新的 4.TXT也沒有效果>"<

javacgame 發表於 2025-12-29 20:22

我也有這問題不知道要這麼解決版本3.63

acer9999 發表於 2025-12-30 03:34

坐飛機吧!這年代沒人坐船了

yasioukon 發表於 2025-12-30 06:55

軒云熊 發表於 2025-12-29 20:13
看起來 範圍是不一樣




txt是一般區域 戰鬥區域 安全區域 不可通行設定用

要改變地圖外觀 還是得靠til

軒云熊 發表於 2025-12-30 09:34

yasioukon 發表於 2025-12-30 06:55
txt是一般區域 戰鬥區域 安全區域 不可通行設定用

要改變地圖外觀 還是得靠til


請問有甚麼工具可以改til

p2255891 發表於 2025-12-30 10:54

去資料庫找這個 'getback_restart'
如果沒問題大概會看到這些
Talking Island Ship to Aden Mainland
Aden Mainland Ship to Talking Island
Aden Mainland Ship to Forgotten Island
後面有座標
locx,loxy,mapid
用Lineage map V1 看大陸地圖,修正座標就好.大概這樣?
我沒修過,不過你可以試試!

p2255891 發表於 2025-12-30 18:46

抽空翻了下DB,核心找到問題了.
L1HouseLocation.java
public static boolean isInHouseLoc(int houseId, int locx, int locy, short mapid) {
看看裡面的內容有沒有被/* 隱藏 */ 或是刪除
有的話恢復它就好了
C_Ship.java ---這是檢查船票的
看看裡面的代碼有沒有被移除"某些部份",這是額外的不檢查也沒關係.

順邊問了一下AI讓它幫我整理邏輯
AI回答
這是一個非常有趣的發現!雖然從程式碼表面上看 isInHouseLoc 是處理血盟小屋(Agit)的邏輯,但在某些特定的私服核心架構中,將其恢復後解決了船隻停靠問題,通常是因為以下兩個隱藏邏輯:
1. 座標重疊判定(Overlapping Logic)
在古魯丁港口,3 號小屋 (houseId: 524291) 的座標範圍 32537~32544 剛好緊鄰著船隻停靠的橋頭。
當這段代碼被註銷時,伺服器可能無法正確判定該區域的物件屬性,導致某些核心在處理「船隻實體(NpcInstance)」進入該區域時,因為缺乏區域判定而觸發了預設的碰撞檢查,讓船提早停下。
恢復代碼後,系統重新正確識別了該區域的 Loc 屬性,消除了座標衝突。
2. 核心對「特殊區域」的全局檢查
部分核心在處理物件移動(如船隻)時,會調用類似 isInHouseLoc 或 getHouseId 的函數來確認物件是否進入了「不可停留」或「特殊保護」區域。
當這段代碼失效,核心可能在移動計算中產生異常(Exception),導致船隻路徑在中途(橋頭 32544)中斷,無法完成最後幾格的移動。


軒云熊 發表於 2025-12-31 20:26

本帖最後由 軒云熊 於 2025-12-31 21:17 編輯

謝謝大大們的回覆經過觀察發現 問題是出在    遊戲時間 沒有同步造成
我沒有修改 地圖切換點設置 DungeonTable   而是在 L1GameTimeClock裡增加時間點觸發傳送到船艙
對應古丁船班的時間 因為 L1GameTime 的時間 與主畫面顯示的時間還是會有誤差 但是它會自動修正
這會造成船班時間漏掉跳過到港時間的問題所以我把到港時間提前
也就是 提前3分鐘~真正的到港時間之間 目前還在試 怎樣看起來比較自然
沒控制好 還是會出現船停在橋上的畫面 然後再觸發船送到橋旁邊 看起來會怪怪的
結論:依照古丁港口的船班時間 去判斷 L1GameTime 實際時間 就可以了
看看有沒有大大有興趣可以玩一下 >"<
    public void checkShipDock(L1PcInstance pc, int hour, int minute) {
      // 說話之島往古魯丁的船範圍
      if (pc.getMapId() == 5
            && pc.getX() >= 32704 && pc.getX() <= 32767
            && pc.getY() >= 32768 && pc.getY() <= 32831
            && pc.getInventory().checkItem(40299, 1)) {

            if (isGludinDockArrival(hour, minute)) {
                pc.getInventory().consumeItem(40299, 1);
                L1Teleport.teleport(pc, 32736, 32794, (short)6, 4, false);
                System.out.println(" 船到港,持票者自動傳送到古魯丁船艙");
            }
      }
    }

   
    private int lastTriggerHour = -1;

    private boolean isGludinDockArrival(final int hour, final int minute) {
      int[] dockHours = {0, 3, 6, 9, 12, 15, 18, 21};
      for (int dockHour : dockHours) {
            // 提前 3 分鐘觸發 (57~0 分之間都算)
            if (hour == dockHour && (minute >= 57 || minute == 0)) {
                if (lastTriggerHour != dockHour) {
                  lastTriggerHour = dockHour;
                  return true;
                }
            }
      }
      return false;
    }
-----------------------------------------------------------------
插入點在 L1GameTimeClock 裡 為了同步遊戲時間


                if (isFieldChanged(Calendar.MINUTE)) {
                        for (final L1GameTimeListener listener : _listeners) {
                              listener.onMinuteChanged(_currentTime);
                        }
//-------------------------------------------------------------------------------------
      

               
                        // 說話之島往古魯丁
                        if (isFieldChanged(Calendar.MINUTE)) {
                            // 直接抓遊戲時間物件
                            L1GameTime gameTime = L1GameTimeClock.getInstance().currentTime();

                            int hour = gameTime.get(Calendar.HOUR_OF_DAY);
                            int minute = gameTime.get(Calendar.MINUTE);

//                            // DEBUG:印出遊戲時間
//                            System.out.println(" 遊戲時間: " + String.format("%02d:%02d", hour, minute));

                            for (L1PcInstance pc : World.get().getAllPlayers()) {
                              DungeonManager.get().checkShipDock(pc, hour, minute);
                            }
                        }

p2255891 發表於 2026-1-1 09:40

感覺是船隻座標的問題.
因為你說"出現船停在橋上的畫面 然後再觸發船送到橋旁邊 "
我觀察過船會緩慢靠近港口,然後刷新在橋樑邊上.
可是試試設定船隻座標.

水龍 發表於 2026-1-1 10:05

1111111111111111111111111111111111111111111111111111
頁: [1]
查看完整版本: 關於船停靠港口的位置該怎麼修