Class CharacterLogManager
MapleCharacter。
本類別封裝對 bosslog(王挑戰每日次數)、onetimelog(一次性事件旗標)、
prizelog/aclog(領獎/成就領取閘門)、chronolog(時空石 30 天閘門)等
資料表的計數查詢與插入,這些紀錄被遊戲內容用來實作「每日/一次性」挑戰與領獎限制。
MapleCharacter 以**逐字搬移**的方式把這些方法移入此處,並對每個對外公開方法保留
**簽名完全相同**的委派(delegate),因此所有 Java 呼叫端與 ~2,700 支腳本完全不受影響。協作者僅
持有對所屬角色的回參考,沿用其角色 id/帳號 id(同 package 存取)與共用的 SLF4J logger
(MapleCharacter.log)。
-
Method Summary
Modifier and TypeMethodDescriptionint查詢帳號在過去 24 小時內領取指定成就的次數,用於每日成就領取閘門。intgetBossLog(String bossid) 查詢角色在過去 24 小時內挑戰指定王的次數,用於每日王挑戰次數閘門。intgetChronosphereLog(String chronoLog) 查詢角色在過去 30 天內使用指定時空石的次數,用於 30 天時空石閘門。intgetGiftLog(String bossid) 查詢帳號在過去 24 小時內的禮物(gift)領取次數,用於以帳號為單位的每日禮物閘門。int取得指定維度在當前週期內的計數。intgetLog(LogScope, ResetType, String)的字串便利重載;無法解析列舉時回傳0。intgetOneTimeLog(String log) 查詢角色是否已有指定一次性事件旗標,用於「一次性」事件閘門。intgetPrizeLog(String bossid) 查詢帳號是否已領取指定獎勵,用於以帳號為單位的領獎閘門。void為帳號寫入一筆成就領取紀錄。voidsetBossLog(String bossid) 為角色寫入一筆指定王的挑戰紀錄。voidsetChronosphereLog(String chronoLog) 為角色寫入一筆時空石使用紀錄。void對指定維度的計數+1(UPSERT)。void對指定維度的計數累加delta(UPSERT,會依resetType的日曆邊界自動重置)。voidsetLog(LogScope, ResetType, String)的字串便利重載。voidsetLog(LogScope, ResetType, String, int)的字串便利重載;無法解析列舉時靜默不作為。voidsetOneTimeLog(String log) 為角色寫入一筆一次性事件旗標。voidsetPrizeLog(String bossid) 為帳號寫入一筆領獎紀錄。
-
Method Details
-
getBossLog
查詢角色在過去 24 小時內挑戰指定王的次數,用於每日王挑戰次數閘門。對
bosslog資料表以characterid(角色 id)與bossid條件計數, 並以 SQLlastattempt >= subtime(current_timestamp, '1 0:0:0.0')限定為近一日內的紀錄。 透過DatabaseConnection取得當前執行緒共用的Connection執行唯讀查詢, 不會修改任何狀態;查詢過程中發生任何例外時靜默回傳-1。- Parameters:
bossid- 王的識別字串- Returns:
- 近 24 小時內的挑戰次數;查無紀錄或發生例外時回傳
-1
-
setBossLog
為角色寫入一筆指定王的挑戰紀錄。對
bosslog資料表插入一列(characterid=角色 id、bossid), 其lastattempt由資料表預設值帶入當前時間,藉此推進getBossLog(String)的每日計數。 經Db.update(String, Object...)執行寫入(僅關閉Statement,不關閉共用Connection); 發生例外時以MapleCharacter.log記錄 debug 並吞掉。- Parameters:
bossid- 王的識別字串
-
getOneTimeLog
查詢角色是否已有指定一次性事件旗標,用於「一次性」事件閘門。對
onetimelog資料表以characterid(角色 id)與log條件計數 (不含時間限制,故為永久旗標)。透過DatabaseConnection取得共用Connection執行唯讀查詢,不修改任何狀態;發生例外時靜默回傳-1。- Parameters:
log- 一次性事件的識別字串- Returns:
- 符合的紀錄筆數(
0表示尚未觸發、大於0表示已觸發);查無或例外時回傳-1
-
setOneTimeLog
為角色寫入一筆一次性事件旗標。對
onetimelog資料表插入一列(characterid=角色 id、log), 使getOneTimeLog(String)之後對同一旗標永久回傳大於0。 經Db.update(String, Object...)執行寫入(僅關閉Statement,不關閉共用Connection); 發生例外時以MapleCharacter.log記錄 debug 並吞掉。注意:參數名
log與類別共用 logger 同名,方法內部記錄一律以MapleCharacter.log限定。- Parameters:
log- 一次性事件的識別字串
-
setPrizeLog
為帳號寫入一筆領獎紀錄。對
prizelog資料表插入一列(accid=帳號 id、bossid), 推進getPrizeLog(String)的領取計數。注意此閘門以**帳號**為單位 (取自chr.getClient().getAccID()),而非角色。 經Db.update(String, Object...)執行寫入(僅關閉Statement,不關閉共用Connection); 發生例外時以MapleCharacter.log記錄 debug 並吞掉。- Parameters:
bossid- 領獎來源(王/事件)的識別字串
-
getPrizeLog
查詢帳號是否已領取指定獎勵,用於以帳號為單位的領獎閘門。對
prizelog資料表以accid(帳號 id,取自chr.getClient().getAccID()) 與bossid條件計數(不含時間限制,故為永久領取旗標)。透過DatabaseConnection取得共用Connection執行唯讀查詢,不修改任何狀態;發生例外時靜默回傳-1。- Parameters:
bossid- 領獎來源(王/事件)的識別字串- Returns:
- 符合的紀錄筆數(大於
0表示已領取);查無或例外時回傳-1
-
setAcLog
為帳號寫入一筆成就領取紀錄。對
aclog資料表插入一列(accid=帳號 id、bossid), 其lastattempt由資料表預設值帶入當前時間,推進getAcLog(String)的每日成就閘門。 此閘門以**帳號**為單位(取自chr.getClient().getAccID())。 經Db.update(String, Object...)執行寫入(僅關閉Statement,不關閉共用Connection); 發生例外時以MapleCharacter.log記錄 debug 並吞掉。- Parameters:
bossid- 成就來源的識別字串
-
getAcLog
查詢帳號在過去 24 小時內領取指定成就的次數,用於每日成就領取閘門。對
aclog資料表以accid(帳號 id,取自chr.getClient().getAccID()) 與bossid條件計數,並以 SQLlastattempt >= subtime(current_timestamp, '1 0:0:0.0')限定為近一日內的紀錄。透過DatabaseConnection取得共用Connection執行唯讀查詢, 不修改任何狀態;發生例外時靜默回傳-1。- Parameters:
bossid- 成就來源的識別字串- Returns:
- 近 24 小時內的領取次數;查無或例外時回傳
-1
-
getGiftLog
查詢帳號在過去 24 小時內的禮物(gift)領取次數,用於以帳號為單位的每日禮物閘門。對
bosslog資料表以accountid(帳號 id,取自chr.accountid) 與bossid條件計數,並以 SQLlastattempt >= subtime(current_timestamp, '1 0:0:0.0')限定為近一日內的紀錄。透過DatabaseConnection取得共用Connection執行唯讀查詢, 不修改任何狀態;發生例外時靜默回傳-1。注意:本方法與
getBossLog(String)查詢**同一張**bosslog資料表,但比對的是accountid欄位(帳號層級),而getBossLog(String)比對的是characterid欄位(角色層級)。- Parameters:
bossid- 禮物來源(王/事件)的識別字串- Returns:
- 近 24 小時內的領取次數;查無或例外時回傳
-1
-
getChronosphereLog
查詢角色在過去 30 天內使用指定時空石的次數,用於 30 天時空石閘門。對
chronolog資料表以characterid(角色 id)與chronid條件計數, 並以 SQLlastattempt >= subtime(current_timestamp, '30 0:0:0.0')限定為近 30 日內的紀錄。 透過DatabaseConnection取得共用Connection執行唯讀查詢,不修改任何狀態; 發生例外時靜默回傳-1。- Parameters:
chronoLog- 時空石的識別字串(對應資料表chronid欄位)- Returns:
- 近 30 天內的使用次數;查無或例外時回傳
-1
-
setChronosphereLog
為角色寫入一筆時空石使用紀錄。對
chronolog資料表插入一列(characterid=角色 id、chronid), 其lastattempt由資料表預設值帶入當前時間,推進getChronosphereLog(String)的 30 天閘門。 經Db.update(String, Object...)執行寫入(僅關閉Statement,不關閉共用Connection); 發生例外時以MapleCharacter.log記錄 debug 並吞掉。- Parameters:
chronoLog- 時空石的識別字串(對應資料表chronid欄位)
-
setLog
- Parameters:
scope- 範圍維度(角色/帳號)resetType- 重置週期維度(日/週/月/永久)eventName- 事件名稱(識別字)
-
setLog
對指定維度的計數累加delta(UPSERT,會依resetType的日曆邊界自動重置)。以
(acc_id, char_id, scope, reset_type, event_name)唯一鍵 UPSERT 到_acc_char_log: 不存在則插入(初值delta);已存在則依該列last_update是否仍落在當前週期內,決定 累加(count + delta)或就地重置(跨週期後第一次寫入 → 直接設為delta)。last_update一律設為NOW()。SQL 賦值順序攸關正確性:
count = IF(...)必須排在last_update = NOW()之前,使IF內讀到的是更新前的last_update;若顛倒,比較對象會變成 剛寫入的NOW()(恆 ≥ 週期起點)導致永遠累加、重置失效。採 MySQL 8.0.19+ 的列別名 UPSERT 語法(
VALUES ... AS v),避免已棄用的VALUES()。 經Db.update(String, Object...)執行(僅關閉Statement,不關閉共用Connection);發生例外時記錄 debug 並吞掉。- Parameters:
scope- 範圍維度;LogScope.ACC時char_id填哨兵0,LogScope.CHAR時填角色 idresetType- 重置週期維度(日/週/月/永久)eventName- 事件名稱(識別字)delta- 累加量(可為負值;通常為正)
-
getLog
取得指定維度在當前週期內的計數。查詢
_acc_char_log對應唯一鍵的計數,並加上last_update >= 當前週期起點的條件: 若該列不存在、或其last_update已落在上一個週期(即已過期、尚未被下一次寫入就地重置), 一律回傳0。透過DatabaseConnection取得共用Connection執行唯讀查詢, 不修改任何狀態;發生例外時記錄 debug 並回傳0。- Parameters:
scope- 範圍維度(角色/帳號)resetType- 重置週期維度(日/週/月/永久)eventName- 事件名稱(識別字)- Returns:
- 當前週期內的計數;查無、已過期或發生例外時回傳
0
-
setLog
setLog(LogScope, ResetType, String)的字串便利重載。scope/resetType以列舉名稱字串帶入(大小寫不拘,如"CHAR"、"day");無法解析時靜默不作為。- Parameters:
scope- 範圍維度字串("CHAR"/"ACC")resetType- 重置週期字串("DAY"/"WEEK"/"MON"/"NEVER")eventName- 事件名稱(識別字)
-
setLog
setLog(LogScope, ResetType, String, int)的字串便利重載;無法解析列舉時靜默不作為。- Parameters:
scope- 範圍維度字串("CHAR"/"ACC")resetType- 重置週期字串("DAY"/"WEEK"/"MON"/"NEVER")eventName- 事件名稱(識別字)delta- 累加量
-
getLog
getLog(LogScope, ResetType, String)的字串便利重載;無法解析列舉時回傳0。- Parameters:
scope- 範圍維度字串("CHAR"/"ACC")resetType- 重置週期字串("DAY"/"WEEK"/"MON"/"NEVER")eventName- 事件名稱(識別字)- Returns:
- 當前週期內的計數;無法解析、查無、已過期或例外時回傳
0
-