Class LiveCharacterEditor
gui/)「角色詳情」頁的編輯即時套用到線上角色的工具。
GUI 的儲存端(server.gui.GuiApiServer.savePlayer)一律先把變更寫入資料庫;
但對正在線上的角色而言,記憶體中的 MapleCharacter 才是當前權威狀態——它會在玩家
登出/存檔時以 saveToDB 覆寫回資料庫,故若不同步更新記憶體,GUI 的修改會在玩家登出時被
舊值蓋掉。本類別負責把目標值寫入記憶體角色並刷新客戶端/地圖,達成「儲存即時生效」。
只套用有變更的欄位(以 old 與 e 兩份快照逐欄比對),不整列重寫、不假重登:
核心能力(等級/職業/四維/HP/MP/AP/SP/經驗/人氣)有變更時經 MapleCharacter.updateStats()
一次推送至能力面板;臉型/髮型有變更時以 MapleCharacter.updateSingleStat(MapleStat, int) 刷新並
MapleCharacter.equipChanged() 廣播外觀;楓幣有變更時送 MapleStat.MESO;地圖有變更才
MapleCharacter.changeMap(int)。
商城/MTS 情境(inCashShop):玩家在購物商城時不可送出頻道專用封包
(能力/外觀/換圖),否則商城客戶端會斷線。此時僅將變更寫入記憶體(離開商城存檔時持久化),
楓葉/樂豆點數變更則改以 MTSCSPacket.showNXMapleTokens(MapleCharacter)(CS_UPDATE)即時刷新餘額(達成「在商城內即時更新且不斷線」)。
本類別刻意置於 client 套件:除了使用 MapleCharacter 的公開設定子,亦需直接寫入
兩個 package-private 欄位——level 與 remainingSp[0];GUI 套件無法存取這些欄位。
執行緒:由 GUI 的 HTTP 執行緒呼叫,與「GM 指令對其他玩家施作」屬同一既有模式; 呼叫端應以 try/catch 包覆,刷新失敗不影響已完成的資料庫寫入。
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic final record角色詳情頁可即時套用的目標欄位快照(與server.gui.GuiApiServer的解析欄位對應)。 -
Method Summary
Modifier and TypeMethodDescriptionstatic voidapply(MapleCharacter chr, LiveCharacterEditor.Edit old, LiveCharacterEditor.Edit e, boolean refreshVisuals, boolean inCashShop) 將e(目標值)相對於old(套用前的現值)中有變更的欄位即時套用到線上角色: 先把變更欄位寫入記憶體(使其在下次存檔時持久化),再依情境刷新;未變更的欄位完全不動、不送封包。
-
Method Details
-
apply
public static void apply(MapleCharacter chr, LiveCharacterEditor.Edit old, LiveCharacterEditor.Edit e, boolean refreshVisuals, boolean inCashShop) 將e(目標值)相對於old(套用前的現值)中有變更的欄位即時套用到線上角色: 先把變更欄位寫入記憶體(使其在下次存檔時持久化),再依情境刷新;未變更的欄位完全不動、不送封包。職業若變更,會在設定前先
MapleCharacter.cancelAllBuffs()(舊職業 buff 不應殘留到新職業)。 樂豆/楓葉點數以「目標值減目前值」的增減量透過MapleCharacter.modifyCSPoints(int, int)達成。- Parameters:
chr- 目標線上角色(不可為null)old- 套用前的現值快照(用於逐欄比對出「有變更」者)e- 欲套用的目標欄位refreshVisuals- 是否在套用後刷新客戶端;呼叫端若緊接著要踢線(如封鎖)可傳false以略過刷新(踢線時的saveToDB仍會持久化已寫入記憶體的新值)inCashShop- 角色是否位於購物商城/MTS;為true時不送頻道封包(避免商城客戶端斷線), 僅在點數變更時以MTSCSPacket.getCSInfo(MapleClient)刷新餘額、地圖變更時設定返回地圖
-